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>