Annotation of embedaddon/quagga/tests/aspath_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:
! 7: #include "bgpd/bgpd.h"
! 8: #include "bgpd/bgp_aspath.h"
! 9: #include "bgpd/bgp_attr.h"
! 10:
! 11: #define VT100_RESET "\x1b[0m"
! 12: #define VT100_RED "\x1b[31m"
! 13: #define VT100_GREEN "\x1b[32m"
! 14: #define VT100_YELLOW "\x1b[33m"
! 15: #define OK VT100_GREEN "OK" VT100_RESET
! 16: #define FAILED VT100_RED "failed" VT100_RESET
! 17:
! 18: /* need these to link in libbgp */
! 19: struct zebra_privs_t *bgpd_privs = NULL;
! 20: struct thread_master *master = NULL;
! 21:
! 22: static int failed = 0;
! 23:
! 24: /* specification for a test - what the results should be */
! 25: struct test_spec
! 26: {
! 27: const char *shouldbe; /* the string the path should parse to */
! 28: const char *shouldbe_delete_confed; /* ditto, but once confeds are deleted */
! 29: const unsigned int hops; /* aspath_count_hops result */
! 30: const unsigned int confeds; /* aspath_count_confeds */
! 31: const int private_as; /* whether the private_as check should pass or fail */
! 32: #define NOT_ALL_PRIVATE 0
! 33: #define ALL_PRIVATE 1
! 34: const as_t does_loop; /* an ASN which should trigger loop-check */
! 35: const as_t doesnt_loop; /* one which should not */
! 36: const as_t first; /* the first ASN, if there is one */
! 37: #define NULL_ASN 0
! 38: };
! 39:
! 40:
! 41: /* test segments to parse and validate, and use for other tests */
! 42: static struct test_segment {
! 43: const char *name;
! 44: const char *desc;
! 45: const u_char asdata[1024];
! 46: int len;
! 47: struct test_spec sp;
! 48: } test_segments [] =
! 49: {
! 50: { /* 0 */
! 51: "seq1",
! 52: "seq(8466,3,52737,4096)",
! 53: { 0x2,0x4, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00 },
! 54: 10,
! 55: { "8466 3 52737 4096",
! 56: "8466 3 52737 4096",
! 57: 4, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
! 58: },
! 59: { /* 1 */
! 60: "seq2",
! 61: "seq(8722) seq(4)",
! 62: { 0x2,0x1, 0x22,0x12,
! 63: 0x2,0x1, 0x00,0x04 },
! 64: 8,
! 65: { "8722 4",
! 66: "8722 4",
! 67: 2, 0, NOT_ALL_PRIVATE, 4, 5, 8722, },
! 68: },
! 69: { /* 2 */
! 70: "seq3",
! 71: "seq(8466,3,52737,4096,8722,4)",
! 72: { 0x2,0x6, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00,
! 73: 0x22,0x12, 0x00,0x04},
! 74: 14,
! 75: { "8466 3 52737 4096 8722 4",
! 76: "8466 3 52737 4096 8722 4",
! 77: 6, 0, NOT_ALL_PRIVATE, 3, 5, 8466 },
! 78: },
! 79: { /* 3 */
! 80: "seqset",
! 81: "seq(8482,51457) set(5204)",
! 82: { 0x2,0x2, 0x21,0x22, 0xc9,0x01,
! 83: 0x1,0x1, 0x14,0x54 },
! 84: 10,
! 85: { "8482 51457 {5204}",
! 86: "8482 51457 {5204}",
! 87: 3, 0, NOT_ALL_PRIVATE, 5204, 51456, 8482},
! 88: },
! 89: { /* 4 */
! 90: "seqset2",
! 91: "seq(8467, 59649) set(4196,48658) set(17322,30745)",
! 92: { 0x2,0x2, 0x21,0x13, 0xe9,0x01,
! 93: 0x1,0x2, 0x10,0x64, 0xbe,0x12,
! 94: 0x1,0x2, 0x43,0xaa, 0x78,0x19 },
! 95: 18,
! 96: { "8467 59649 {4196,48658} {17322,30745}",
! 97: "8467 59649 {4196,48658} {17322,30745}",
! 98: 4, 0, NOT_ALL_PRIVATE, 48658, 1, 8467},
! 99: },
! 100: { /* 5 */
! 101: "multi",
! 102: "seq(6435,59408,21665) set(2457,61697,4369), seq(1842,41590,51793)",
! 103: { 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1,
! 104: 0x1,0x3, 0x09,0x99, 0xf1,0x01, 0x11,0x11,
! 105: 0x2,0x3, 0x07,0x32, 0xa2,0x76, 0xca,0x51 },
! 106: 24,
! 107: { "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
! 108: "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
! 109: 7, 0, NOT_ALL_PRIVATE, 51793, 1, 6435 },
! 110: },
! 111: { /* 6 */
! 112: "confed",
! 113: "confseq(123,456,789)",
! 114: { 0x3,0x3, 0x00,0x7b, 0x01,0xc8, 0x03,0x15 },
! 115: 8,
! 116: { "(123 456 789)",
! 117: "",
! 118: 0, 3, NOT_ALL_PRIVATE, 789, 1, NULL_ASN },
! 119: },
! 120: { /* 7 */
! 121: "confed2",
! 122: "confseq(123,456,789) confseq(111,222)",
! 123: { 0x3,0x3, 0x00,0x7b, 0x01,0xc8, 0x03,0x15,
! 124: 0x3,0x2, 0x00,0x6f, 0x00,0xde },
! 125: 14,
! 126: { "(123 456 789) (111 222)",
! 127: "",
! 128: 0, 5, NOT_ALL_PRIVATE, 111, 1, NULL_ASN },
! 129: },
! 130: { /* 8 */
! 131: "confset",
! 132: "confset(456,123,789)",
! 133: { 0x4,0x3, 0x01,0xc8, 0x00,0x7b, 0x03,0x15 },
! 134: 8,
! 135: { "[123,456,789]",
! 136: "[123,456,789]",
! 137: 0, 1, NOT_ALL_PRIVATE, 123, 1, NULL_ASN },
! 138: },
! 139: { /* 9 */
! 140: "confmulti",
! 141: "confseq(123,456,789) confset(222,111) seq(8722) set(4196,48658)",
! 142: { 0x3,0x3, 0x00,0x7b, 0x01,0xc8, 0x03,0x15,
! 143: 0x4,0x2, 0x00,0xde, 0x00,0x6f,
! 144: 0x2,0x1, 0x22,0x12,
! 145: 0x1,0x2, 0x10,0x64, 0xbe,0x12 },
! 146: 24,
! 147: { "(123 456 789) [111,222] 8722 {4196,48658}",
! 148: "8722 {4196,48658}",
! 149: 2, 4, NOT_ALL_PRIVATE, 123, 1, NULL_ASN },
! 150: },
! 151: { /* 10 */
! 152: "seq4",
! 153: "seq(8466,2,52737,4096,8722,4)",
! 154: { 0x2,0x6, 0x21,0x12, 0x00,0x02, 0xce,0x01, 0x10,0x00,
! 155: 0x22,0x12, 0x00,0x04},
! 156: 14,
! 157: { "8466 2 52737 4096 8722 4",
! 158: "8466 2 52737 4096 8722 4",
! 159: 6, 0, NOT_ALL_PRIVATE, 4096, 1, 8466 },
! 160: },
! 161: { /* 11 */
! 162: "tripleseq1",
! 163: "seq(8466,2,52737) seq(4096,8722,4) seq(8722)",
! 164: { 0x2,0x3, 0x21,0x12, 0x00,0x02, 0xce,0x01,
! 165: 0x2,0x3, 0x10,0x00, 0x22,0x12, 0x00,0x04,
! 166: 0x2,0x1, 0x22,0x12},
! 167: 20,
! 168: { "8466 2 52737 4096 8722 4 8722",
! 169: "8466 2 52737 4096 8722 4 8722",
! 170: 7, 0, NOT_ALL_PRIVATE, 4096, 1, 8466 },
! 171: },
! 172: { /* 12 */
! 173: "someprivate",
! 174: "seq(8466,64512,52737,65535)",
! 175: { 0x2,0x4, 0x21,0x12, 0xfc,0x00, 0xce,0x01, 0xff,0xff },
! 176: 10,
! 177: { "8466 64512 52737 65535",
! 178: "8466 64512 52737 65535",
! 179: 4, 0, NOT_ALL_PRIVATE, 65535, 4, 8466 },
! 180: },
! 181: { /* 13 */
! 182: "allprivate",
! 183: "seq(65534,64512,64513,65535)",
! 184: { 0x2,0x4, 0xff,0xfe, 0xfc,0x00, 0xfc,0x01, 0xff,0xff },
! 185: 10,
! 186: { "65534 64512 64513 65535",
! 187: "65534 64512 64513 65535",
! 188: 4, 0, ALL_PRIVATE, 65534, 4, 65534 },
! 189: },
! 190: { /* 14 */
! 191: "long",
! 192: "seq(8466,3,52737,4096,34285,<repeated 49 more times>)",
! 193: { 0x2,0xfa, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 194: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 195: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 196: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 197: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 198: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 199: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 200: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 201: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 202: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 203: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 204: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 205: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 206: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 207: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 208: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 209: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 210: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 211: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 212: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 213: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 214: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 215: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 216: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 217: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 218: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 219: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 220: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 221: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 222: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 223: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 224: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 225: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 226: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 227: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 228: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 229: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 230: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 231: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 232: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 233: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 234: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 235: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 236: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 237: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 238: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 239: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 240: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 241: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
! 242: 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed, },
! 243: 502,
! 244: { "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 245: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 246: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 247: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 248: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 249: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 250: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 251: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 252: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 253: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 254: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 255: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 256: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 257: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 258: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 259: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 260: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 261: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 262: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 263: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 264: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 265: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 266: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 267: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 268: "8466 3 52737 4096 34285 8466 3 52737 4096 34285",
! 269:
! 270: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 271: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 272: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 273: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 274: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 275: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 276: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 277: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 278: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 279: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 280: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 281: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 282: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 283: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 284: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 285: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 286: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 287: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 288: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 289: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 290: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 291: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 292: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 293: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 294: "8466 3 52737 4096 34285 8466 3 52737 4096 34285",
! 295: 250, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
! 296: },
! 297: { /* 15 */
! 298: "seq1extra",
! 299: "seq(8466,3,52737,4096,3456)",
! 300: { 0x2,0x5, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80 },
! 301: 12,
! 302: { "8466 3 52737 4096 3456",
! 303: "8466 3 52737 4096 3456",
! 304: 5, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
! 305: },
! 306: { /* 16 */
! 307: "empty",
! 308: "<empty>",
! 309: {},
! 310: 0,
! 311: { "", "", 0, 0, 0, 0, 0, 0 },
! 312: },
! 313: { /* 17 */
! 314: "redundantset",
! 315: "seq(8466,3,52737,4096,3456) set(7099,8153,8153,8153)",
! 316: { 0x2,0x5, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80,
! 317: 0x1,0x4, 0x1b,0xbb, 0x1f,0xd9, 0x1f,0xd9, 0x1f,0xd9 },
! 318: 22,
! 319: {
! 320: /* We shouldn't ever /generate/ such paths. However, we should
! 321: * cope with them fine.
! 322: */
! 323: "8466 3 52737 4096 3456 {7099,8153}",
! 324: "8466 3 52737 4096 3456 {7099,8153}",
! 325: 6, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
! 326: },
! 327: { /* 18 */
! 328: "reconcile_lead_asp",
! 329: "seq(6435,59408,21665) set(23456,23456,23456), seq(23456,23456,23456)",
! 330: { 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1,
! 331: 0x1,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0,
! 332: 0x2,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0 },
! 333: 24,
! 334: { "6435 59408 21665 {23456} 23456 23456 23456",
! 335: "6435 59408 21665 {23456} 23456 23456 23456",
! 336: 7, 0, NOT_ALL_PRIVATE, 23456, 1, 6435 },
! 337: },
! 338: { /* 19 */
! 339: "reconcile_new_asp",
! 340: "set(2457,61697,4369), seq(1842,41591,51793)",
! 341: {
! 342: 0x1,0x3, 0x09,0x99, 0xf1,0x01, 0x11,0x11,
! 343: 0x2,0x3, 0x07,0x32, 0xa2,0x77, 0xca,0x51 },
! 344: 16,
! 345: { "{2457,4369,61697} 1842 41591 51793",
! 346: "{2457,4369,61697} 1842 41591 51793",
! 347: 4, 0, NOT_ALL_PRIVATE, 51793, 1, 2457 },
! 348: },
! 349: { /* 20 */
! 350: "reconcile_confed",
! 351: "confseq(123,456,789) confset(456,124,788) seq(6435,59408,21665)"
! 352: " set(23456,23456,23456), seq(23456,23456,23456)",
! 353: { 0x3,0x3, 0x00,0x7b, 0x01,0xc8, 0x03,0x15,
! 354: 0x4,0x3, 0x01,0xc8, 0x00,0x7c, 0x03,0x14,
! 355: 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1,
! 356: 0x1,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0,
! 357: 0x2,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0 },
! 358: 40,
! 359: { "(123 456 789) [124,456,788] 6435 59408 21665"
! 360: " {23456} 23456 23456 23456",
! 361: "6435 59408 21665 {23456} 23456 23456 23456",
! 362: 7, 4, NOT_ALL_PRIVATE, 23456, 1, 6435 },
! 363: },
! 364: { /* 21 */
! 365: "reconcile_start_trans",
! 366: "seq(23456,23456,23456) seq(6435,59408,21665)",
! 367: { 0x2,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0,
! 368: 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1, },
! 369: 16,
! 370: { "23456 23456 23456 6435 59408 21665",
! 371: "23456 23456 23456 6435 59408 21665",
! 372: 6, 0, NOT_ALL_PRIVATE, 21665, 1, 23456 },
! 373: },
! 374: { /* 22 */
! 375: "reconcile_start_trans4",
! 376: "seq(1842,41591,51793) seq(6435,59408,21665)",
! 377: { 0x2,0x3, 0x07,0x32, 0xa2,0x77, 0xca,0x51,
! 378: 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1, },
! 379: 16,
! 380: { "1842 41591 51793 6435 59408 21665",
! 381: "1842 41591 51793 6435 59408 21665",
! 382: 6, 0, NOT_ALL_PRIVATE, 41591, 1, 1842 },
! 383: },
! 384: { /* 23 */
! 385: "reconcile_start_trans_error",
! 386: "seq(23456,23456,23456) seq(6435,59408)",
! 387: { 0x2,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0,
! 388: 0x2,0x2, 0x19,0x23, 0xe8,0x10, },
! 389: 14,
! 390: { "23456 23456 23456 6435 59408",
! 391: "23456 23456 23456 6435 59408",
! 392: 5, 0, NOT_ALL_PRIVATE, 59408, 1, 23456 },
! 393: },
! 394: { /* 24 */
! 395: "redundantset2",
! 396: "seq(8466,3,52737,4096,3456) set(7099,8153,8153,8153,7099)",
! 397: { 0x2,0x5, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80,
! 398: 0x1,0x5, 0x1b,0xbb, 0x1f,0xd9, 0x1f,0xd9, 0x1f,0xd9, 0x1b,0xbb,},
! 399: 24,
! 400: {
! 401: /* We should weed out duplicate set members. */
! 402: "8466 3 52737 4096 3456 {7099,8153}",
! 403: "8466 3 52737 4096 3456 {7099,8153}",
! 404: 6, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
! 405: },
! 406: { /* 25 */
! 407: "zero-size overflow",
! 408: "#ASNs = 0, data = seq(8466 3 52737 4096 3456)",
! 409: { 0x2,0x0, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80 },
! 410: 12,
! 411: { NULL, NULL,
! 412: 0, 0, 0, 0, 0, 0 },
! 413: },
! 414: { /* 26 */
! 415: "zero-size overflow + valid segment",
! 416: "seq(#AS=0:8466 3 52737),seq(4096 3456)",
! 417: { 0x2,0x0, 0x21,0x12, 0x00,0x03, 0xce,0x01,
! 418: 0x2,0x2, 0x10,0x00, 0x0d,0x80 },
! 419: 14
! 420: ,
! 421: { NULL, NULL,
! 422: 0, 0, 0, 0, 0, 0 },
! 423: },
! 424: { /* 27 */
! 425: "invalid segment type",
! 426: "type=8(4096 3456)",
! 427: { 0x8,0x2, 0x10,0x00, 0x0d,0x80 },
! 428: 14
! 429: ,
! 430: { NULL, NULL,
! 431: 0, 0, 0, 0, 0, 0 },
! 432: }, { NULL, NULL, {0}, 0, { NULL, 0, 0 } }
! 433: };
! 434:
! 435: /* */
! 436: static struct aspath_tests {
! 437: const char *desc;
! 438: const struct test_segment *segment;
! 439: const char *shouldbe; /* String it should evaluate to */
! 440: const enum as4 { AS4_DATA, AS2_DATA }
! 441: as4; /* whether data should be as4 or not (ie as2) */
! 442: const int result; /* expected result for bgp_attr_parse */
! 443: const int cap; /* capabilities to set for peer */
! 444: const char attrheader [1024];
! 445: size_t len;
! 446: } aspath_tests [] =
! 447: {
! 448: /* 0 */
! 449: {
! 450: "basic test",
! 451: &test_segments[0],
! 452: "8466 3 52737 4096",
! 453: AS2_DATA, 0,
! 454: 0,
! 455: { BGP_ATTR_FLAG_TRANS,
! 456: BGP_ATTR_AS_PATH,
! 457: 10,
! 458: },
! 459: 3,
! 460: },
! 461: /* 1 */
! 462: {
! 463: "length too short",
! 464: &test_segments[0],
! 465: "8466 3 52737 4096",
! 466: AS2_DATA, -1,
! 467: 0,
! 468: { BGP_ATTR_FLAG_TRANS,
! 469: BGP_ATTR_AS_PATH,
! 470: 8,
! 471: },
! 472: 3,
! 473: },
! 474: /* 2 */
! 475: {
! 476: "length too long",
! 477: &test_segments[0],
! 478: "8466 3 52737 4096",
! 479: AS2_DATA, -1,
! 480: 0,
! 481: { BGP_ATTR_FLAG_TRANS,
! 482: BGP_ATTR_AS_PATH,
! 483: 12,
! 484: },
! 485: 3,
! 486: },
! 487: /* 3 */
! 488: {
! 489: "incorrect flag",
! 490: &test_segments[0],
! 491: "8466 3 52737 4096",
! 492: AS2_DATA, -1,
! 493: 0,
! 494: { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
! 495: BGP_ATTR_AS_PATH,
! 496: 10,
! 497: },
! 498: 3,
! 499: },
! 500: /* 4 */
! 501: {
! 502: "as4_path, with as2 format data",
! 503: &test_segments[0],
! 504: "8466 3 52737 4096",
! 505: AS2_DATA, -1,
! 506: 0,
! 507: { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
! 508: BGP_ATTR_AS4_PATH,
! 509: 10,
! 510: },
! 511: 3,
! 512: },
! 513: /* 5 */
! 514: {
! 515: "as4, with incorrect attr length",
! 516: &test_segments[0],
! 517: "8466 3 52737 4096",
! 518: AS4_DATA, -1,
! 519: PEER_CAP_AS4_RCV,
! 520: { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
! 521: BGP_ATTR_AS4_PATH,
! 522: 10,
! 523: },
! 524: 3,
! 525: },
! 526: /* 6 */
! 527: {
! 528: "basic 4-byte as-path",
! 529: &test_segments[0],
! 530: "8466 3 52737 4096",
! 531: AS4_DATA, 0,
! 532: PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
! 533: { BGP_ATTR_FLAG_TRANS,
! 534: BGP_ATTR_AS_PATH,
! 535: 18,
! 536: },
! 537: 3,
! 538: },
! 539: /* 7 */
! 540: {
! 541: "4b AS_PATH: too short",
! 542: &test_segments[0],
! 543: "8466 3 52737 4096",
! 544: AS4_DATA, -1,
! 545: PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
! 546: { BGP_ATTR_FLAG_TRANS,
! 547: BGP_ATTR_AS_PATH,
! 548: 16,
! 549: },
! 550: 3,
! 551: },
! 552: /* 8 */
! 553: {
! 554: "4b AS_PATH: too long",
! 555: &test_segments[0],
! 556: "8466 3 52737 4096",
! 557: AS4_DATA, -1,
! 558: PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
! 559: { BGP_ATTR_FLAG_TRANS,
! 560: BGP_ATTR_AS_PATH,
! 561: 20,
! 562: },
! 563: 3,
! 564: },
! 565: /* 9 */
! 566: {
! 567: "4b AS_PATH: too long2",
! 568: &test_segments[0],
! 569: "8466 3 52737 4096",
! 570: AS4_DATA, -1,
! 571: PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
! 572: { BGP_ATTR_FLAG_TRANS,
! 573: BGP_ATTR_AS_PATH,
! 574: 22,
! 575: },
! 576: 3,
! 577: },
! 578: /* 10 */
! 579: {
! 580: "4b AS_PATH: bad flags",
! 581: &test_segments[0],
! 582: "8466 3 52737 4096",
! 583: AS4_DATA, -1,
! 584: PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
! 585: { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
! 586: BGP_ATTR_AS_PATH,
! 587: 18,
! 588: },
! 589: 3,
! 590: },
! 591: /* 11 */
! 592: {
! 593: "4b AS_PATH: confed",
! 594: &test_segments[6],
! 595: "8466 3 52737 4096",
! 596: AS4_DATA, -1,
! 597: PEER_CAP_AS4_ADV,
! 598: { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
! 599: BGP_ATTR_AS4_PATH,
! 600: 14,
! 601: },
! 602: 3,
! 603: },
! 604: { NULL, NULL, NULL, 0, 0, 0, { 0 }, 0 },
! 605: };
! 606:
! 607: /* prepending tests */
! 608: static struct tests {
! 609: const struct test_segment *test1;
! 610: const struct test_segment *test2;
! 611: struct test_spec sp;
! 612: } prepend_tests[] =
! 613: {
! 614: /* 0 */
! 615: { &test_segments[0], &test_segments[1],
! 616: { "8466 3 52737 4096 8722 4",
! 617: "8466 3 52737 4096 8722 4",
! 618: 6, 0, NOT_ALL_PRIVATE, 4096, 1, 8466 },
! 619: },
! 620: /* 1 */
! 621: { &test_segments[1], &test_segments[3],
! 622: { "8722 4 8482 51457 {5204}",
! 623: "8722 4 8482 51457 {5204}",
! 624: 5, 0, NOT_ALL_PRIVATE, 5204, 1, 8722 }
! 625: },
! 626: /* 2 */
! 627: { &test_segments[3], &test_segments[4],
! 628: { "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",
! 629: "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",
! 630: 7, 0, NOT_ALL_PRIVATE, 5204, 1, 8482 },
! 631: },
! 632: /* 3 */
! 633: { &test_segments[4], &test_segments[5],
! 634: { "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
! 635: " {2457,4369,61697} 1842 41590 51793",
! 636: "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
! 637: " {2457,4369,61697} 1842 41590 51793",
! 638: 11, 0, NOT_ALL_PRIVATE, 61697, 1, 8467 }
! 639: },
! 640: /* 4 */
! 641: { &test_segments[5], &test_segments[6],
! 642: { "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
! 643: "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
! 644: 7, 0, NOT_ALL_PRIVATE, 1842, 1, 6435 },
! 645: },
! 646: /* 5 */
! 647: { &test_segments[6], &test_segments[7],
! 648: { "(123 456 789) (123 456 789) (111 222)",
! 649: "",
! 650: 0, 8, NOT_ALL_PRIVATE, 111, 1, 0 }
! 651: },
! 652: { &test_segments[7], &test_segments[8],
! 653: { "(123 456 789) (111 222) [123,456,789]",
! 654: "",
! 655: 0, 6, NOT_ALL_PRIVATE, 111, 1, 0 }
! 656: },
! 657: { &test_segments[8], &test_segments[9],
! 658: { "[123,456,789] (123 456 789) [111,222] 8722 {4196,48658}",
! 659: "[123,456,789] (123 456 789) [111,222] 8722 {4196,48658}",
! 660: 2, 5, NOT_ALL_PRIVATE, 456, 1, NULL_ASN },
! 661: },
! 662: { &test_segments[9], &test_segments[8],
! 663: { "(123 456 789) [111,222] 8722 {4196,48658} [123,456,789]",
! 664: "8722 {4196,48658} [123,456,789]",
! 665: 2, 5, NOT_ALL_PRIVATE, 48658, 1, NULL_ASN },
! 666: },
! 667: { &test_segments[14], &test_segments[11],
! 668: { "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 669: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 670: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 671: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 672: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 673: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 674: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 675: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 676: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 677: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 678: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 679: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 680: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 681: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 682: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 683: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 684: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 685: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 686: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 687: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 688: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 689: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 690: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 691: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 692: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 693: "8466 2 52737 4096 8722 4 8722",
! 694:
! 695: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 696: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 697: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 698: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 699: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 700: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 701: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 702: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 703: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 704: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 705: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 706: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 707: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 708: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 709: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 710: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 711: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 712: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 713: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 714: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 715: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 716: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 717: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 718: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 719: "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
! 720: "8466 2 52737 4096 8722 4 8722",
! 721: 257, 0, NOT_ALL_PRIVATE, 4096, 1000, 8466 },
! 722: },
! 723: { NULL, NULL, { NULL, 0, 0, 0, 0, 0, 0, } },
! 724: };
! 725:
! 726: struct tests reconcile_tests[] =
! 727: {
! 728: { &test_segments[18], &test_segments[19],
! 729: { "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
! 730: "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
! 731: 7, 0, NOT_ALL_PRIVATE, 51793, 1, 6435 },
! 732: },
! 733: { &test_segments[19], &test_segments[18],
! 734: /* AS_PATH (19) has more hops than NEW_AS_PATH,
! 735: * so just AS_PATH should be used (though, this practice
! 736: * is bad imho).
! 737: */
! 738: { "{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
! 739: "{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
! 740: 11, 0, NOT_ALL_PRIVATE, 51793, 1, 6435 },
! 741: },
! 742: { &test_segments[20], &test_segments[19],
! 743: { "(123 456 789) [124,456,788] 6435 59408 21665"
! 744: " {2457,4369,61697} 1842 41591 51793",
! 745: "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
! 746: 7, 4, NOT_ALL_PRIVATE, 51793, 1, 6435 },
! 747: },
! 748: { &test_segments[21], &test_segments[22],
! 749: { "1842 41591 51793 6435 59408 21665",
! 750: "1842 41591 51793 6435 59408 21665",
! 751: 6, 0, NOT_ALL_PRIVATE, 51793, 1, 1842 },
! 752: },
! 753: { &test_segments[23], &test_segments[22],
! 754: { "23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
! 755: "23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
! 756: 11, 0, NOT_ALL_PRIVATE, 51793, 1, 1842 },
! 757: },
! 758: { NULL, NULL, { NULL, 0, 0, 0, 0, 0, 0, } },
! 759: };
! 760:
! 761: struct tests aggregate_tests[] =
! 762: {
! 763: { &test_segments[0], &test_segments[2],
! 764: { "8466 3 52737 4096 {4,8722}",
! 765: "8466 3 52737 4096 {4,8722}",
! 766: 5, 0, NOT_ALL_PRIVATE, 4, 1, 8466 },
! 767: },
! 768: { &test_segments[2], &test_segments[0],
! 769: { "8466 3 52737 4096 {4,8722}",
! 770: "8466 3 52737 4096 {4,8722}",
! 771: 5, 0, NOT_ALL_PRIVATE, 8722, 1, 8466 },
! 772: },
! 773: { &test_segments[2], &test_segments[10],
! 774: { "8466 {2,3,4,4096,8722,52737}",
! 775: "8466 {2,3,4,4096,8722,52737}",
! 776: 2, 0, NOT_ALL_PRIVATE, 8722, 5, 8466 },
! 777: },
! 778: { &test_segments[10], &test_segments[2],
! 779: { "8466 {2,3,4,4096,8722,52737}",
! 780: "8466 {2,3,4,4096,8722,52737}",
! 781: 2, 0, NOT_ALL_PRIVATE, 2, 20000, 8466 },
! 782: },
! 783:
! 784: { &test_segments[5], &test_segments[18],
! 785: { "6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}",
! 786: "6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}",
! 787: 4, 0, NOT_ALL_PRIVATE, 41590, 1, 6435 },
! 788: },
! 789:
! 790: { NULL, NULL, { NULL, 0, 0} },
! 791: };
! 792:
! 793: struct compare_tests
! 794: {
! 795: int test_index1;
! 796: int test_index2;
! 797: #define CMP_RES_YES 1
! 798: #define CMP_RES_NO 0
! 799: char shouldbe_cmp;
! 800: char shouldbe_confed;
! 801: } left_compare [] =
! 802: {
! 803: { 0, 1, CMP_RES_NO, CMP_RES_NO },
! 804: { 0, 2, CMP_RES_YES, CMP_RES_NO },
! 805: { 0, 11, CMP_RES_YES, CMP_RES_NO },
! 806: { 0, 15, CMP_RES_YES, CMP_RES_NO },
! 807: { 0, 16, CMP_RES_NO, CMP_RES_NO },
! 808: { 1, 11, CMP_RES_NO, CMP_RES_NO },
! 809: { 6, 7, CMP_RES_NO, CMP_RES_YES },
! 810: { 6, 8, CMP_RES_NO, CMP_RES_NO },
! 811: { 7, 8, CMP_RES_NO, CMP_RES_NO },
! 812: { 1, 9, CMP_RES_YES, CMP_RES_NO },
! 813: { 0, 9, CMP_RES_NO, CMP_RES_NO },
! 814: { 3, 9, CMP_RES_NO, CMP_RES_NO },
! 815: { 0, 6, CMP_RES_NO, CMP_RES_NO },
! 816: { 1, 6, CMP_RES_NO, CMP_RES_NO },
! 817: { 0, 8, CMP_RES_NO, CMP_RES_NO },
! 818: { 1, 8, CMP_RES_NO, CMP_RES_NO },
! 819: { 11, 6, CMP_RES_NO, CMP_RES_NO },
! 820: { 11, 7, CMP_RES_NO, CMP_RES_NO },
! 821: { 11, 8, CMP_RES_NO, CMP_RES_NO },
! 822: { 9, 6, CMP_RES_NO, CMP_RES_YES },
! 823: { 9, 7, CMP_RES_NO, CMP_RES_YES },
! 824: { 9, 8, CMP_RES_NO, CMP_RES_NO },
! 825: };
! 826:
! 827: /* make an aspath from a data stream */
! 828: static struct aspath *
! 829: make_aspath (const u_char *data, size_t len, int use32bit)
! 830: {
! 831: struct stream *s = NULL;
! 832: struct aspath *as;
! 833:
! 834: if (len)
! 835: {
! 836: s = stream_new (len);
! 837: stream_put (s, data, len);
! 838: }
! 839: as = aspath_parse (s, len, use32bit);
! 840:
! 841: if (s)
! 842: stream_free (s);
! 843:
! 844: return as;
! 845: }
! 846:
! 847: static void
! 848: printbytes (const u_char *bytes, int len)
! 849: {
! 850: int i = 0;
! 851: while (i < len)
! 852: {
! 853: if (i % 2)
! 854: printf ("%02hhx%s", bytes[i], " ");
! 855: else
! 856: printf ("0x%02hhx", bytes[i]);
! 857: i++;
! 858: }
! 859: printf ("\n");
! 860: }
! 861:
! 862: /* validate the given aspath */
! 863: static int
! 864: validate (struct aspath *as, const struct test_spec *sp)
! 865: {
! 866: size_t bytes, bytes4;
! 867: int fails = 0;
! 868: const u_char *out;
! 869: static struct stream *s;
! 870: struct aspath *asinout, *asconfeddel, *asstr, *as4;
! 871:
! 872: if (as == NULL && sp->shouldbe == NULL)
! 873: {
! 874: printf ("Correctly failed to parse\n");
! 875: return fails;
! 876: }
! 877:
! 878: out = aspath_snmp_pathseg (as, &bytes);
! 879: asinout = make_aspath (out, bytes, 0);
! 880:
! 881: /* Excercise AS4 parsing a bit, with a dogfood test */
! 882: if (!s)
! 883: s = stream_new (4096);
! 884: bytes4 = aspath_put (s, as, 1);
! 885: as4 = make_aspath (STREAM_DATA(s), bytes4, 1);
! 886:
! 887: asstr = aspath_str2aspath (sp->shouldbe);
! 888:
! 889: asconfeddel = aspath_delete_confed_seq (aspath_dup (asinout));
! 890:
! 891: printf ("got: %s\n", aspath_print(as));
! 892:
! 893: /* the parsed path should match the specified 'shouldbe' string.
! 894: * We should pass the "eat our own dog food" test, be able to output
! 895: * this path and then input it again. Ie the path resulting from:
! 896: *
! 897: * aspath_parse(aspath_put(as))
! 898: *
! 899: * should:
! 900: *
! 901: * - also match the specified 'shouldbe' value
! 902: * - hash to same value as original path
! 903: * - have same hops and confed counts as original, and as the
! 904: * the specified counts
! 905: *
! 906: * aspath_str2aspath() and shouldbe should match
! 907: *
! 908: * We do the same for:
! 909: *
! 910: * aspath_parse(aspath_put(as,USE32BIT))
! 911: *
! 912: * Confederation related tests:
! 913: * - aspath_delete_confed_seq(aspath) should match shouldbe_confed
! 914: * - aspath_delete_confed_seq should be idempotent.
! 915: */
! 916: if (strcmp(aspath_print (as), sp->shouldbe)
! 917: /* hash validation */
! 918: || (aspath_key_make (as) != aspath_key_make (asinout))
! 919: /* by string */
! 920: || strcmp(aspath_print (asinout), sp->shouldbe)
! 921: /* By 4-byte parsing */
! 922: || strcmp(aspath_print (as4), sp->shouldbe)
! 923: /* by various path counts */
! 924: || (aspath_count_hops (as) != sp->hops)
! 925: || (aspath_count_confeds (as) != sp->confeds)
! 926: || (aspath_count_hops (asinout) != sp->hops)
! 927: || (aspath_count_confeds (asinout) != sp->confeds))
! 928: {
! 929: failed++;
! 930: fails++;
! 931: printf ("shouldbe:\n%s\n", sp->shouldbe);
! 932: printf ("as4:\n%s\n", aspath_print (as4));
! 933: printf ("hash keys: in: %d out->in: %d\n",
! 934: aspath_key_make (as), aspath_key_make (asinout));
! 935: printf ("hops: %d, counted %d %d\n", sp->hops,
! 936: aspath_count_hops (as),
! 937: aspath_count_hops (asinout) );
! 938: printf ("confeds: %d, counted %d %d\n", sp->confeds,
! 939: aspath_count_confeds (as),
! 940: aspath_count_confeds (asinout));
! 941: printf ("out->in:\n%s\nbytes: ", aspath_print(asinout));
! 942: printbytes (out, bytes);
! 943: }
! 944: /* basic confed related tests */
! 945: if ((aspath_print (asconfeddel) == NULL
! 946: && sp->shouldbe_delete_confed != NULL)
! 947: || (aspath_print (asconfeddel) != NULL
! 948: && sp->shouldbe_delete_confed == NULL)
! 949: || strcmp(aspath_print (asconfeddel), sp->shouldbe_delete_confed)
! 950: /* delete_confed_seq should be idempotent */
! 951: || (aspath_key_make (asconfeddel)
! 952: != aspath_key_make (aspath_delete_confed_seq (asconfeddel))))
! 953: {
! 954: failed++;
! 955: fails++;
! 956: printf ("confed_del: %s\n", aspath_print (asconfeddel));
! 957: printf ("should be: %s\n", sp->shouldbe_delete_confed);
! 958: }
! 959: /* aspath_str2aspath test */
! 960: if ((aspath_print (asstr) == NULL && sp->shouldbe != NULL)
! 961: || (aspath_print (asstr) != NULL && sp->shouldbe == NULL)
! 962: || strcmp(aspath_print (asstr), sp->shouldbe))
! 963: {
! 964: failed++;
! 965: fails++;
! 966: printf ("asstr: %s\n", aspath_print (asstr));
! 967: }
! 968:
! 969: /* loop, private and first as checks */
! 970: if ((sp->does_loop && aspath_loop_check (as, sp->does_loop) == 0)
! 971: || (sp->doesnt_loop && aspath_loop_check (as, sp->doesnt_loop) != 0)
! 972: || (aspath_private_as_check (as) != sp->private_as)
! 973: || (aspath_firstas_check (as,sp->first)
! 974: && sp->first == 0))
! 975: {
! 976: failed++;
! 977: fails++;
! 978: printf ("firstas: %d, got %d\n", sp->first,
! 979: aspath_firstas_check (as,sp->first));
! 980: printf ("loop does: %d %d, doesnt: %d %d\n",
! 981: sp->does_loop, aspath_loop_check (as, sp->does_loop),
! 982: sp->doesnt_loop, aspath_loop_check (as, sp->doesnt_loop));
! 983: printf ("private check: %d %d\n", sp->private_as,
! 984: aspath_private_as_check (as));
! 985: }
! 986: aspath_unintern (asinout);
! 987: aspath_unintern (as4);
! 988:
! 989: aspath_free (asconfeddel);
! 990: aspath_free (asstr);
! 991: stream_reset (s);
! 992:
! 993: return fails;
! 994: }
! 995:
! 996: static void
! 997: empty_get_test ()
! 998: {
! 999: struct aspath *as = aspath_empty_get ();
! 1000: struct test_spec sp = { "", "", 0, 0, 0, 0, 0, 0 };
! 1001:
! 1002: printf ("empty_get_test, as: %s\n",aspath_print (as));
! 1003: if (!validate (as, &sp))
! 1004: printf ("%s\n", OK);
! 1005: else
! 1006: printf ("%s!\n", FAILED);
! 1007:
! 1008: printf ("\n");
! 1009:
! 1010: aspath_free (as);
! 1011: }
! 1012:
! 1013: /* basic parsing test */
! 1014: static void
! 1015: parse_test (struct test_segment *t)
! 1016: {
! 1017: struct aspath *asp;
! 1018:
! 1019: printf ("%s: %s\n", t->name, t->desc);
! 1020:
! 1021: asp = make_aspath (t->asdata, t->len, 0);
! 1022:
! 1023: printf ("aspath: %s\nvalidating...:\n", aspath_print (asp));
! 1024:
! 1025: if (!validate (asp, &t->sp))
! 1026: printf (OK "\n");
! 1027: else
! 1028: printf (FAILED "\n");
! 1029:
! 1030: printf ("\n");
! 1031:
! 1032: if (asp)
! 1033: aspath_unintern (asp);
! 1034: }
! 1035:
! 1036: /* prepend testing */
! 1037: static void
! 1038: prepend_test (struct tests *t)
! 1039: {
! 1040: struct aspath *asp1, *asp2, *ascratch;
! 1041:
! 1042: printf ("prepend %s: %s\n", t->test1->name, t->test1->desc);
! 1043: printf ("to %s: %s\n", t->test2->name, t->test2->desc);
! 1044:
! 1045: asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
! 1046: asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
! 1047:
! 1048: ascratch = aspath_dup (asp2);
! 1049: aspath_unintern (asp2);
! 1050:
! 1051: asp2 = aspath_prepend (asp1, ascratch);
! 1052:
! 1053: printf ("aspath: %s\n", aspath_print (asp2));
! 1054:
! 1055: if (!validate (asp2, &t->sp))
! 1056: printf ("%s\n", OK);
! 1057: else
! 1058: printf ("%s!\n", FAILED);
! 1059:
! 1060: printf ("\n");
! 1061: aspath_unintern (asp1);
! 1062: aspath_free (asp2);
! 1063: }
! 1064:
! 1065: /* empty-prepend testing */
! 1066: static void
! 1067: empty_prepend_test (struct test_segment *t)
! 1068: {
! 1069: struct aspath *asp1, *asp2, *ascratch;
! 1070:
! 1071: printf ("empty prepend %s: %s\n", t->name, t->desc);
! 1072:
! 1073: asp1 = make_aspath (t->asdata, t->len, 0);
! 1074: asp2 = aspath_empty ();
! 1075:
! 1076: ascratch = aspath_dup (asp2);
! 1077: aspath_unintern (asp2);
! 1078:
! 1079: asp2 = aspath_prepend (asp1, ascratch);
! 1080:
! 1081: printf ("aspath: %s\n", aspath_print (asp2));
! 1082:
! 1083: if (!validate (asp2, &t->sp))
! 1084: printf (OK "\n");
! 1085: else
! 1086: printf (FAILED "!\n");
! 1087:
! 1088: printf ("\n");
! 1089: if (asp1)
! 1090: aspath_unintern (asp1);
! 1091: aspath_free (asp2);
! 1092: }
! 1093:
! 1094: /* as2+as4 reconciliation testing */
! 1095: static void
! 1096: as4_reconcile_test (struct tests *t)
! 1097: {
! 1098: struct aspath *asp1, *asp2, *ascratch;
! 1099:
! 1100: printf ("reconciling %s:\n %s\n", t->test1->name, t->test1->desc);
! 1101: printf ("with %s:\n %s\n", t->test2->name, t->test2->desc);
! 1102:
! 1103: asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
! 1104: asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
! 1105:
! 1106: ascratch = aspath_reconcile_as4 (asp1, asp2);
! 1107:
! 1108: if (!validate (ascratch, &t->sp))
! 1109: printf (OK "\n");
! 1110: else
! 1111: printf (FAILED "!\n");
! 1112:
! 1113: printf ("\n");
! 1114: aspath_unintern (asp1);
! 1115: aspath_unintern (asp2);
! 1116: aspath_free (ascratch);
! 1117: }
! 1118:
! 1119:
! 1120: /* aggregation testing */
! 1121: static void
! 1122: aggregate_test (struct tests *t)
! 1123: {
! 1124: struct aspath *asp1, *asp2, *ascratch;
! 1125:
! 1126: printf ("aggregate %s: %s\n", t->test1->name, t->test1->desc);
! 1127: printf ("with %s: %s\n", t->test2->name, t->test2->desc);
! 1128:
! 1129: asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
! 1130: asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
! 1131:
! 1132: ascratch = aspath_aggregate (asp1, asp2);
! 1133:
! 1134: if (!validate (ascratch, &t->sp))
! 1135: printf (OK "\n");
! 1136: else
! 1137: printf (FAILED "!\n");
! 1138:
! 1139: printf ("\n");
! 1140: aspath_unintern (asp1);
! 1141: aspath_unintern (asp2);
! 1142: aspath_free (ascratch);
! 1143: /* aspath_unintern (ascratch);*/
! 1144: }
! 1145:
! 1146: /* cmp_left tests */
! 1147: static void
! 1148: cmp_test ()
! 1149: {
! 1150: unsigned int i;
! 1151: #define CMP_TESTS_MAX \
! 1152: (sizeof(left_compare) / sizeof (struct compare_tests))
! 1153:
! 1154: for (i = 0; i < CMP_TESTS_MAX; i++)
! 1155: {
! 1156: struct test_segment *t1 = &test_segments[left_compare[i].test_index1];
! 1157: struct test_segment *t2 = &test_segments[left_compare[i].test_index2];
! 1158: struct aspath *asp1, *asp2;
! 1159:
! 1160: printf ("left cmp %s: %s\n", t1->name, t1->desc);
! 1161: printf ("and %s: %s\n", t2->name, t2->desc);
! 1162:
! 1163: asp1 = make_aspath (t1->asdata, t1->len, 0);
! 1164: asp2 = make_aspath (t2->asdata, t2->len, 0);
! 1165:
! 1166: if (aspath_cmp_left (asp1, asp2) != left_compare[i].shouldbe_cmp
! 1167: || aspath_cmp_left (asp2, asp1) != left_compare[i].shouldbe_cmp
! 1168: || aspath_cmp_left_confed (asp1, asp2)
! 1169: != left_compare[i].shouldbe_confed
! 1170: || aspath_cmp_left_confed (asp2, asp1)
! 1171: != left_compare[i].shouldbe_confed)
! 1172: {
! 1173: failed++;
! 1174: printf (FAILED "\n");
! 1175: printf ("result should be: cmp: %d, confed: %d\n",
! 1176: left_compare[i].shouldbe_cmp,
! 1177: left_compare[i].shouldbe_confed);
! 1178: printf ("got: cmp %d, cmp_confed: %d\n",
! 1179: aspath_cmp_left (asp1, asp2),
! 1180: aspath_cmp_left_confed (asp1, asp2));
! 1181: printf("path1: %s\npath2: %s\n", aspath_print (asp1),
! 1182: aspath_print (asp2));
! 1183: }
! 1184: else
! 1185: printf (OK "\n");
! 1186:
! 1187: printf ("\n");
! 1188: aspath_unintern (asp1);
! 1189: aspath_unintern (asp2);
! 1190: }
! 1191: }
! 1192:
! 1193: static int
! 1194: handle_attr_test (struct aspath_tests *t)
! 1195: {
! 1196: struct bgp bgp = { 0 };
! 1197: struct peer peer = { 0 };
! 1198: struct attr attr = { 0 };
! 1199: int ret;
! 1200: int initfail = failed;
! 1201: struct aspath *asp;
! 1202: size_t datalen;
! 1203:
! 1204: asp = make_aspath (t->segment->asdata, t->segment->len, 0);
! 1205:
! 1206: peer.ibuf = stream_new (BGP_MAX_PACKET_SIZE);
! 1207: peer.obuf = stream_fifo_new ();
! 1208: peer.bgp = &bgp;
! 1209: peer.host = (char *)"none";
! 1210: peer.fd = -1;
! 1211: peer.cap = t->cap;
! 1212:
! 1213: stream_write (peer.ibuf, t->attrheader, t->len);
! 1214: datalen = aspath_put (peer.ibuf, asp, t->as4 == AS4_DATA);
! 1215:
! 1216: ret = bgp_attr_parse (&peer, &attr, t->len + datalen, NULL, NULL);
! 1217:
! 1218: if (ret != t->result)
! 1219: {
! 1220: printf ("bgp_attr_parse returned %d, expected %d\n", ret, t->result);
! 1221: printf ("datalen %d\n", datalen);
! 1222: failed++;
! 1223: }
! 1224: if (ret != 0)
! 1225: goto out;
! 1226:
! 1227: if (attr.aspath == NULL)
! 1228: {
! 1229: printf ("aspath is NULL!\n");
! 1230: failed++;
! 1231: }
! 1232: if (attr.aspath && strcmp (attr.aspath->str, t->shouldbe))
! 1233: {
! 1234: printf ("attr str and 'shouldbe' mismatched!\n"
! 1235: "attr str: %s\n"
! 1236: "shouldbe: %s\n",
! 1237: attr.aspath->str, t->shouldbe);
! 1238: failed++;
! 1239: }
! 1240:
! 1241: out:
! 1242: if (attr.aspath)
! 1243: aspath_unintern (attr.aspath);
! 1244: if (asp)
! 1245: aspath_unintern (asp);
! 1246: return failed - initfail;
! 1247: }
! 1248:
! 1249: static void
! 1250: attr_test (struct aspath_tests *t)
! 1251: {
! 1252: printf ("%s\n", t->desc);
! 1253: printf ("%s\n\n", handle_attr_test (t) ? FAILED : OK);
! 1254: }
! 1255:
! 1256: int
! 1257: main (void)
! 1258: {
! 1259: int i = 0;
! 1260: bgp_master_init ();
! 1261: master = bm->master;
! 1262: bgp_attr_init ();
! 1263:
! 1264: while (test_segments[i].name)
! 1265: {
! 1266: printf ("test %u\n", i);
! 1267: parse_test (&test_segments[i]);
! 1268: empty_prepend_test (&test_segments[i++]);
! 1269: }
! 1270:
! 1271: i = 0;
! 1272: while (prepend_tests[i].test1)
! 1273: {
! 1274: printf ("prepend test %u\n", i);
! 1275: prepend_test (&prepend_tests[i++]);
! 1276: }
! 1277:
! 1278: i = 0;
! 1279: while (aggregate_tests[i].test1)
! 1280: {
! 1281: printf ("aggregate test %u\n", i);
! 1282: aggregate_test (&aggregate_tests[i++]);
! 1283: }
! 1284:
! 1285: i = 0;
! 1286:
! 1287: while (reconcile_tests[i].test1)
! 1288: {
! 1289: printf ("reconcile test %u\n", i);
! 1290: as4_reconcile_test (&reconcile_tests[i++]);
! 1291: }
! 1292:
! 1293: i = 0;
! 1294:
! 1295: cmp_test();
! 1296:
! 1297: i = 0;
! 1298:
! 1299: empty_get_test();
! 1300:
! 1301: i = 0;
! 1302:
! 1303: while (aspath_tests[i].desc)
! 1304: {
! 1305: printf ("aspath_attr test %d\n", i);
! 1306: attr_test (&aspath_tests[i++]);
! 1307: }
! 1308:
! 1309: printf ("failures: %d\n", failed);
! 1310: printf ("aspath count: %ld\n", aspath_count());
! 1311:
! 1312: return (failed + aspath_count());
! 1313: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>