Annotation of embedaddon/quagga/tests/aspath_test.c, revision 1.1.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>