Annotation of embedaddon/quagga/tests/bgp_capability_test.c, revision 1.1

1.1     ! misho       1: #include <zebra.h>
        !             2: 
        !             3: #include "vty.h"
        !             4: #include "stream.h"
        !             5: #include "privs.h"
        !             6: #include "memory.h"
        !             7: 
        !             8: #include "bgpd/bgpd.h"
        !             9: #include "bgpd/bgp_open.h"
        !            10: #include "bgpd/bgp_debug.h"
        !            11: 
        !            12: #define VT100_RESET "\x1b[0m"
        !            13: #define VT100_RED "\x1b[31m"
        !            14: #define VT100_GREEN "\x1b[32m"
        !            15: #define VT100_YELLOW "\x1b[33m"
        !            16: 
        !            17: 
        !            18: #define CAPABILITY 0
        !            19: #define DYNCAP     1
        !            20: #define OPT_PARAM  2
        !            21: 
        !            22: /* need these to link in libbgp */
        !            23: struct zebra_privs_t *bgpd_privs = NULL;
        !            24: struct thread_master *master = NULL;
        !            25: 
        !            26: static int failed = 0;
        !            27: static int tty = 0;
        !            28: 
        !            29: /* test segments to parse and validate, and use for other tests */
        !            30: static struct test_segment {
        !            31:   const char *name;
        !            32:   const char *desc;
        !            33:   const u_char data[1024];
        !            34:   int len;
        !            35: #define SHOULD_PARSE   0
        !            36: #define SHOULD_ERR     -1
        !            37:   int parses; /* whether it should parse or not */
        !            38:   int peek_for; /* what peek_for_as4_capability should say */
        !            39:   
        !            40:   /* AFI/SAFI validation */
        !            41:   int validate_afi;
        !            42:   afi_t afi;
        !            43:   safi_t safi;
        !            44: #define VALID_AFI 1
        !            45: #define INVALID_AFI 0
        !            46:   int afi_valid;
        !            47: } test_segments [] = 
        !            48: {
        !            49:   /* 0 */
        !            50:   { "caphdr", 
        !            51:     "capability header, and no more",
        !            52:     { CAPABILITY_CODE_REFRESH, 0x0 },
        !            53:     2, SHOULD_PARSE,
        !            54:   },
        !            55:   /* 1 */
        !            56:   { "nodata",
        !            57:     "header, no data but length says there is",
        !            58:     { 0x1, 0xa },
        !            59:     2, SHOULD_ERR,
        !            60:   },
        !            61:   /* 2 */
        !            62:   { "padded",
        !            63:     "valid, with padding",
        !            64:     { CAPABILITY_CODE_REFRESH, 0x2, 0x0, 0x0 },
        !            65:     4, SHOULD_PARSE,
        !            66:   },
        !            67:   /* 3 */
        !            68:   { "minsize",
        !            69:     "violates minsize requirement",
        !            70:     { CAPABILITY_CODE_ORF, 0x2, 0x0, 0x0 },
        !            71:     4, SHOULD_ERR,
        !            72:   },
        !            73:   { NULL, NULL, {0}, 0, 0},
        !            74: };
        !            75: 
        !            76: static struct test_segment mp_segments[] =
        !            77: {
        !            78:   { "MP4",
        !            79:     "MP IP/Uni",
        !            80:     { 0x1, 0x4, 0x0, 0x1, 0x0, 0x1 },
        !            81:     6, SHOULD_PARSE, 0,
        !            82:     1, AFI_IP, SAFI_UNICAST, VALID_AFI,
        !            83:   },
        !            84:   { "MPv6",
        !            85:     "MP IPv6/Uni",
        !            86:     { 0x1, 0x4, 0x0, 0x2, 0x0, 0x1 },
        !            87:     6, SHOULD_PARSE, 0,
        !            88:     1, AFI_IP6, SAFI_UNICAST, VALID_AFI,
        !            89:   },
        !            90:   /* 5 */
        !            91:   { "MP2",
        !            92:     "MP IP/Multicast",
        !            93:     { CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x2 },
        !            94:     6, SHOULD_PARSE, 0,
        !            95:     1, AFI_IP, SAFI_MULTICAST, VALID_AFI,
        !            96:   },
        !            97:   /* 6 */
        !            98:   { "MP3",
        !            99:     "MP IP6/VPNv4",
        !           100:     { CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x80 },
        !           101:     6, SHOULD_PARSE, 0, /* parses, but invalid afi,safi */
        !           102:     1, AFI_IP6, BGP_SAFI_VPNV4, INVALID_AFI,
        !           103:   },
        !           104:   /* 7 */
        !           105:   { "MP5",
        !           106:     "MP IP6/MPLS-VPN",
        !           107:     { CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x4 },
        !           108:     6, SHOULD_PARSE, 0,
        !           109:     1, AFI_IP6, SAFI_MPLS_VPN, VALID_AFI,
        !           110:   },
        !           111:   /* 8 */
        !           112:   { "MP6",
        !           113:     "MP IP4/VPNv4",
        !           114:     { CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x80 },
        !           115:     6, SHOULD_PARSE, 0,
        !           116:     1, AFI_IP, BGP_SAFI_VPNV4, VALID_AFI,
        !           117:   },  
        !           118:   /* 9 */
        !           119:   { "MP7",
        !           120:     "MP IP4/VPNv6",
        !           121:     { CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x81 },
        !           122:     6, SHOULD_PARSE, 0, /* parses, but invalid afi,safi tuple */
        !           123:     1, AFI_IP, BGP_SAFI_VPNV6, INVALID_AFI,
        !           124:   },
        !           125:   /* 10 */
        !           126:   { "MP8",
        !           127:     "MP unknown AFI",
        !           128:     { CAPABILITY_CODE_MP, 0x4, 0x0, 0xa, 0x0, 0x81 },
        !           129:     6, SHOULD_PARSE, 0,
        !           130:     1, 0xa, 0x81, INVALID_AFI, /* parses, but unknown */
        !           131:   },
        !           132:   /* 11 */
        !           133:   { "MP-short",
        !           134:     "MP IP4/Unicast, length too short (< minimum)",
        !           135:     { CAPABILITY_CODE_MP, 0x2, 0x0, 0x1, 0x0, 0x1 },
        !           136:     6, SHOULD_ERR,
        !           137:   },
        !           138:   /* 12 */
        !           139:   { "MP-overflow",
        !           140:     "MP IP4/Unicast, length too long",
        !           141:     { CAPABILITY_CODE_MP, 0x6, 0x0, 0x1, 0x0, 0x1 },
        !           142:     6, SHOULD_ERR, 0,
        !           143:     1, AFI_IP, SAFI_UNICAST, VALID_AFI,
        !           144:   },
        !           145:   { NULL, NULL, {0}, 0, 0}
        !           146: };
        !           147: 
        !           148: static struct test_segment misc_segments[] =
        !           149: {
        !           150:   /* 13 */
        !           151:   { "ORF",
        !           152:     "ORF, simple, single entry, single tuple",
        !           153:     { /* hdr */                CAPABILITY_CODE_ORF, 0x7, 
        !           154:       /* mpc */                0x0, 0x1, 0x0, 0x1, 
        !           155:       /* num */                0x1, 
        !           156:       /* tuples */     0x40, 0x3
        !           157:     },
        !           158:     9, SHOULD_PARSE,
        !           159:   },
        !           160:   /* 14 */
        !           161:   { "ORF-many",
        !           162:     "ORF, multi entry/tuple",
        !           163:     { /* hdr */                CAPABILITY_CODE_ORF, 0x21,
        !           164:       /* mpc */                0x0, 0x1, 0x0, 0x1, 
        !           165:       /* num */                0x3, 
        !           166:       /* tuples */     0x40, ORF_MODE_BOTH,
        !           167:                         0x80, ORF_MODE_RECEIVE,
        !           168:                         0x80, ORF_MODE_SEND,
        !           169:       /* mpc */                0x0, 0x2, 0x0, 0x1, 
        !           170:       /* num */                0x3, 
        !           171:       /* tuples */     0x40, ORF_MODE_BOTH,
        !           172:                         0x80, ORF_MODE_RECEIVE,
        !           173:                         0x80, ORF_MODE_SEND,
        !           174:       /* mpc */                0x0, 0x2, 0x0, 0x2,
        !           175:       /* num */                0x3, 
        !           176:       /* tuples */     0x40, ORF_MODE_RECEIVE,
        !           177:                         0x80, ORF_MODE_SEND,
        !           178:                         0x80, ORF_MODE_BOTH,
        !           179:     },
        !           180:     35, SHOULD_PARSE,
        !           181:   },
        !           182:   /* 15 */
        !           183:   { "ORFlo",
        !           184:     "ORF, multi entry/tuple, hdr length too short",
        !           185:     { /* hdr */                CAPABILITY_CODE_ORF, 0x15,
        !           186:       /* mpc */                0x0, 0x1, 0x0, 0x1, 
        !           187:       /* num */                0x3, 
        !           188:       /* tuples */     0x40, 0x3,
        !           189:                         0x80, 0x1,
        !           190:                         0x80, 0x2,
        !           191:       /* mpc */                0x0, 0x1, 0x0, 0x1, 
        !           192:       /* num */                0x3, 
        !           193:       /* tuples */     0x40, 0x3,
        !           194:                         0x80, 0x1,
        !           195:                         0x80, 0x2,
        !           196:       /* mpc */                0x0, 0x2, 0x0, 0x2,
        !           197:       /* num */                0x3, 
        !           198:       /* tuples */     0x40, 0x3,
        !           199:                         0x80, 0x1,
        !           200:                         0x80, 0x2,
        !           201:     },
        !           202:     35, SHOULD_ERR, /* It should error on invalid Route-Refresh.. */
        !           203:   },
        !           204:   /* 16 */
        !           205:   { "ORFlu",
        !           206:     "ORF, multi entry/tuple, length too long",
        !           207:     { /* hdr */                0x3, 0x22,
        !           208:       /* mpc */                0x0, 0x1, 0x0, 0x1, 
        !           209:       /* num */                0x3, 
        !           210:       /* tuples */     0x40, 0x3,
        !           211:                         0x80, 0x1,
        !           212:                         0x80, 0x2,
        !           213:       /* mpc */                0x0, 0x2, 0x0, 0x1, 
        !           214:       /* num */                0x3, 
        !           215:       /* tuples */     0x40, 0x3,
        !           216:                         0x80, 0x1,
        !           217:                         0x80, 0x2,
        !           218:       /* mpc */                0x0, 0x2, 0x0, 0x2,
        !           219:       /* num */                0x3, 
        !           220:       /* tuples */     0x40, 0x3,
        !           221:                         0x80, 0x1,
        !           222:                         0x80, 0x2,
        !           223:     },
        !           224:     35, SHOULD_ERR
        !           225:   },
        !           226:   /* 17 */
        !           227:   { "ORFnu",
        !           228:     "ORF, multi entry/tuple, entry number too long",
        !           229:     { /* hdr */                0x3, 0x21,
        !           230:       /* mpc */                0x0, 0x1, 0x0, 0x1, 
        !           231:       /* num */                0x3, 
        !           232:       /* tuples */     0x40, 0x3,
        !           233:                         0x80, 0x1,
        !           234:                         0x80, 0x2,
        !           235:       /* mpc */                0x0, 0x2, 0x0, 0x1, 
        !           236:       /* num */                0x4, 
        !           237:       /* tuples */     0x40, 0x3,
        !           238:                         0x80, 0x1,
        !           239:                         0x80, 0x2,
        !           240:       /* mpc */                0x0, 0x2, 0x0, 0x2,
        !           241:       /* num */                0x3, 
        !           242:       /* tuples */     0x40, 0x3,
        !           243:                         0x80, 0x1,
        !           244:                         0x80, 0x2,
        !           245:     },
        !           246:     35, SHOULD_PARSE, /* parses, but last few tuples should be gibberish */
        !           247:   },
        !           248:   /* 18 */
        !           249:   { "ORFno",
        !           250:     "ORF, multi entry/tuple, entry number too short",
        !           251:     { /* hdr */                0x3, 0x21,
        !           252:       /* mpc */                0x0, 0x1, 0x0, 0x1, 
        !           253:       /* num */                0x3, 
        !           254:       /* tuples */     0x40, 0x3,
        !           255:                         0x80, 0x1,
        !           256:                         0x80, 0x2,
        !           257:       /* mpc */                0x0, 0x2, 0x0, 0x1, 
        !           258:       /* num */                0x1, 
        !           259:       /* tuples */     0x40, 0x3,
        !           260:                         0x80, 0x1,
        !           261:                         0x80, 0x2,
        !           262:       /* mpc */                0x0, 0x2, 0x0, 0x2,
        !           263:       /* num */                0x3,
        !           264:       /* tuples */     0x40, 0x3,
        !           265:                         0x80, 0x1,
        !           266:                         0x80, 0x2,
        !           267:     },
        !           268:     35, SHOULD_PARSE, /* Parses, but should get gibberish afi/safis */
        !           269:   },
        !           270:   /* 17 */
        !           271:   { "ORFpad",
        !           272:     "ORF, multi entry/tuple, padded to align",
        !           273:     { /* hdr */                0x3, 0x22,
        !           274:       /* mpc */                0x0, 0x1, 0x0, 0x1, 
        !           275:       /* num */                0x3, 
        !           276:       /* tuples */     0x40, 0x3,
        !           277:                         0x80, 0x1,
        !           278:                         0x80, 0x2,
        !           279:       /* mpc */                0x0, 0x2, 0x0, 0x1, 
        !           280:       /* num */                0x3, 
        !           281:       /* tuples */     0x40, 0x3,
        !           282:                         0x80, 0x1,
        !           283:                         0x80, 0x2,
        !           284:       /* mpc */                0x0, 0x2, 0x0, 0x2,
        !           285:       /* num */                0x3, 
        !           286:       /* tuples */     0x40, 0x3,
        !           287:                         0x80, 0x1,
        !           288:                         0x80, 0x2,
        !           289:                         0x00,
        !           290:     },
        !           291:     36, SHOULD_PARSE,
        !           292:   },
        !           293:   /* 19 */
        !           294:   { "AS4",
        !           295:     "AS4 capability",
        !           296:     { 0x41, 0x4, 0xab, 0xcd, 0xef, 0x12 }, /* AS: 2882400018 */
        !           297:     6, SHOULD_PARSE, 2882400018,
        !           298:   },
        !           299:   /* 20 */
        !           300:   { "GR",
        !           301:     "GR capability",
        !           302:     { /* hdr */                CAPABILITY_CODE_RESTART, 0xe,
        !           303:       /* R-bit, time */        0xf1, 0x12,
        !           304:       /* afi */                0x0, 0x1,
        !           305:       /* safi */       0x1,
        !           306:       /* flags */      0xf,
        !           307:       /* afi */                0x0, 0x2,
        !           308:       /* safi */       0x1,
        !           309:       /* flags */      0x0,
        !           310:       /* afi */                0x0, 0x2,
        !           311:       /* safi */       0x2,
        !           312:       /* flags */      0x1,
        !           313:     },
        !           314:     16, SHOULD_PARSE,
        !           315:   },
        !           316:   /* 21 */
        !           317:   { "GR-short",
        !           318:     "GR capability, but header length too short",
        !           319:     { /* hdr */                0x40, 0xa,
        !           320:       /* R-bit, time */        0xf1, 0x12,
        !           321:       /* afi */                0x0, 0x1,
        !           322:       /* safi */       0x1,
        !           323:       /* flags */      0xf,
        !           324:       /* afi */                0x0, 0x2,
        !           325:       /* safi */       0x1,
        !           326:       /* flags */      0x0,
        !           327:       /* afi */                0x0, 0x2,
        !           328:       /* safi */       0x2,
        !           329:       /* flags */      0x1,
        !           330:     },
        !           331:     16, SHOULD_PARSE,
        !           332:   },
        !           333:   /* 22 */
        !           334:   { "GR-long",
        !           335:     "GR capability, but header length too long",
        !           336:     { /* hdr */                0x40, 0xf,
        !           337:       /* R-bit, time */        0xf1, 0x12,
        !           338:       /* afi */                0x0, 0x1,
        !           339:       /* safi */       0x1,
        !           340:       /* flags */      0xf,
        !           341:       /* afi */                0x0, 0x2,
        !           342:       /* safi */       0x1,
        !           343:       /* flags */      0x0,
        !           344:       /* afi */                0x0, 0x2,
        !           345:       /* safi */       0x2,
        !           346:     },
        !           347:     16, SHOULD_ERR,
        !           348:   },
        !           349:   { "GR-trunc",
        !           350:     "GR capability, but truncated",
        !           351:     { /* hdr */                0x40, 0xf,
        !           352:       /* R-bit, time */        0xf1, 0x12,
        !           353:       /* afi */                0x0, 0x1,
        !           354:       /* safi */       0x1,
        !           355:       /* flags */      0xf,
        !           356:       /* afi */                0x0, 0x2,
        !           357:       /* safi */       0x1,
        !           358:       /* flags */      0x0,
        !           359:       /* afi */                0x0, 0x2,
        !           360:       /* safi */       0x2,
        !           361:       /* flags */      0x1,
        !           362:     },
        !           363:     15, SHOULD_ERR,
        !           364:   },
        !           365:   { "GR-empty",
        !           366:     "GR capability, but empty.",
        !           367:     { /* hdr */                0x40, 0x0,
        !           368:     },
        !           369:     2, SHOULD_ERR,
        !           370:   },
        !           371:   { "MP-empty",
        !           372:     "MP capability, but empty.",
        !           373:     { /* hdr */                0x1, 0x0,
        !           374:     },
        !           375:     2, SHOULD_ERR,
        !           376:   },
        !           377:   { "ORF-empty",
        !           378:     "ORF capability, but empty.",
        !           379:     { /* hdr */                0x3, 0x0,
        !           380:     },
        !           381:     2, SHOULD_ERR,
        !           382:   },
        !           383:   { "AS4-empty",
        !           384:     "AS4 capability, but empty.",
        !           385:     { /* hdr */                0x41, 0x0,
        !           386:     },
        !           387:     2, SHOULD_ERR,
        !           388:   },
        !           389:   { "dyn-empty",
        !           390:     "Dynamic capability, but empty.",
        !           391:     { /* hdr */                0x42, 0x0,
        !           392:     },
        !           393:     2, SHOULD_PARSE,
        !           394:   },
        !           395:   { "dyn-old",
        !           396:     "Dynamic capability (deprecated version)",
        !           397:     { CAPABILITY_CODE_DYNAMIC, 0x0 },
        !           398:     2, SHOULD_PARSE,
        !           399:   },
        !           400:   { NULL, NULL, {0}, 0, 0}
        !           401: };
        !           402: 
        !           403: /* DYNAMIC message */
        !           404: struct test_segment dynamic_cap_msgs[] = 
        !           405: {
        !           406:   { "DynCap",
        !           407:     "Dynamic Capability Message, IP/Multicast",
        !           408:     { 0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2 },
        !           409:       7, SHOULD_PARSE, /* horrible alignment, just as with ORF */
        !           410:   },
        !           411:   { "DynCapLong",
        !           412:     "Dynamic Capability Message, IP/Multicast, truncated",
        !           413:     { 0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2 },
        !           414:       5, SHOULD_ERR,
        !           415:   },
        !           416:   { "DynCapPadded",
        !           417:     "Dynamic Capability Message, IP/Multicast, padded",
        !           418:     { 0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2, 0x0 },
        !           419:       8, SHOULD_ERR, /* No way to tell padding from data.. */
        !           420:   },
        !           421:   { "DynCapMPCpadded",
        !           422:     "Dynamic Capability Message, IP/Multicast, cap data padded",
        !           423:     { 0x0, 0x1, 0x5, 0x0, 0x1, 0x0, 0x2, 0x0 },
        !           424:       8, SHOULD_PARSE, /* You can though add padding to the capability data */
        !           425:   },
        !           426:   { "DynCapMPCoverflow",
        !           427:     "Dynamic Capability Message, IP/Multicast, cap data != length",
        !           428:     { 0x0, 0x1, 0x3, 0x0, 0x1, 0x0, 0x2, 0x0 },
        !           429:       8, SHOULD_ERR,
        !           430:   },
        !           431:   { NULL, NULL, {0}, 0, 0}
        !           432: };
        !           433: 
        !           434: /* Entire Optional-Parameters block */
        !           435: struct test_segment opt_params[] =
        !           436: {
        !           437:   { "Cap-singlets",
        !           438:     "One capability per Optional-Param",
        !           439:     { 0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
        !           440:       0x02, 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
        !           441:       0x02, 0x02, 0x80, 0x00, /* RR (old) */
        !           442:       0x02, 0x02, 0x02, 0x00, /* RR */  
        !           443:     },
        !           444:     24, SHOULD_PARSE,
        !           445:   },
        !           446:   { "Cap-series",
        !           447:     "Series of capability, one Optional-Param",
        !           448:     { 0x02, 0x10,
        !           449:       0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
        !           450:       0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
        !           451:       0x80, 0x00, /* RR (old) */
        !           452:       0x02, 0x00, /* RR */  
        !           453:     },
        !           454:     18, SHOULD_PARSE,
        !           455:   },
        !           456:   { "AS4more",
        !           457:     "AS4 capability after other caps (singlets)",
        !           458:     { 0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
        !           459:       0x02, 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
        !           460:       0x02, 0x02, 0x80, 0x00, /* RR (old) */
        !           461:       0x02, 0x02, 0x02, 0x00, /* RR */
        !           462:       0x02, 0x06, 0x41, 0x04, 0x00, 0x03, 0x00, 0x06  /* AS4: 1996614 */
        !           463:     },
        !           464:     32, SHOULD_PARSE, 196614,
        !           465:   },
        !           466:   { "AS4series",
        !           467:     "AS4 capability, in series of capabilities",
        !           468:     { 0x02, 0x16,
        !           469:       0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
        !           470:       0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
        !           471:       0x80, 0x00, /* RR (old) */
        !           472:       0x02, 0x00, /* RR */  
        !           473:       0x41, 0x04, 0x00, 0x03, 0x00, 0x06  /* AS4: 1996614 */
        !           474:     },
        !           475:     24, SHOULD_PARSE, 196614,
        !           476:   },
        !           477:   { "AS4real",
        !           478:     "AS4 capability, in series of capabilities",
        !           479:     {
        !           480:       0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/uni */
        !           481:       0x02, 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/uni */
        !           482:       0x02, 0x02, 0x80, 0x00, /* RR old */
        !           483:       0x02, 0x02, 0x02, 0x00, /* RR */
        !           484:       0x02, 0x06, 0x41, 0x04, 0x00, 0x03, 0x00, 0x06, /* AS4 */
        !           485:     },
        !           486:     32, SHOULD_PARSE, 196614,
        !           487:   },
        !           488:   { "AS4real2",
        !           489:     "AS4 capability, in series of capabilities",
        !           490:     {
        !           491:       0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01,
        !           492:       0x02, 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01,
        !           493:       0x02, 0x02, 0x80, 0x00,
        !           494:       0x02, 0x02, 0x02, 0x00,
        !           495:       0x02, 0x06, 0x41, 0x04, 0x00, 0x00, 0xfc, 0x03,
        !           496:       0x02, 0x09, 0x82, 0x07, 0x00, 0x01, 0x00, 0x01, 0x01, 0x80, 0x03,
        !           497:       0x02, 0x09, 0x03, 0x07, 0x00, 0x01, 0x00, 0x01, 0x01, 0x40, 0x03,
        !           498:       0x02, 0x02, 0x42, 0x00,
        !           499:     },
        !           500:     58, SHOULD_PARSE, 64515,
        !           501:   },
        !           502: 
        !           503:   { NULL, NULL, {0}, 0, 0}
        !           504: };
        !           505: 
        !           506: /* basic parsing test */
        !           507: static void
        !           508: parse_test (struct peer *peer, struct test_segment *t, int type)
        !           509: {
        !           510:   int ret;
        !           511:   int capability = 0;
        !           512:   as_t as4 = 0;
        !           513:   int oldfailed = failed;
        !           514:   int len = t->len;
        !           515: #define RANDOM_FUZZ 35
        !           516:   
        !           517:   stream_reset (peer->ibuf);
        !           518:   stream_put (peer->ibuf, NULL, RANDOM_FUZZ);
        !           519:   stream_set_getp (peer->ibuf, RANDOM_FUZZ);
        !           520:   
        !           521:   switch (type)
        !           522:     {
        !           523:       case CAPABILITY:
        !           524:         stream_putc (peer->ibuf, BGP_OPEN_OPT_CAP);
        !           525:         stream_putc (peer->ibuf, t->len);
        !           526:         break;
        !           527:       case DYNCAP:
        !           528: /*        for (i = 0; i < BGP_MARKER_SIZE; i++)
        !           529:           stream_putc (peer->, 0xff);
        !           530:         stream_putw (s, 0);
        !           531:         stream_putc (s, BGP_MSG_CAPABILITY);*/
        !           532:         break;
        !           533:     }
        !           534:   stream_write (peer->ibuf, t->data, t->len);
        !           535:   
        !           536:   printf ("%s: %s\n", t->name, t->desc);
        !           537: 
        !           538:   switch (type)
        !           539:     {
        !           540:       case CAPABILITY:
        !           541:         len += 2; /* to cover the OPT-Param header */
        !           542:       case OPT_PARAM:
        !           543:         printf ("len: %u\n", len);
        !           544:         /* peek_for_as4 wants getp at capibility*/
        !           545:         as4 = peek_for_as4_capability (peer, len);
        !           546:         printf ("peek_for_as4: as4 is %u\n", as4);
        !           547:         /* and it should leave getp as it found it */
        !           548:         assert (stream_get_getp (peer->ibuf) == RANDOM_FUZZ);
        !           549:         
        !           550:         ret = bgp_open_option_parse (peer, len, &capability);
        !           551:         break;
        !           552:       case DYNCAP:
        !           553:         ret = bgp_capability_receive (peer, t->len);
        !           554:         break;
        !           555:       default:
        !           556:         printf ("unknown type %u\n", type);
        !           557:         exit(1);
        !           558:     }
        !           559:   
        !           560:   if (!ret && t->validate_afi)
        !           561:     {
        !           562:       safi_t safi = t->safi;
        !           563:       
        !           564:       if (bgp_afi_safi_valid_indices (t->afi, &safi) != t->afi_valid)
        !           565:         failed++;
        !           566:       
        !           567:       printf ("MP: %u/%u (%u): recv %u, nego %u\n",
        !           568:               t->afi, t->safi, safi,
        !           569:               peer->afc_recv[t->afi][safi],
        !           570:               peer->afc_nego[t->afi][safi]);
        !           571:         
        !           572:       if (t->afi_valid == VALID_AFI)
        !           573:         {
        !           574:         
        !           575:           if (!peer->afc_recv[t->afi][safi])
        !           576:             failed++;
        !           577:           if (!peer->afc_nego[t->afi][safi])
        !           578:             failed++;
        !           579:         }
        !           580:     }
        !           581:   
        !           582:   if (as4 != t->peek_for)
        !           583:     {
        !           584:       printf ("as4 %u != %u\n", as4, t->peek_for);
        !           585:       failed++;
        !           586:     }
        !           587:   
        !           588:   printf ("parsed?: %s\n", ret ? "no" : "yes");
        !           589:   
        !           590:   if (ret != t->parses)
        !           591:     failed++;
        !           592:   
        !           593:   if (tty)
        !           594:     printf ("%s", (failed > oldfailed) ? VT100_RED "failed!" VT100_RESET 
        !           595:                                          : VT100_GREEN "OK" VT100_RESET);
        !           596:   else
        !           597:     printf ("%s", (failed > oldfailed) ? "failed!" : "OK" );
        !           598:   
        !           599:   if (failed)
        !           600:     printf (" (%u)", failed);
        !           601:   
        !           602:   printf ("\n\n");
        !           603: }
        !           604: 
        !           605: static struct bgp *bgp;
        !           606: static as_t asn = 100;
        !           607: 
        !           608: int
        !           609: main (void)
        !           610: {
        !           611:   struct peer *peer;
        !           612:   int i, j;
        !           613:   
        !           614:   conf_bgp_debug_fsm = -1UL;
        !           615:   conf_bgp_debug_events = -1UL;
        !           616:   conf_bgp_debug_packet = -1UL;
        !           617:   conf_bgp_debug_normal = -1UL;
        !           618:   conf_bgp_debug_as4 = -1UL;
        !           619:   term_bgp_debug_fsm = -1UL;
        !           620:   term_bgp_debug_events = -1UL;
        !           621:   term_bgp_debug_packet = -1UL;
        !           622:   term_bgp_debug_normal = -1UL;
        !           623:   term_bgp_debug_as4 = -1UL;
        !           624:   
        !           625:   master = thread_master_create ();
        !           626:   bgp_master_init ();
        !           627:   
        !           628:   if (fileno (stdout) >= 0) 
        !           629:     tty = isatty (fileno (stdout));
        !           630:   
        !           631:   if (bgp_get (&bgp, &asn, NULL))
        !           632:     return -1;
        !           633:   
        !           634:   peer = peer_create_accept (bgp);
        !           635:   peer->host = "foo";
        !           636:   
        !           637:   for (i = AFI_IP; i < AFI_MAX; i++)
        !           638:     for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
        !           639:       {
        !           640:         peer->afc[i][j] = 1;
        !           641:         peer->afc_adv[i][j] = 1;
        !           642:       }
        !           643:   
        !           644:   i = 0;
        !           645:   while (mp_segments[i].name)
        !           646:     parse_test (peer, &mp_segments[i++], CAPABILITY);
        !           647: 
        !           648:   /* These tests assume mp_segments tests set at least
        !           649:    * one of the afc_nego's
        !           650:    */
        !           651:   i = 0;
        !           652:   while (test_segments[i].name)   
        !           653:     parse_test (peer, &test_segments[i++], CAPABILITY);
        !           654:   
        !           655:   i = 0;
        !           656:   while (misc_segments[i].name)
        !           657:     parse_test (peer, &misc_segments[i++], CAPABILITY);
        !           658: 
        !           659:   i = 0;
        !           660:   while (opt_params[i].name)
        !           661:     parse_test (peer, &opt_params[i++], OPT_PARAM);
        !           662: 
        !           663:   SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV);
        !           664:   peer->status = Established;
        !           665:   
        !           666:   i = 0;
        !           667:   while (dynamic_cap_msgs[i].name)
        !           668:     parse_test (peer, &dynamic_cap_msgs[i++], DYNCAP);
        !           669:   
        !           670:   printf ("failures: %d\n", failed);
        !           671:   return failed;
        !           672: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>