]>
git.proxmox.com Git - mirror_frr.git/blob - tests/bgpd/test_aspath.c
2 * Copyright (C) 2005 Sun Microsystems, Inc.
4 * This file is part of Quagga.
6 * Quagga is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * Quagga is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "bgpd/bgpd.h"
30 #include "bgpd/bgp_aspath.h"
31 #include "bgpd/bgp_attr.h"
33 #define VT100_RESET "\x1b[0m"
34 #define VT100_RED "\x1b[31m"
35 #define VT100_GREEN "\x1b[32m"
36 #define VT100_YELLOW "\x1b[33m"
37 #define OK VT100_GREEN "OK" VT100_RESET
38 #define FAILED VT100_RED "failed" VT100_RESET
40 /* need these to link in libbgp */
41 struct zebra_privs_t
*bgpd_privs
= NULL
;
42 struct thread_master
*master
= NULL
;
44 static int failed
= 0;
46 /* specification for a test - what the results should be */
48 const char *shouldbe
; /* the string the path should parse to */
49 const char *shouldbe_delete_confed
; /* ditto, but once confeds are
51 const unsigned int hops
; /* aspath_count_hops result */
52 const unsigned int confeds
; /* aspath_count_confeds */
53 const int private_as
; /* whether the private_as check should pass or
55 #define NOT_ALL_PRIVATE 0
57 const as_t does_loop
; /* an ASN which should trigger loop-check */
58 const as_t doesnt_loop
; /* one which should not */
59 const as_t first
; /* the first ASN, if there is one */
64 /* test segments to parse and validate, and use for other tests */
65 static struct test_segment
{
68 const u_char asdata
[1024];
75 "seq(8466,3,52737,4096)",
76 {0x2, 0x4, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00},
78 {"8466 3 52737 4096", "8466 3 52737 4096", 4, 0,
79 NOT_ALL_PRIVATE
, 4096, 4, 8466},
85 {0x2, 0x1, 0x22, 0x12, 0x2, 0x1, 0x00, 0x04},
88 "8722 4", "8722 4", 2, 0, NOT_ALL_PRIVATE
, 4, 5, 8722,
94 "seq(8466,3,52737,4096,8722,4)",
95 {0x2, 0x6, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x22,
98 {"8466 3 52737 4096 8722 4", "8466 3 52737 4096 8722 4", 6, 0,
99 NOT_ALL_PRIVATE
, 3, 5, 8466},
104 "seq(8482,51457) set(5204)",
105 {0x2, 0x2, 0x21, 0x22, 0xc9, 0x01, 0x1, 0x1, 0x14, 0x54},
107 {"8482 51457 {5204}", "8482 51457 {5204}", 3, 0,
108 NOT_ALL_PRIVATE
, 5204, 51456, 8482},
113 "seq(8467, 59649) set(4196,48658) set(17322,30745)",
114 {0x2, 0x2, 0x21, 0x13, 0xe9, 0x01, 0x1, 0x2, 0x10, 0x64, 0xbe,
115 0x12, 0x1, 0x2, 0x43, 0xaa, 0x78, 0x19},
117 {"8467 59649 {4196,48658} {17322,30745}",
118 "8467 59649 {4196,48658} {17322,30745}", 4, 0, NOT_ALL_PRIVATE
,
124 "seq(6435,59408,21665) set(2457,61697,4369), seq(1842,41590,51793)",
125 {0x2, 0x3, 0x19, 0x23, 0xe8, 0x10, 0x54, 0xa1,
126 0x1, 0x3, 0x09, 0x99, 0xf1, 0x01, 0x11, 0x11,
127 0x2, 0x3, 0x07, 0x32, 0xa2, 0x76, 0xca, 0x51},
129 {"6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
130 "6435 59408 21665 {2457,4369,61697} 1842 41590 51793", 7, 0,
131 NOT_ALL_PRIVATE
, 51793, 1, 6435},
136 "confseq(123,456,789)",
137 {0x3, 0x3, 0x00, 0x7b, 0x01, 0xc8, 0x03, 0x15},
139 {"(123 456 789)", "", 0, 3, NOT_ALL_PRIVATE
, 789, 1, NULL_ASN
},
144 "confseq(123,456,789) confseq(111,222)",
145 {0x3, 0x3, 0x00, 0x7b, 0x01, 0xc8, 0x03, 0x15, 0x3, 0x2, 0x00,
148 {"(123 456 789) (111 222)", "", 0, 5, NOT_ALL_PRIVATE
, 111, 1,
154 "confset(456,123,789)",
155 {0x4, 0x3, 0x01, 0xc8, 0x00, 0x7b, 0x03, 0x15},
157 {"[123,456,789]", "", 0, 1, NOT_ALL_PRIVATE
, 123, 1, NULL_ASN
},
162 "confseq(123,456,789) confset(222,111) seq(8722) set(4196,48658)",
163 {0x3, 0x3, 0x00, 0x7b, 0x01, 0xc8, 0x03, 0x15,
164 0x4, 0x2, 0x00, 0xde, 0x00, 0x6f, 0x2, 0x1,
165 0x22, 0x12, 0x1, 0x2, 0x10, 0x64, 0xbe, 0x12},
167 {"(123 456 789) [111,222] 8722 {4196,48658}",
168 "8722 {4196,48658}", 2, 4, NOT_ALL_PRIVATE
, 123, 1, NULL_ASN
},
173 "seq(8466,2,52737,4096,8722,4)",
174 {0x2, 0x6, 0x21, 0x12, 0x00, 0x02, 0xce, 0x01, 0x10, 0x00, 0x22,
177 {"8466 2 52737 4096 8722 4", "8466 2 52737 4096 8722 4", 6, 0,
178 NOT_ALL_PRIVATE
, 4096, 1, 8466},
183 "seq(8466,2,52737) seq(4096,8722,4) seq(8722)",
184 {0x2, 0x3, 0x21, 0x12, 0x00, 0x02, 0xce, 0x01, 0x2, 0x3,
185 0x10, 0x00, 0x22, 0x12, 0x00, 0x04, 0x2, 0x1, 0x22, 0x12},
187 {"8466 2 52737 4096 8722 4 8722",
188 "8466 2 52737 4096 8722 4 8722", 7, 0, NOT_ALL_PRIVATE
, 4096,
194 "seq(8466,64512,52737,65535)",
195 {0x2, 0x4, 0x21, 0x12, 0xfc, 0x00, 0xce, 0x01, 0xff, 0xff},
197 {"8466 64512 52737 65535", "8466 64512 52737 65535", 4, 0,
198 NOT_ALL_PRIVATE
, 65535, 4, 8466},
203 "seq(65534,64512,64513,65535)",
204 {0x2, 0x4, 0xff, 0xfe, 0xfc, 0x00, 0xfc, 0x01, 0xff, 0xff},
206 {"65534 64512 64513 65535", "65534 64512 64513 65535", 4, 0,
207 ALL_PRIVATE
, 65534, 4, 65534},
212 "seq(8466,3,52737,4096,34285,<repeated 49 more times>)",
214 0x2, 0xfa, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
215 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
216 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
217 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
218 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
219 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
220 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
221 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
222 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
223 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
224 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
225 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
226 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
227 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
228 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
229 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
230 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
231 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
232 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
233 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
234 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
235 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
236 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
237 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
238 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
239 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
240 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
241 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
242 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
243 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
244 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
245 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
246 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
247 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
248 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
249 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
250 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
251 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
252 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
253 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
254 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
255 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
256 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
257 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
258 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
259 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
260 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
261 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
262 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
263 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
264 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
265 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
266 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
267 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
268 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
269 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
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 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
296 "8466 3 52737 4096 34285 8466 3 52737 4096 34285",
298 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
299 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
300 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
301 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
302 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
303 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
304 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
305 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
306 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
307 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
308 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
309 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
310 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
311 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
312 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
313 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
314 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
315 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
316 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
317 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
318 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
319 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
320 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
321 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
322 "8466 3 52737 4096 34285 8466 3 52737 4096 34285",
323 250, 0, NOT_ALL_PRIVATE
, 4096, 4, 8466},
328 "seq(8466,3,52737,4096,3456)",
329 {0x2, 0x5, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x0d,
332 {"8466 3 52737 4096 3456", "8466 3 52737 4096 3456", 5, 0,
333 NOT_ALL_PRIVATE
, 4096, 4, 8466},
341 {"", "", 0, 0, 0, 0, 0, 0},
346 "seq(8466,3,52737,4096,3456) set(7099,8153,8153,8153)",
347 {0x2, 0x5, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
348 0x10, 0x00, 0x0d, 0x80, 0x1, 0x4, 0x1b, 0xbb,
349 0x1f, 0xd9, 0x1f, 0xd9, 0x1f, 0xd9},
351 {/* We shouldn't ever /generate/ such paths. However, we should
352 * cope with them fine.
354 "8466 3 52737 4096 3456 {7099,8153}",
355 "8466 3 52737 4096 3456 {7099,8153}", 6, 0, NOT_ALL_PRIVATE
,
360 "reconcile_lead_asp",
361 "seq(6435,59408,21665) set(23456,23456,23456), seq(23456,23456,23456)",
362 {0x2, 0x3, 0x19, 0x23, 0xe8, 0x10, 0x54, 0xa1,
363 0x1, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0,
364 0x2, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0},
366 {"6435 59408 21665 {23456} 23456 23456 23456",
367 "6435 59408 21665 {23456} 23456 23456 23456", 7, 0,
368 NOT_ALL_PRIVATE
, 23456, 1, 6435},
373 "set(2457,61697,4369), seq(1842,41591,51793)",
374 {0x1, 0x3, 0x09, 0x99, 0xf1, 0x01, 0x11, 0x11, 0x2, 0x3, 0x07,
375 0x32, 0xa2, 0x77, 0xca, 0x51},
377 {"{2457,4369,61697} 1842 41591 51793",
378 "{2457,4369,61697} 1842 41591 51793", 4, 0, NOT_ALL_PRIVATE
,
384 "confseq(123,456,789) confset(456,124,788) seq(6435,59408,21665)"
385 " set(23456,23456,23456), seq(23456,23456,23456)",
386 {0x3, 0x3, 0x00, 0x7b, 0x01, 0xc8, 0x03, 0x15, 0x4, 0x3,
387 0x01, 0xc8, 0x00, 0x7c, 0x03, 0x14, 0x2, 0x3, 0x19, 0x23,
388 0xe8, 0x10, 0x54, 0xa1, 0x1, 0x3, 0x5b, 0xa0, 0x5b, 0xa0,
389 0x5b, 0xa0, 0x2, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0},
391 {"(123 456 789) [124,456,788] 6435 59408 21665"
392 " {23456} 23456 23456 23456",
393 "6435 59408 21665 {23456} 23456 23456 23456", 7, 4,
394 NOT_ALL_PRIVATE
, 23456, 1, 6435},
398 "reconcile_start_trans",
399 "seq(23456,23456,23456) seq(6435,59408,21665)",
401 0x2, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0, 0x2, 0x3,
402 0x19, 0x23, 0xe8, 0x10, 0x54, 0xa1,
405 {"23456 23456 23456 6435 59408 21665",
406 "23456 23456 23456 6435 59408 21665", 6, 0, NOT_ALL_PRIVATE
,
411 "reconcile_start_trans4",
412 "seq(1842,41591,51793) seq(6435,59408,21665)",
414 0x2, 0x3, 0x07, 0x32, 0xa2, 0x77, 0xca, 0x51, 0x2, 0x3,
415 0x19, 0x23, 0xe8, 0x10, 0x54, 0xa1,
418 {"1842 41591 51793 6435 59408 21665",
419 "1842 41591 51793 6435 59408 21665", 6, 0, NOT_ALL_PRIVATE
,
424 "reconcile_start_trans_error",
425 "seq(23456,23456,23456) seq(6435,59408)",
427 0x2, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0, 0x2, 0x2,
428 0x19, 0x23, 0xe8, 0x10,
431 {"23456 23456 23456 6435 59408", "23456 23456 23456 6435 59408",
432 5, 0, NOT_ALL_PRIVATE
, 59408, 1, 23456},
437 "seq(8466,3,52737,4096,3456) set(7099,8153,8153,8153,7099)",
439 0x2, 0x5, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
440 0x10, 0x00, 0x0d, 0x80, 0x1, 0x5, 0x1b, 0xbb,
441 0x1f, 0xd9, 0x1f, 0xd9, 0x1f, 0xd9, 0x1b, 0xbb,
444 {/* We should weed out duplicate set members. */
445 "8466 3 52737 4096 3456 {7099,8153}",
446 "8466 3 52737 4096 3456 {7099,8153}", 6, 0, NOT_ALL_PRIVATE
,
451 "zero-size overflow",
452 "#ASNs = 0, data = seq(8466 3 52737 4096 3456)",
453 {0x2, 0x0, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x0d,
456 {NULL
, NULL
, 0, 0, 0, 0, 0, 0},
460 "zero-size overflow + valid segment",
461 "seq(#AS=0:8466 3 52737),seq(4096 3456)",
462 {0x2, 0x0, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x2, 0x2, 0x10,
465 {NULL
, NULL
, 0, 0, 0, 0, 0, 0},
469 "invalid segment type",
471 {0x8, 0x2, 0x10, 0x00, 0x0d, 0x80},
473 {NULL
, NULL
, 0, 0, 0, 0, 0, 0},
475 {NULL
, NULL
, {0}, 0, {NULL
, 0, 0}}};
477 #define COMMON_ATTRS \
478 BGP_ATTR_FLAG_TRANS, BGP_ATTR_ORIGIN, 1, BGP_ORIGIN_EGP, \
479 BGP_ATTR_FLAG_TRANS, BGP_ATTR_NEXT_HOP, 4, 192, 0, 2, 0
480 #define COMMON_ATTR_SIZE 11
483 static struct aspath_tests
{
485 const struct test_segment
*segment
;
486 const char *shouldbe
; /* String it should evaluate to */
490 } as4
; /* whether data should be as4 or not (ie as2) */
491 const int result
; /* expected result for bgp_attr_parse */
492 const int cap
; /* capabilities to set for peer */
493 const char attrheader
[1024];
495 const struct test_segment
*old_segment
;
506 COMMON_ATTRS
, BGP_ATTR_FLAG_TRANS
, BGP_ATTR_AS_PATH
, 10,
508 COMMON_ATTR_SIZE
+ 3,
519 COMMON_ATTRS
, BGP_ATTR_FLAG_TRANS
, BGP_ATTR_AS_PATH
, 8,
521 COMMON_ATTR_SIZE
+ 3,
532 COMMON_ATTRS
, BGP_ATTR_FLAG_TRANS
, BGP_ATTR_AS_PATH
, 12,
534 COMMON_ATTR_SIZE
+ 3,
546 BGP_ATTR_FLAG_TRANS
| BGP_ATTR_FLAG_OPTIONAL
,
547 BGP_ATTR_AS_PATH
, 10,
549 COMMON_ATTR_SIZE
+ 3,
553 "as4_path, with as2 format data",
561 BGP_ATTR_FLAG_TRANS
| BGP_ATTR_FLAG_OPTIONAL
,
562 BGP_ATTR_AS4_PATH
, 10,
564 COMMON_ATTR_SIZE
+ 3,
568 "as4, with incorrect attr length",
576 BGP_ATTR_FLAG_TRANS
| BGP_ATTR_FLAG_OPTIONAL
,
577 BGP_ATTR_AS4_PATH
, 10,
579 COMMON_ATTR_SIZE
+ 3,
583 "basic 4-byte as-path",
588 PEER_CAP_AS4_RCV
| PEER_CAP_AS4_ADV
,
590 COMMON_ATTRS
, BGP_ATTR_FLAG_TRANS
, BGP_ATTR_AS_PATH
, 18,
592 COMMON_ATTR_SIZE
+ 3,
596 "4b AS_PATH: too short",
601 PEER_CAP_AS4_RCV
| PEER_CAP_AS4_ADV
,
603 COMMON_ATTRS
, BGP_ATTR_FLAG_TRANS
, BGP_ATTR_AS_PATH
, 16,
605 COMMON_ATTR_SIZE
+ 3,
609 "4b AS_PATH: too long",
614 PEER_CAP_AS4_RCV
| PEER_CAP_AS4_ADV
,
616 COMMON_ATTRS
, BGP_ATTR_FLAG_TRANS
, BGP_ATTR_AS_PATH
, 20,
618 COMMON_ATTR_SIZE
+ 3,
622 "4b AS_PATH: too long2",
627 PEER_CAP_AS4_RCV
| PEER_CAP_AS4_ADV
,
629 COMMON_ATTRS
, BGP_ATTR_FLAG_TRANS
, BGP_ATTR_AS_PATH
, 22,
631 COMMON_ATTR_SIZE
+ 3,
635 "4b AS_PATH: bad flags",
640 PEER_CAP_AS4_RCV
| PEER_CAP_AS4_ADV
,
643 BGP_ATTR_FLAG_TRANS
| BGP_ATTR_FLAG_OPTIONAL
,
644 BGP_ATTR_AS_PATH
, 18,
646 COMMON_ATTR_SIZE
+ 3,
650 "4b AS4_PATH w/o AS_PATH",
658 BGP_ATTR_FLAG_TRANS
| BGP_ATTR_FLAG_OPTIONAL
,
659 BGP_ATTR_AS4_PATH
, 14,
661 COMMON_ATTR_SIZE
+ 3,
665 "4b AS4_PATH: confed",
667 "8466 3 52737 4096 (123 456 789)",
673 BGP_ATTR_FLAG_TRANS
| BGP_ATTR_FLAG_OPTIONAL
,
674 BGP_ATTR_AS4_PATH
, 14,
676 COMMON_ATTR_SIZE
+ 3,
679 {NULL
, NULL
, NULL
, 0, 0, 0, {0}, 0},
682 /* prepending tests */
683 static struct tests
{
684 const struct test_segment
*test1
;
685 const struct test_segment
*test2
;
687 } prepend_tests
[] = {
692 {"8466 3 52737 4096 8722 4", "8466 3 52737 4096 8722 4", 6, 0,
693 NOT_ALL_PRIVATE
, 4096, 1, 8466},
698 {"8722 4 8482 51457 {5204}", "8722 4 8482 51457 {5204}", 5, 0,
699 NOT_ALL_PRIVATE
, 5204, 1, 8722}},
704 {"8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",
705 "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}", 7,
706 0, NOT_ALL_PRIVATE
, 5204, 1, 8482},
711 {"8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
712 " {2457,4369,61697} 1842 41590 51793",
713 "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
714 " {2457,4369,61697} 1842 41590 51793",
715 11, 0, NOT_ALL_PRIVATE
, 61697, 1, 8467}},
720 {"6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
721 "6435 59408 21665 {2457,4369,61697} 1842 41590 51793", 7, 0,
722 NOT_ALL_PRIVATE
, 1842, 1, 6435},
727 {"(123 456 789) (123 456 789) (111 222)", "", 0, 8, NOT_ALL_PRIVATE
,
731 {"(123 456 789) (111 222) [123,456,789]", "", 0, 6, NOT_ALL_PRIVATE
,
736 {"[123,456,789] (123 456 789) [111,222] 8722 {4196,48658}",
737 "8722 {4196,48658}", 2, 5, NOT_ALL_PRIVATE
, 456, 1, NULL_ASN
},
742 {"(123 456 789) [111,222] 8722 {4196,48658} [123,456,789]",
743 "8722 {4196,48658}", 2, 5, NOT_ALL_PRIVATE
, 48658, 1,
749 {"8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
750 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
751 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
752 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
753 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
754 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
755 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
756 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
757 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
758 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
759 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
760 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
761 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
762 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
763 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
764 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
765 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
766 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
767 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
768 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
769 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
770 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
771 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
772 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
773 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
774 "8466 2 52737 4096 8722 4 8722",
776 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
777 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
778 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
779 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
780 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
781 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
782 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
783 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
784 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
785 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
786 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
787 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
788 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
789 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
790 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
791 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
792 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
793 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
794 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
795 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
796 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
797 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
798 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
799 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
800 "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
801 "8466 2 52737 4096 8722 4 8722",
802 257, 0, NOT_ALL_PRIVATE
, 4096, 1000, 8466},
807 NULL
, 0, 0, 0, 0, 0, 0,
811 struct tests reconcile_tests
[] = {
815 {"6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
816 "6435 59408 21665 {2457,4369,61697} 1842 41591 51793", 7, 0,
817 NOT_ALL_PRIVATE
, 51793, 1, 6435},
822 /* AS_PATH (19) has more hops than NEW_AS_PATH,
823 * so just AS_PATH should be used (though, this practice
826 {"{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
827 "{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
828 11, 0, NOT_ALL_PRIVATE
, 51793, 1, 6435},
833 {"(123 456 789) [124,456,788] 6435 59408 21665"
834 " {2457,4369,61697} 1842 41591 51793",
835 "6435 59408 21665 {2457,4369,61697} 1842 41591 51793", 7, 4,
836 NOT_ALL_PRIVATE
, 51793, 1, 6435},
841 {"1842 41591 51793 6435 59408 21665",
842 "1842 41591 51793 6435 59408 21665", 6, 0, NOT_ALL_PRIVATE
,
848 {"23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
849 "23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
850 11, 0, NOT_ALL_PRIVATE
, 51793, 1, 1842},
855 NULL
, 0, 0, 0, 0, 0, 0,
859 struct tests aggregate_tests
[] = {
863 {"8466 3 52737 4096 {4,8722}", "8466 3 52737 4096 {4,8722}", 5,
864 0, NOT_ALL_PRIVATE
, 4, 1, 8466},
869 {"8466 3 52737 4096 {4,8722}", "8466 3 52737 4096 {4,8722}", 5,
870 0, NOT_ALL_PRIVATE
, 8722, 1, 8466},
875 {"8466 {2,3,4,4096,8722,52737}", "8466 {2,3,4,4096,8722,52737}",
876 2, 0, NOT_ALL_PRIVATE
, 8722, 5, 8466},
881 {"8466 {2,3,4,4096,8722,52737}", "8466 {2,3,4,4096,8722,52737}",
882 2, 0, NOT_ALL_PRIVATE
, 2, 20000, 8466},
888 {"6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}",
889 "6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}", 4,
890 0, NOT_ALL_PRIVATE
, 41590, 1, 6435},
893 {NULL
, NULL
, {NULL
, 0, 0}},
896 struct compare_tests
{
899 #define CMP_RES_YES 1
902 char shouldbe_confed
;
904 {0, 1, CMP_RES_NO
, CMP_RES_NO
}, {0, 2, CMP_RES_YES
, CMP_RES_NO
},
905 {0, 11, CMP_RES_YES
, CMP_RES_NO
}, {0, 15, CMP_RES_YES
, CMP_RES_NO
},
906 {0, 16, CMP_RES_NO
, CMP_RES_NO
}, {1, 11, CMP_RES_NO
, CMP_RES_NO
},
907 {6, 7, CMP_RES_NO
, CMP_RES_YES
}, {6, 8, CMP_RES_NO
, CMP_RES_NO
},
908 {7, 8, CMP_RES_NO
, CMP_RES_NO
}, {1, 9, CMP_RES_YES
, CMP_RES_NO
},
909 {0, 9, CMP_RES_NO
, CMP_RES_NO
}, {3, 9, CMP_RES_NO
, CMP_RES_NO
},
910 {0, 6, CMP_RES_NO
, CMP_RES_NO
}, {1, 6, CMP_RES_NO
, CMP_RES_NO
},
911 {0, 8, CMP_RES_NO
, CMP_RES_NO
}, {1, 8, CMP_RES_NO
, CMP_RES_NO
},
912 {11, 6, CMP_RES_NO
, CMP_RES_NO
}, {11, 7, CMP_RES_NO
, CMP_RES_NO
},
913 {11, 8, CMP_RES_NO
, CMP_RES_NO
}, {9, 6, CMP_RES_NO
, CMP_RES_YES
},
914 {9, 7, CMP_RES_NO
, CMP_RES_YES
}, {9, 8, CMP_RES_NO
, CMP_RES_NO
},
917 /* make an aspath from a data stream */
918 static struct aspath
*make_aspath(const u_char
*data
, size_t len
, int use32bit
)
920 struct stream
*s
= NULL
;
925 stream_put(s
, data
, len
);
927 as
= aspath_parse(s
, len
, use32bit
);
935 static void printbytes(const u_char
*bytes
, int len
)
940 printf("%02hhx%s", bytes
[i
], " ");
942 printf("0x%02hhx", bytes
[i
]);
948 /* validate the given aspath */
949 static int validate(struct aspath
*as
, const struct test_spec
*sp
)
951 size_t bytes
, bytes4
;
954 static struct stream
*s
;
955 struct aspath
*asinout
, *asconfeddel
, *asstr
, *as4
;
957 if (as
== NULL
&& sp
->shouldbe
== NULL
) {
958 printf("Correctly failed to parse\n");
962 out
= aspath_snmp_pathseg(as
, &bytes
);
963 asinout
= make_aspath(out
, bytes
, 0);
965 /* Excercise AS4 parsing a bit, with a dogfood test */
967 s
= stream_new(4096);
968 bytes4
= aspath_put(s
, as
, 1);
969 as4
= make_aspath(STREAM_DATA(s
), bytes4
, 1);
971 asstr
= aspath_str2aspath(sp
->shouldbe
);
973 asconfeddel
= aspath_delete_confed_seq(aspath_dup(asinout
));
975 printf("got: %s\n", aspath_print(as
));
977 /* the parsed path should match the specified 'shouldbe' string.
978 * We should pass the "eat our own dog food" test, be able to output
979 * this path and then input it again. Ie the path resulting from:
981 * aspath_parse(aspath_put(as))
985 * - also match the specified 'shouldbe' value
986 * - hash to same value as original path
987 * - have same hops and confed counts as original, and as the
988 * the specified counts
990 * aspath_str2aspath() and shouldbe should match
992 * We do the same for:
994 * aspath_parse(aspath_put(as,USE32BIT))
996 * Confederation related tests:
997 * - aspath_delete_confed_seq(aspath) should match shouldbe_confed
998 * - aspath_delete_confed_seq should be idempotent.
1000 if (strcmp(aspath_print(as
), sp
->shouldbe
)
1001 /* hash validation */
1002 || (aspath_key_make(as
) != aspath_key_make(asinout
))
1004 || strcmp(aspath_print(asinout
), sp
->shouldbe
)
1005 /* By 4-byte parsing */
1006 || strcmp(aspath_print(as4
), sp
->shouldbe
)
1007 /* by various path counts */
1008 || (aspath_count_hops(as
) != sp
->hops
)
1009 || (aspath_count_confeds(as
) != sp
->confeds
)
1010 || (aspath_count_hops(asinout
) != sp
->hops
)
1011 || (aspath_count_confeds(asinout
) != sp
->confeds
)) {
1014 printf("shouldbe:\n%s\n", sp
->shouldbe
);
1015 printf("as4:\n%s\n", aspath_print(as4
));
1016 printf("hash keys: in: %d out->in: %d\n", aspath_key_make(as
),
1017 aspath_key_make(asinout
));
1018 printf("hops: %d, counted %d %d\n", sp
->hops
,
1019 aspath_count_hops(as
), aspath_count_hops(asinout
));
1020 printf("confeds: %d, counted %d %d\n", sp
->confeds
,
1021 aspath_count_confeds(as
), aspath_count_confeds(asinout
));
1022 printf("out->in:\n%s\nbytes: ", aspath_print(asinout
));
1023 printbytes(out
, bytes
);
1025 /* basic confed related tests */
1026 if ((aspath_print(asconfeddel
) == NULL
1027 && sp
->shouldbe_delete_confed
!= NULL
)
1028 || (aspath_print(asconfeddel
) != NULL
1029 && sp
->shouldbe_delete_confed
== NULL
)
1030 || strcmp(aspath_print(asconfeddel
), sp
->shouldbe_delete_confed
)
1031 /* delete_confed_seq should be idempotent */
1032 || (aspath_key_make(asconfeddel
)
1033 != aspath_key_make(aspath_delete_confed_seq(asconfeddel
)))) {
1036 printf("as-path minus confeds is: %s\n",
1037 aspath_print(asconfeddel
));
1038 printf("as-path minus confeds should be: %s\n",
1039 sp
->shouldbe_delete_confed
);
1041 /* aspath_str2aspath test */
1042 if ((aspath_print(asstr
) == NULL
&& sp
->shouldbe
!= NULL
)
1043 || (aspath_print(asstr
) != NULL
&& sp
->shouldbe
== NULL
)
1044 || strcmp(aspath_print(asstr
), sp
->shouldbe
)) {
1047 printf("asstr: %s\n", aspath_print(asstr
));
1050 /* loop, private and first as checks */
1051 if ((sp
->does_loop
&& aspath_loop_check(as
, sp
->does_loop
) == 0)
1052 || (sp
->doesnt_loop
&& aspath_loop_check(as
, sp
->doesnt_loop
) != 0)
1053 || (aspath_private_as_check(as
) != sp
->private_as
)
1054 || (aspath_firstas_check(as
, sp
->first
) && sp
->first
== 0)) {
1057 printf("firstas: %d, got %d\n", sp
->first
,
1058 aspath_firstas_check(as
, sp
->first
));
1059 printf("loop does: %d %d, doesnt: %d %d\n", sp
->does_loop
,
1060 aspath_loop_check(as
, sp
->does_loop
), sp
->doesnt_loop
,
1061 aspath_loop_check(as
, sp
->doesnt_loop
));
1062 printf("private check: %d %d\n", sp
->private_as
,
1063 aspath_private_as_check(as
));
1065 aspath_unintern(&asinout
);
1066 aspath_unintern(&as4
);
1068 aspath_free(asconfeddel
);
1075 static void empty_get_test()
1077 struct aspath
*as
= aspath_empty_get();
1078 struct test_spec sp
= {"", "", 0, 0, 0, 0, 0, 0};
1080 printf("empty_get_test, as: %s\n", aspath_print(as
));
1081 if (!validate(as
, &sp
))
1084 printf("%s!\n", FAILED
);
1091 /* basic parsing test */
1092 static void parse_test(struct test_segment
*t
)
1096 printf("%s: %s\n", t
->name
, t
->desc
);
1098 asp
= make_aspath(t
->asdata
, t
->len
, 0);
1100 printf("aspath: %s\nvalidating...:\n", aspath_print(asp
));
1102 if (!validate(asp
, &t
->sp
))
1105 printf(FAILED
"\n");
1110 aspath_unintern(&asp
);
1113 /* prepend testing */
1114 static void prepend_test(struct tests
*t
)
1116 struct aspath
*asp1
, *asp2
, *ascratch
;
1118 printf("prepend %s: %s\n", t
->test1
->name
, t
->test1
->desc
);
1119 printf("to %s: %s\n", t
->test2
->name
, t
->test2
->desc
);
1121 asp1
= make_aspath(t
->test1
->asdata
, t
->test1
->len
, 0);
1122 asp2
= make_aspath(t
->test2
->asdata
, t
->test2
->len
, 0);
1124 ascratch
= aspath_dup(asp2
);
1125 aspath_unintern(&asp2
);
1127 asp2
= aspath_prepend(asp1
, ascratch
);
1129 printf("aspath: %s\n", aspath_print(asp2
));
1131 if (!validate(asp2
, &t
->sp
))
1134 printf("%s!\n", FAILED
);
1137 aspath_unintern(&asp1
);
1141 /* empty-prepend testing */
1142 static void empty_prepend_test(struct test_segment
*t
)
1144 struct aspath
*asp1
, *asp2
, *ascratch
;
1146 printf("empty prepend %s: %s\n", t
->name
, t
->desc
);
1148 asp1
= make_aspath(t
->asdata
, t
->len
, 0);
1149 asp2
= aspath_empty();
1151 ascratch
= aspath_dup(asp2
);
1152 aspath_unintern(&asp2
);
1154 asp2
= aspath_prepend(asp1
, ascratch
);
1156 printf("aspath: %s\n", aspath_print(asp2
));
1158 if (!validate(asp2
, &t
->sp
))
1161 printf(FAILED
"!\n");
1165 aspath_unintern(&asp1
);
1169 /* as2+as4 reconciliation testing */
1170 static void as4_reconcile_test(struct tests
*t
)
1172 struct aspath
*asp1
, *asp2
, *ascratch
;
1174 printf("reconciling %s:\n %s\n", t
->test1
->name
, t
->test1
->desc
);
1175 printf("with %s:\n %s\n", t
->test2
->name
, t
->test2
->desc
);
1177 asp1
= make_aspath(t
->test1
->asdata
, t
->test1
->len
, 0);
1178 asp2
= make_aspath(t
->test2
->asdata
, t
->test2
->len
, 0);
1180 ascratch
= aspath_reconcile_as4(asp1
, asp2
);
1182 if (!validate(ascratch
, &t
->sp
))
1185 printf(FAILED
"!\n");
1188 aspath_unintern(&asp1
);
1189 aspath_unintern(&asp2
);
1190 aspath_free(ascratch
);
1194 /* aggregation testing */
1195 static void aggregate_test(struct tests
*t
)
1197 struct aspath
*asp1
, *asp2
, *ascratch
;
1199 printf("aggregate %s: %s\n", t
->test1
->name
, t
->test1
->desc
);
1200 printf("with %s: %s\n", t
->test2
->name
, t
->test2
->desc
);
1202 asp1
= make_aspath(t
->test1
->asdata
, t
->test1
->len
, 0);
1203 asp2
= make_aspath(t
->test2
->asdata
, t
->test2
->len
, 0);
1205 ascratch
= aspath_aggregate(asp1
, asp2
);
1207 if (!validate(ascratch
, &t
->sp
))
1210 printf(FAILED
"!\n");
1213 aspath_unintern(&asp1
);
1214 aspath_unintern(&asp2
);
1215 aspath_free(ascratch
);
1216 /* aspath_unintern (ascratch);*/
1219 /* cmp_left tests */
1220 static void cmp_test()
1223 #define CMP_TESTS_MAX (sizeof(left_compare) / sizeof(struct compare_tests))
1225 for (i
= 0; i
< CMP_TESTS_MAX
; i
++) {
1226 struct test_segment
*t1
=
1227 &test_segments
[left_compare
[i
].test_index1
];
1228 struct test_segment
*t2
=
1229 &test_segments
[left_compare
[i
].test_index2
];
1230 struct aspath
*asp1
, *asp2
;
1232 printf("left cmp %s: %s\n", t1
->name
, t1
->desc
);
1233 printf("and %s: %s\n", t2
->name
, t2
->desc
);
1235 asp1
= make_aspath(t1
->asdata
, t1
->len
, 0);
1236 asp2
= make_aspath(t2
->asdata
, t2
->len
, 0);
1238 if (aspath_cmp_left(asp1
, asp2
) != left_compare
[i
].shouldbe_cmp
1239 || aspath_cmp_left(asp2
, asp1
)
1240 != left_compare
[i
].shouldbe_cmp
1241 || aspath_cmp_left_confed(asp1
, asp2
)
1242 != left_compare
[i
].shouldbe_confed
1243 || aspath_cmp_left_confed(asp2
, asp1
)
1244 != left_compare
[i
].shouldbe_confed
) {
1246 printf(FAILED
"\n");
1247 printf("result should be: cmp: %d, confed: %d\n",
1248 left_compare
[i
].shouldbe_cmp
,
1249 left_compare
[i
].shouldbe_confed
);
1250 printf("got: cmp %d, cmp_confed: %d\n",
1251 aspath_cmp_left(asp1
, asp2
),
1252 aspath_cmp_left_confed(asp1
, asp2
));
1253 printf("path1: %s\npath2: %s\n", aspath_print(asp1
),
1254 aspath_print(asp2
));
1259 aspath_unintern(&asp1
);
1260 aspath_unintern(&asp2
);
1264 static int handle_attr_test(struct aspath_tests
*t
)
1266 struct bgp bgp
= {0};
1267 struct peer peer
= {0};
1268 struct attr attr
= {0};
1270 int initfail
= failed
;
1274 asp
= make_aspath(t
->segment
->asdata
, t
->segment
->len
, 0);
1276 peer
.ibuf
= stream_new(BGP_MAX_PACKET_SIZE
);
1277 peer
.obuf
= stream_fifo_new();
1279 peer
.host
= (char *)"none";
1283 stream_write(peer
.ibuf
, t
->attrheader
, t
->len
);
1284 datalen
= aspath_put(peer
.ibuf
, asp
, t
->as4
== AS4_DATA
);
1285 if (t
->old_segment
) {
1286 char dummyaspath
[] = {BGP_ATTR_FLAG_TRANS
, BGP_ATTR_AS_PATH
,
1287 t
->old_segment
->len
};
1288 stream_write(peer
.ibuf
, dummyaspath
, sizeof(dummyaspath
));
1289 stream_write(peer
.ibuf
, t
->old_segment
->asdata
,
1290 t
->old_segment
->len
);
1291 datalen
+= sizeof(dummyaspath
) + t
->old_segment
->len
;
1294 ret
= bgp_attr_parse(&peer
, &attr
, t
->len
+ datalen
, NULL
, NULL
);
1296 if (ret
!= t
->result
) {
1297 printf("bgp_attr_parse returned %d, expected %d\n", ret
,
1299 printf("datalen %zd\n", datalen
);
1305 if (t
->shouldbe
&& attr
.aspath
== NULL
) {
1306 printf("aspath is NULL, but should be: %s\n", t
->shouldbe
);
1309 if (t
->shouldbe
&& attr
.aspath
1310 && strcmp(attr
.aspath
->str
, t
->shouldbe
)) {
1311 printf("attr str and 'shouldbe' mismatched!\n"
1314 attr
.aspath
->str
, t
->shouldbe
);
1317 if (!t
->shouldbe
&& attr
.aspath
) {
1318 printf("aspath should be NULL, but is: %s\n", attr
.aspath
->str
);
1324 aspath_unintern(&attr
.aspath
);
1326 aspath_unintern(&asp
);
1327 return failed
- initfail
;
1330 static void attr_test(struct aspath_tests
*t
)
1332 printf("%s\n", t
->desc
);
1333 printf("%s\n\n", handle_attr_test(t
) ? FAILED
: OK
);
1340 bgp_master_init(thread_master_create(NULL
));
1341 master
= bm
->master
;
1342 bgp_option_set(BGP_OPT_NO_LISTEN
);
1345 while (test_segments
[i
].name
) {
1346 printf("test %u\n", i
);
1347 parse_test(&test_segments
[i
]);
1348 empty_prepend_test(&test_segments
[i
++]);
1352 while (prepend_tests
[i
].test1
) {
1353 printf("prepend test %u\n", i
);
1354 prepend_test(&prepend_tests
[i
++]);
1358 while (aggregate_tests
[i
].test1
) {
1359 printf("aggregate test %u\n", i
);
1360 aggregate_test(&aggregate_tests
[i
++]);
1365 while (reconcile_tests
[i
].test1
) {
1366 printf("reconcile test %u\n", i
);
1367 as4_reconcile_test(&reconcile_tests
[i
++]);
1380 while (aspath_tests
[i
].desc
) {
1381 printf("aspath_attr test %d\n", i
);
1382 attr_test(&aspath_tests
[i
++]);
1385 printf("failures: %d\n", failed
);
1386 printf("aspath count: %ld\n", aspath_count());
1388 return (failed
+ aspath_count());