Line data Source code
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 : const struct test_segment *old_segment;
447 : } aspath_tests [] =
448 : {
449 : /* 0 */
450 : {
451 : "basic test",
452 : &test_segments[0],
453 : "8466 3 52737 4096",
454 : AS2_DATA, 0,
455 : 0,
456 : { BGP_ATTR_FLAG_TRANS,
457 : BGP_ATTR_AS_PATH,
458 : 10,
459 : },
460 : 3,
461 : },
462 : /* 1 */
463 : {
464 : "length too short",
465 : &test_segments[0],
466 : "8466 3 52737 4096",
467 : AS2_DATA, -1,
468 : 0,
469 : { BGP_ATTR_FLAG_TRANS,
470 : BGP_ATTR_AS_PATH,
471 : 8,
472 : },
473 : 3,
474 : },
475 : /* 2 */
476 : {
477 : "length too long",
478 : &test_segments[0],
479 : "8466 3 52737 4096",
480 : AS2_DATA, -1,
481 : 0,
482 : { BGP_ATTR_FLAG_TRANS,
483 : BGP_ATTR_AS_PATH,
484 : 12,
485 : },
486 : 3,
487 : },
488 : /* 3 */
489 : {
490 : "incorrect flag",
491 : &test_segments[0],
492 : "8466 3 52737 4096",
493 : AS2_DATA, -1,
494 : 0,
495 : { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
496 : BGP_ATTR_AS_PATH,
497 : 10,
498 : },
499 : 3,
500 : },
501 : /* 4 */
502 : {
503 : "as4_path, with as2 format data",
504 : &test_segments[0],
505 : "8466 3 52737 4096",
506 : AS2_DATA, -1,
507 : 0,
508 : { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
509 : BGP_ATTR_AS4_PATH,
510 : 10,
511 : },
512 : 3,
513 : },
514 : /* 5 */
515 : {
516 : "as4, with incorrect attr length",
517 : &test_segments[0],
518 : "8466 3 52737 4096",
519 : AS4_DATA, -1,
520 : PEER_CAP_AS4_RCV,
521 : { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
522 : BGP_ATTR_AS4_PATH,
523 : 10,
524 : },
525 : 3,
526 : },
527 : /* 6 */
528 : {
529 : "basic 4-byte as-path",
530 : &test_segments[0],
531 : "8466 3 52737 4096",
532 : AS4_DATA, 0,
533 : PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
534 : { BGP_ATTR_FLAG_TRANS,
535 : BGP_ATTR_AS_PATH,
536 : 18,
537 : },
538 : 3,
539 : },
540 : /* 7 */
541 : {
542 : "4b AS_PATH: too short",
543 : &test_segments[0],
544 : "8466 3 52737 4096",
545 : AS4_DATA, -1,
546 : PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
547 : { BGP_ATTR_FLAG_TRANS,
548 : BGP_ATTR_AS_PATH,
549 : 16,
550 : },
551 : 3,
552 : },
553 : /* 8 */
554 : {
555 : "4b AS_PATH: too long",
556 : &test_segments[0],
557 : "8466 3 52737 4096",
558 : AS4_DATA, -1,
559 : PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
560 : { BGP_ATTR_FLAG_TRANS,
561 : BGP_ATTR_AS_PATH,
562 : 20,
563 : },
564 : 3,
565 : },
566 : /* 9 */
567 : {
568 : "4b AS_PATH: too long2",
569 : &test_segments[0],
570 : "8466 3 52737 4096",
571 : AS4_DATA, -1,
572 : PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
573 : { BGP_ATTR_FLAG_TRANS,
574 : BGP_ATTR_AS_PATH,
575 : 22,
576 : },
577 : 3,
578 : },
579 : /* 10 */
580 : {
581 : "4b AS_PATH: bad flags",
582 : &test_segments[0],
583 : "8466 3 52737 4096",
584 : AS4_DATA, -1,
585 : PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
586 : { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
587 : BGP_ATTR_AS_PATH,
588 : 18,
589 : },
590 : 3,
591 : },
592 : /* 11 */
593 : {
594 : "4b AS4_PATH w/o AS_PATH",
595 : &test_segments[6],
596 : NULL,
597 : AS4_DATA, 0,
598 : PEER_CAP_AS4_ADV,
599 : { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
600 : BGP_ATTR_AS4_PATH,
601 : 14,
602 : },
603 : 3,
604 : },
605 : /* 12 */
606 : {
607 : "4b AS4_PATH: confed",
608 : &test_segments[6],
609 : "8466 3 52737 4096 (123 456 789)",
610 : AS4_DATA, 0,
611 : PEER_CAP_AS4_ADV,
612 : { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
613 : BGP_ATTR_AS4_PATH,
614 : 14,
615 : },
616 : 3,
617 : &test_segments[0],
618 : },
619 : { NULL, NULL, NULL, 0, 0, 0, { 0 }, 0 },
620 : };
621 :
622 : /* prepending tests */
623 : static struct tests {
624 : const struct test_segment *test1;
625 : const struct test_segment *test2;
626 : struct test_spec sp;
627 : } prepend_tests[] =
628 : {
629 : /* 0 */
630 : { &test_segments[0], &test_segments[1],
631 : { "8466 3 52737 4096 8722 4",
632 : "8466 3 52737 4096 8722 4",
633 : 6, 0, NOT_ALL_PRIVATE, 4096, 1, 8466 },
634 : },
635 : /* 1 */
636 : { &test_segments[1], &test_segments[3],
637 : { "8722 4 8482 51457 {5204}",
638 : "8722 4 8482 51457 {5204}",
639 : 5, 0, NOT_ALL_PRIVATE, 5204, 1, 8722 }
640 : },
641 : /* 2 */
642 : { &test_segments[3], &test_segments[4],
643 : { "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",
644 : "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",
645 : 7, 0, NOT_ALL_PRIVATE, 5204, 1, 8482 },
646 : },
647 : /* 3 */
648 : { &test_segments[4], &test_segments[5],
649 : { "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
650 : " {2457,4369,61697} 1842 41590 51793",
651 : "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
652 : " {2457,4369,61697} 1842 41590 51793",
653 : 11, 0, NOT_ALL_PRIVATE, 61697, 1, 8467 }
654 : },
655 : /* 4 */
656 : { &test_segments[5], &test_segments[6],
657 : { "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
658 : "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
659 : 7, 0, NOT_ALL_PRIVATE, 1842, 1, 6435 },
660 : },
661 : /* 5 */
662 : { &test_segments[6], &test_segments[7],
663 : { "(123 456 789) (123 456 789) (111 222)",
664 : "",
665 : 0, 8, NOT_ALL_PRIVATE, 111, 1, 0 }
666 : },
667 : { &test_segments[7], &test_segments[8],
668 : { "(123 456 789) (111 222) [123,456,789]",
669 : "",
670 : 0, 6, NOT_ALL_PRIVATE, 111, 1, 0 }
671 : },
672 : { &test_segments[8], &test_segments[9],
673 : { "[123,456,789] (123 456 789) [111,222] 8722 {4196,48658}",
674 : "[123,456,789] (123 456 789) [111,222] 8722 {4196,48658}",
675 : 2, 5, NOT_ALL_PRIVATE, 456, 1, NULL_ASN },
676 : },
677 : { &test_segments[9], &test_segments[8],
678 : { "(123 456 789) [111,222] 8722 {4196,48658} [123,456,789]",
679 : "8722 {4196,48658} [123,456,789]",
680 : 2, 5, NOT_ALL_PRIVATE, 48658, 1, NULL_ASN },
681 : },
682 : { &test_segments[14], &test_segments[11],
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 3 52737 4096 34285 8466 3 52737 4096 34285 "
694 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
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 2 52737 4096 8722 4 8722",
709 :
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 3 52737 4096 34285 8466 3 52737 4096 34285 "
721 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
722 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
723 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
724 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
725 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
726 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
727 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
728 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
729 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
730 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
731 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
732 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
733 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
734 : "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
735 : "8466 2 52737 4096 8722 4 8722",
736 : 257, 0, NOT_ALL_PRIVATE, 4096, 1000, 8466 },
737 : },
738 : { NULL, NULL, { NULL, 0, 0, 0, 0, 0, 0, } },
739 : };
740 :
741 : struct tests reconcile_tests[] =
742 : {
743 : { &test_segments[18], &test_segments[19],
744 : { "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
745 : "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
746 : 7, 0, NOT_ALL_PRIVATE, 51793, 1, 6435 },
747 : },
748 : { &test_segments[19], &test_segments[18],
749 : /* AS_PATH (19) has more hops than NEW_AS_PATH,
750 : * so just AS_PATH should be used (though, this practice
751 : * is bad imho).
752 : */
753 : { "{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
754 : "{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
755 : 11, 0, NOT_ALL_PRIVATE, 51793, 1, 6435 },
756 : },
757 : { &test_segments[20], &test_segments[19],
758 : { "(123 456 789) [124,456,788] 6435 59408 21665"
759 : " {2457,4369,61697} 1842 41591 51793",
760 : "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
761 : 7, 4, NOT_ALL_PRIVATE, 51793, 1, 6435 },
762 : },
763 : { &test_segments[21], &test_segments[22],
764 : { "1842 41591 51793 6435 59408 21665",
765 : "1842 41591 51793 6435 59408 21665",
766 : 6, 0, NOT_ALL_PRIVATE, 51793, 1, 1842 },
767 : },
768 : { &test_segments[23], &test_segments[22],
769 : { "23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
770 : "23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
771 : 11, 0, NOT_ALL_PRIVATE, 51793, 1, 1842 },
772 : },
773 : { NULL, NULL, { NULL, 0, 0, 0, 0, 0, 0, } },
774 : };
775 :
776 : struct tests aggregate_tests[] =
777 : {
778 : { &test_segments[0], &test_segments[2],
779 : { "8466 3 52737 4096 {4,8722}",
780 : "8466 3 52737 4096 {4,8722}",
781 : 5, 0, NOT_ALL_PRIVATE, 4, 1, 8466 },
782 : },
783 : { &test_segments[2], &test_segments[0],
784 : { "8466 3 52737 4096 {4,8722}",
785 : "8466 3 52737 4096 {4,8722}",
786 : 5, 0, NOT_ALL_PRIVATE, 8722, 1, 8466 },
787 : },
788 : { &test_segments[2], &test_segments[10],
789 : { "8466 {2,3,4,4096,8722,52737}",
790 : "8466 {2,3,4,4096,8722,52737}",
791 : 2, 0, NOT_ALL_PRIVATE, 8722, 5, 8466 },
792 : },
793 : { &test_segments[10], &test_segments[2],
794 : { "8466 {2,3,4,4096,8722,52737}",
795 : "8466 {2,3,4,4096,8722,52737}",
796 : 2, 0, NOT_ALL_PRIVATE, 2, 20000, 8466 },
797 : },
798 :
799 : { &test_segments[5], &test_segments[18],
800 : { "6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}",
801 : "6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}",
802 : 4, 0, NOT_ALL_PRIVATE, 41590, 1, 6435 },
803 : },
804 :
805 : { NULL, NULL, { NULL, 0, 0} },
806 : };
807 :
808 : struct compare_tests
809 : {
810 : int test_index1;
811 : int test_index2;
812 : #define CMP_RES_YES 1
813 : #define CMP_RES_NO 0
814 : char shouldbe_cmp;
815 : char shouldbe_confed;
816 : } left_compare [] =
817 : {
818 : { 0, 1, CMP_RES_NO, CMP_RES_NO },
819 : { 0, 2, CMP_RES_YES, CMP_RES_NO },
820 : { 0, 11, CMP_RES_YES, CMP_RES_NO },
821 : { 0, 15, CMP_RES_YES, CMP_RES_NO },
822 : { 0, 16, CMP_RES_NO, CMP_RES_NO },
823 : { 1, 11, CMP_RES_NO, CMP_RES_NO },
824 : { 6, 7, CMP_RES_NO, CMP_RES_YES },
825 : { 6, 8, CMP_RES_NO, CMP_RES_NO },
826 : { 7, 8, CMP_RES_NO, CMP_RES_NO },
827 : { 1, 9, CMP_RES_YES, CMP_RES_NO },
828 : { 0, 9, CMP_RES_NO, CMP_RES_NO },
829 : { 3, 9, CMP_RES_NO, CMP_RES_NO },
830 : { 0, 6, CMP_RES_NO, CMP_RES_NO },
831 : { 1, 6, CMP_RES_NO, CMP_RES_NO },
832 : { 0, 8, CMP_RES_NO, CMP_RES_NO },
833 : { 1, 8, CMP_RES_NO, CMP_RES_NO },
834 : { 11, 6, CMP_RES_NO, CMP_RES_NO },
835 : { 11, 7, CMP_RES_NO, CMP_RES_NO },
836 : { 11, 8, CMP_RES_NO, CMP_RES_NO },
837 : { 9, 6, CMP_RES_NO, CMP_RES_YES },
838 : { 9, 7, CMP_RES_NO, CMP_RES_YES },
839 : { 9, 8, CMP_RES_NO, CMP_RES_NO },
840 : };
841 :
842 : /* make an aspath from a data stream */
843 : static struct aspath *
844 295 : make_aspath (const u_char *data, size_t len, int use32bit)
845 : {
846 295 : struct stream *s = NULL;
847 : struct aspath *as;
848 :
849 295 : if (len)
850 : {
851 286 : s = stream_new (len);
852 286 : stream_put (s, data, len);
853 : }
854 295 : as = aspath_parse (s, len, use32bit);
855 :
856 295 : if (s)
857 286 : stream_free (s);
858 :
859 295 : return as;
860 : }
861 :
862 : static void
863 0 : printbytes (const u_char *bytes, int len)
864 : {
865 0 : int i = 0;
866 0 : while (i < len)
867 : {
868 0 : if (i % 2)
869 0 : printf ("%02hhx%s", bytes[i], " ");
870 : else
871 0 : printf ("0x%02hhx", bytes[i]);
872 0 : i++;
873 : }
874 0 : printf ("\n");
875 0 : }
876 :
877 : /* validate the given aspath */
878 : static int
879 77 : validate (struct aspath *as, const struct test_spec *sp)
880 : {
881 : size_t bytes, bytes4;
882 77 : int fails = 0;
883 : const u_char *out;
884 : static struct stream *s;
885 : struct aspath *asinout, *asconfeddel, *asstr, *as4;
886 :
887 77 : if (as == NULL && sp->shouldbe == NULL)
888 : {
889 6 : printf ("Correctly failed to parse\n");
890 6 : return fails;
891 : }
892 :
893 71 : out = aspath_snmp_pathseg (as, &bytes);
894 71 : asinout = make_aspath (out, bytes, 0);
895 :
896 : /* Excercise AS4 parsing a bit, with a dogfood test */
897 71 : if (!s)
898 1 : s = stream_new (4096);
899 71 : bytes4 = aspath_put (s, as, 1);
900 71 : as4 = make_aspath (STREAM_DATA(s), bytes4, 1);
901 :
902 71 : asstr = aspath_str2aspath (sp->shouldbe);
903 :
904 71 : asconfeddel = aspath_delete_confed_seq (aspath_dup (asinout));
905 :
906 71 : printf ("got: %s\n", aspath_print(as));
907 :
908 : /* the parsed path should match the specified 'shouldbe' string.
909 : * We should pass the "eat our own dog food" test, be able to output
910 : * this path and then input it again. Ie the path resulting from:
911 : *
912 : * aspath_parse(aspath_put(as))
913 : *
914 : * should:
915 : *
916 : * - also match the specified 'shouldbe' value
917 : * - hash to same value as original path
918 : * - have same hops and confed counts as original, and as the
919 : * the specified counts
920 : *
921 : * aspath_str2aspath() and shouldbe should match
922 : *
923 : * We do the same for:
924 : *
925 : * aspath_parse(aspath_put(as,USE32BIT))
926 : *
927 : * Confederation related tests:
928 : * - aspath_delete_confed_seq(aspath) should match shouldbe_confed
929 : * - aspath_delete_confed_seq should be idempotent.
930 : */
931 71 : if (strcmp(aspath_print (as), sp->shouldbe)
932 : /* hash validation */
933 71 : || (aspath_key_make (as) != aspath_key_make (asinout))
934 : /* by string */
935 71 : || strcmp(aspath_print (asinout), sp->shouldbe)
936 : /* By 4-byte parsing */
937 71 : || strcmp(aspath_print (as4), sp->shouldbe)
938 : /* by various path counts */
939 71 : || (aspath_count_hops (as) != sp->hops)
940 71 : || (aspath_count_confeds (as) != sp->confeds)
941 71 : || (aspath_count_hops (asinout) != sp->hops)
942 71 : || (aspath_count_confeds (asinout) != sp->confeds))
943 : {
944 0 : failed++;
945 0 : fails++;
946 0 : printf ("shouldbe:\n%s\n", sp->shouldbe);
947 0 : printf ("as4:\n%s\n", aspath_print (as4));
948 0 : printf ("hash keys: in: %d out->in: %d\n",
949 : aspath_key_make (as), aspath_key_make (asinout));
950 0 : printf ("hops: %d, counted %d %d\n", sp->hops,
951 : aspath_count_hops (as),
952 : aspath_count_hops (asinout) );
953 0 : printf ("confeds: %d, counted %d %d\n", sp->confeds,
954 : aspath_count_confeds (as),
955 : aspath_count_confeds (asinout));
956 0 : printf ("out->in:\n%s\nbytes: ", aspath_print(asinout));
957 0 : printbytes (out, bytes);
958 : }
959 : /* basic confed related tests */
960 71 : if ((aspath_print (asconfeddel) == NULL
961 0 : && sp->shouldbe_delete_confed != NULL)
962 71 : || (aspath_print (asconfeddel) != NULL
963 71 : && sp->shouldbe_delete_confed == NULL)
964 71 : || strcmp(aspath_print (asconfeddel), sp->shouldbe_delete_confed)
965 : /* delete_confed_seq should be idempotent */
966 142 : || (aspath_key_make (asconfeddel)
967 71 : != aspath_key_make (aspath_delete_confed_seq (asconfeddel))))
968 : {
969 0 : failed++;
970 0 : fails++;
971 0 : printf ("confed_del: %s\n", aspath_print (asconfeddel));
972 0 : printf ("should be: %s\n", sp->shouldbe_delete_confed);
973 : }
974 : /* aspath_str2aspath test */
975 71 : if ((aspath_print (asstr) == NULL && sp->shouldbe != NULL)
976 71 : || (aspath_print (asstr) != NULL && sp->shouldbe == NULL)
977 71 : || strcmp(aspath_print (asstr), sp->shouldbe))
978 : {
979 0 : failed++;
980 0 : fails++;
981 0 : printf ("asstr: %s\n", aspath_print (asstr));
982 : }
983 :
984 : /* loop, private and first as checks */
985 71 : if ((sp->does_loop && aspath_loop_check (as, sp->does_loop) == 0)
986 71 : || (sp->doesnt_loop && aspath_loop_check (as, sp->doesnt_loop) != 0)
987 71 : || (aspath_private_as_check (as) != sp->private_as)
988 71 : || (aspath_firstas_check (as,sp->first)
989 49 : && sp->first == 0))
990 : {
991 0 : failed++;
992 0 : fails++;
993 0 : printf ("firstas: %d, got %d\n", sp->first,
994 : aspath_firstas_check (as,sp->first));
995 0 : printf ("loop does: %d %d, doesnt: %d %d\n",
996 : sp->does_loop, aspath_loop_check (as, sp->does_loop),
997 : sp->doesnt_loop, aspath_loop_check (as, sp->doesnt_loop));
998 0 : printf ("private check: %d %d\n", sp->private_as,
999 : aspath_private_as_check (as));
1000 : }
1001 71 : aspath_unintern (&asinout);
1002 71 : aspath_unintern (&as4);
1003 :
1004 71 : aspath_free (asconfeddel);
1005 71 : aspath_free (asstr);
1006 71 : stream_reset (s);
1007 :
1008 71 : return fails;
1009 : }
1010 :
1011 : static void
1012 1 : empty_get_test ()
1013 : {
1014 1 : struct aspath *as = aspath_empty_get ();
1015 1 : struct test_spec sp = { "", "", 0, 0, 0, 0, 0, 0 };
1016 :
1017 1 : printf ("empty_get_test, as: %s\n",aspath_print (as));
1018 1 : if (!validate (as, &sp))
1019 1 : printf ("%s\n", OK);
1020 : else
1021 0 : printf ("%s!\n", FAILED);
1022 :
1023 1 : printf ("\n");
1024 :
1025 1 : aspath_free (as);
1026 1 : }
1027 :
1028 : /* basic parsing test */
1029 : static void
1030 28 : parse_test (struct test_segment *t)
1031 : {
1032 : struct aspath *asp;
1033 :
1034 28 : printf ("%s: %s\n", t->name, t->desc);
1035 :
1036 28 : asp = make_aspath (t->asdata, t->len, 0);
1037 :
1038 28 : printf ("aspath: %s\nvalidating...:\n", aspath_print (asp));
1039 :
1040 28 : if (!validate (asp, &t->sp))
1041 28 : printf (OK "\n");
1042 : else
1043 0 : printf (FAILED "\n");
1044 :
1045 28 : printf ("\n");
1046 :
1047 28 : if (asp)
1048 25 : aspath_unintern (&asp);
1049 28 : }
1050 :
1051 : /* prepend testing */
1052 : static void
1053 10 : prepend_test (struct tests *t)
1054 : {
1055 : struct aspath *asp1, *asp2, *ascratch;
1056 :
1057 10 : printf ("prepend %s: %s\n", t->test1->name, t->test1->desc);
1058 10 : printf ("to %s: %s\n", t->test2->name, t->test2->desc);
1059 :
1060 10 : asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
1061 10 : asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
1062 :
1063 10 : ascratch = aspath_dup (asp2);
1064 10 : aspath_unintern (&asp2);
1065 :
1066 10 : asp2 = aspath_prepend (asp1, ascratch);
1067 :
1068 10 : printf ("aspath: %s\n", aspath_print (asp2));
1069 :
1070 10 : if (!validate (asp2, &t->sp))
1071 10 : printf ("%s\n", OK);
1072 : else
1073 0 : printf ("%s!\n", FAILED);
1074 :
1075 10 : printf ("\n");
1076 10 : aspath_unintern (&asp1);
1077 10 : aspath_free (asp2);
1078 10 : }
1079 :
1080 : /* empty-prepend testing */
1081 : static void
1082 28 : empty_prepend_test (struct test_segment *t)
1083 : {
1084 : struct aspath *asp1, *asp2, *ascratch;
1085 :
1086 28 : printf ("empty prepend %s: %s\n", t->name, t->desc);
1087 :
1088 28 : asp1 = make_aspath (t->asdata, t->len, 0);
1089 28 : asp2 = aspath_empty ();
1090 :
1091 28 : ascratch = aspath_dup (asp2);
1092 28 : aspath_unintern (&asp2);
1093 :
1094 28 : asp2 = aspath_prepend (asp1, ascratch);
1095 :
1096 28 : printf ("aspath: %s\n", aspath_print (asp2));
1097 :
1098 28 : if (!validate (asp2, &t->sp))
1099 28 : printf (OK "\n");
1100 : else
1101 0 : printf (FAILED "!\n");
1102 :
1103 28 : printf ("\n");
1104 28 : if (asp1)
1105 25 : aspath_unintern (&asp1);
1106 28 : aspath_free (asp2);
1107 28 : }
1108 :
1109 : /* as2+as4 reconciliation testing */
1110 : static void
1111 5 : as4_reconcile_test (struct tests *t)
1112 : {
1113 : struct aspath *asp1, *asp2, *ascratch;
1114 :
1115 5 : printf ("reconciling %s:\n %s\n", t->test1->name, t->test1->desc);
1116 5 : printf ("with %s:\n %s\n", t->test2->name, t->test2->desc);
1117 :
1118 5 : asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
1119 5 : asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
1120 :
1121 5 : ascratch = aspath_reconcile_as4 (asp1, asp2);
1122 :
1123 5 : if (!validate (ascratch, &t->sp))
1124 5 : printf (OK "\n");
1125 : else
1126 0 : printf (FAILED "!\n");
1127 :
1128 5 : printf ("\n");
1129 5 : aspath_unintern (&asp1);
1130 5 : aspath_unintern (&asp2);
1131 5 : aspath_free (ascratch);
1132 5 : }
1133 :
1134 :
1135 : /* aggregation testing */
1136 : static void
1137 5 : aggregate_test (struct tests *t)
1138 : {
1139 : struct aspath *asp1, *asp2, *ascratch;
1140 :
1141 5 : printf ("aggregate %s: %s\n", t->test1->name, t->test1->desc);
1142 5 : printf ("with %s: %s\n", t->test2->name, t->test2->desc);
1143 :
1144 5 : asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
1145 5 : asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
1146 :
1147 5 : ascratch = aspath_aggregate (asp1, asp2);
1148 :
1149 5 : if (!validate (ascratch, &t->sp))
1150 5 : printf (OK "\n");
1151 : else
1152 0 : printf (FAILED "!\n");
1153 :
1154 5 : printf ("\n");
1155 5 : aspath_unintern (&asp1);
1156 5 : aspath_unintern (&asp2);
1157 5 : aspath_free (ascratch);
1158 : /* aspath_unintern (ascratch);*/
1159 5 : }
1160 :
1161 : /* cmp_left tests */
1162 : static void
1163 1 : cmp_test ()
1164 : {
1165 : unsigned int i;
1166 : #define CMP_TESTS_MAX \
1167 : (sizeof(left_compare) / sizeof (struct compare_tests))
1168 :
1169 23 : for (i = 0; i < CMP_TESTS_MAX; i++)
1170 : {
1171 22 : struct test_segment *t1 = &test_segments[left_compare[i].test_index1];
1172 22 : struct test_segment *t2 = &test_segments[left_compare[i].test_index2];
1173 : struct aspath *asp1, *asp2;
1174 :
1175 22 : printf ("left cmp %s: %s\n", t1->name, t1->desc);
1176 22 : printf ("and %s: %s\n", t2->name, t2->desc);
1177 :
1178 22 : asp1 = make_aspath (t1->asdata, t1->len, 0);
1179 22 : asp2 = make_aspath (t2->asdata, t2->len, 0);
1180 :
1181 22 : if (aspath_cmp_left (asp1, asp2) != left_compare[i].shouldbe_cmp
1182 22 : || aspath_cmp_left (asp2, asp1) != left_compare[i].shouldbe_cmp
1183 44 : || aspath_cmp_left_confed (asp1, asp2)
1184 22 : != left_compare[i].shouldbe_confed
1185 44 : || aspath_cmp_left_confed (asp2, asp1)
1186 22 : != left_compare[i].shouldbe_confed)
1187 : {
1188 0 : failed++;
1189 0 : printf (FAILED "\n");
1190 0 : printf ("result should be: cmp: %d, confed: %d\n",
1191 0 : left_compare[i].shouldbe_cmp,
1192 0 : left_compare[i].shouldbe_confed);
1193 0 : printf ("got: cmp %d, cmp_confed: %d\n",
1194 : aspath_cmp_left (asp1, asp2),
1195 : aspath_cmp_left_confed (asp1, asp2));
1196 0 : printf("path1: %s\npath2: %s\n", aspath_print (asp1),
1197 : aspath_print (asp2));
1198 : }
1199 : else
1200 22 : printf (OK "\n");
1201 :
1202 22 : printf ("\n");
1203 22 : aspath_unintern (&asp1);
1204 22 : aspath_unintern (&asp2);
1205 : }
1206 1 : }
1207 :
1208 : static int
1209 13 : handle_attr_test (struct aspath_tests *t)
1210 : {
1211 13 : struct bgp bgp = { 0 };
1212 13 : struct peer peer = { 0 };
1213 13 : struct attr attr = { 0 };
1214 : int ret;
1215 13 : int initfail = failed;
1216 : struct aspath *asp;
1217 : size_t datalen;
1218 :
1219 13 : asp = make_aspath (t->segment->asdata, t->segment->len, 0);
1220 :
1221 13 : peer.ibuf = stream_new (BGP_MAX_PACKET_SIZE);
1222 13 : peer.obuf = stream_fifo_new ();
1223 13 : peer.bgp = &bgp;
1224 13 : peer.host = (char *)"none";
1225 13 : peer.fd = -1;
1226 13 : peer.cap = t->cap;
1227 :
1228 13 : stream_write (peer.ibuf, t->attrheader, t->len);
1229 13 : datalen = aspath_put (peer.ibuf, asp, t->as4 == AS4_DATA);
1230 13 : if (t->old_segment)
1231 : {
1232 2 : char dummyaspath[] = { BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH,
1233 1 : t->old_segment->len };
1234 1 : stream_write (peer.ibuf, dummyaspath, sizeof (dummyaspath));
1235 1 : stream_write (peer.ibuf, t->old_segment->asdata, t->old_segment->len);
1236 1 : datalen += sizeof (dummyaspath) + t->old_segment->len;
1237 : }
1238 :
1239 13 : ret = bgp_attr_parse (&peer, &attr, t->len + datalen, NULL, NULL);
1240 :
1241 13 : if (ret != t->result)
1242 : {
1243 0 : printf ("bgp_attr_parse returned %d, expected %d\n", ret, t->result);
1244 0 : printf ("datalen %zd\n", datalen);
1245 0 : failed++;
1246 : }
1247 13 : if (ret != 0)
1248 9 : goto out;
1249 :
1250 4 : if (t->shouldbe && attr.aspath == NULL)
1251 : {
1252 0 : printf ("aspath is NULL, but should be: %s\n", t->shouldbe);
1253 0 : failed++;
1254 : }
1255 4 : if (t->shouldbe && attr.aspath && strcmp (attr.aspath->str, t->shouldbe))
1256 : {
1257 0 : printf ("attr str and 'shouldbe' mismatched!\n"
1258 : "attr str: %s\n"
1259 : "shouldbe: %s\n",
1260 0 : attr.aspath->str, t->shouldbe);
1261 0 : failed++;
1262 : }
1263 4 : if (!t->shouldbe && attr.aspath)
1264 : {
1265 0 : printf ("aspath should be NULL, but is: %s\n", attr.aspath->str);
1266 0 : failed++;
1267 : }
1268 :
1269 : out:
1270 13 : if (attr.aspath)
1271 3 : aspath_unintern (&attr.aspath);
1272 13 : if (asp)
1273 13 : aspath_unintern (&asp);
1274 13 : return failed - initfail;
1275 : }
1276 :
1277 : static void
1278 13 : attr_test (struct aspath_tests *t)
1279 : {
1280 13 : printf ("%s\n", t->desc);
1281 13 : printf ("%s\n\n", handle_attr_test (t) ? FAILED : OK);
1282 13 : }
1283 :
1284 : int
1285 1 : main (void)
1286 : {
1287 1 : int i = 0;
1288 1 : bgp_master_init ();
1289 1 : master = bm->master;
1290 1 : bgp_option_set (BGP_OPT_NO_LISTEN);
1291 1 : bgp_attr_init ();
1292 :
1293 30 : while (test_segments[i].name)
1294 : {
1295 28 : printf ("test %u\n", i);
1296 28 : parse_test (&test_segments[i]);
1297 28 : empty_prepend_test (&test_segments[i++]);
1298 : }
1299 :
1300 1 : i = 0;
1301 12 : while (prepend_tests[i].test1)
1302 : {
1303 10 : printf ("prepend test %u\n", i);
1304 10 : prepend_test (&prepend_tests[i++]);
1305 : }
1306 :
1307 1 : i = 0;
1308 7 : while (aggregate_tests[i].test1)
1309 : {
1310 5 : printf ("aggregate test %u\n", i);
1311 5 : aggregate_test (&aggregate_tests[i++]);
1312 : }
1313 :
1314 1 : i = 0;
1315 :
1316 7 : while (reconcile_tests[i].test1)
1317 : {
1318 5 : printf ("reconcile test %u\n", i);
1319 5 : as4_reconcile_test (&reconcile_tests[i++]);
1320 : }
1321 :
1322 1 : i = 0;
1323 :
1324 1 : cmp_test();
1325 :
1326 1 : i = 0;
1327 :
1328 1 : empty_get_test();
1329 :
1330 1 : i = 0;
1331 :
1332 15 : while (aspath_tests[i].desc)
1333 : {
1334 13 : printf ("aspath_attr test %d\n", i);
1335 13 : attr_test (&aspath_tests[i++]);
1336 : }
1337 :
1338 1 : printf ("failures: %d\n", failed);
1339 1 : printf ("aspath count: %ld\n", aspath_count());
1340 :
1341 1 : return (failed + aspath_count());
1342 : }
|