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>