1 struct rde_peer peer = {
2 	.conf.local_as = 42,
3 	.conf.remote_as = 22512,
4 };
5 struct rde_peer peer_l4 = {
6 	.conf.local_as = 196618,
7 	.conf.remote_as = 22512,
8 };
9 struct rde_peer peer_r4 = {
10 	.conf.local_as = 22512,
11 	.conf.remote_as = 196618,
12 };
13 struct rde_peer peer_b4 = {
14 	.conf.local_as = 196618,
15 	.conf.remote_as = 424242,
16 };
17 
18 struct vector {
19 	uint8_t	*data;
20 	size_t	size;
21 	uint8_t	*expected;
22 	size_t	expsize;
23 } vectors[] = {
24 
25 	{
26 		.data = "\xc0\x08\x04\x00\x00\x48\xce",
27 		.size = 7
28 	},
29 	{
30 		.data = "\xc0\x08\x04\x0f\x10\xc8\x02",
31 		.size = 7
32 	},
33 	{
34 		.data = "\xc0\x08\x04\x3b\xc0\x00\xc9",
35 		.size = 7
36 	},
37 	{
38 		.data = "\xe0\x08\x04\x4e\x97\x00\x03",
39 		.size = 7
40 	},
41 	{
42 		.data = "\xe0\x08\x08\x3b\xc0\x00\xc9\x3b\xc0\x00\xcb",
43 		.size = 11
44 	},
45 	{
46 		.data = "\xc0\x08\x08\x9e\x19\x7a\x44\x9e\x19\x7a\x45",
47 		.size = 11
48 	},
49 	{
50 		.data = "\xc0\x08\x14\x00\x00\x0b\x5a\x00\x00\x3f\x89\x00\x00"
51 		    "\x3f\x94\x00\x00\x48\xce\x00\x00\xa2\xda",
52 		.size = 23
53 	},
54 	{
55 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x00\x40",
56 		.size = 11
57 	},
58 	{
59 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x00\x42",
60 		.size = 11
61 	},
62 	{
63 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x00\xb2",
64 		.size = 11
65 	},
66 	{
67 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x00\xd3",
68 		.size = 11
69 	},
70 	{
71 		.data = "\xe0\x10\x08\x00\x02\xfc\x00\x00\x00\x01\x10",
72 		.size = 11
73 	},
74 	{
75 		.data = "\xe0\x10\x08\x00\x02\xfc\x00\x00\x00\x01\x1e",
76 		.size = 11
77 	},
78 	{
79 		.data = "\xe0\x10\x08\x00\x02\xfc\x00\x00\x00\x01\x29",
80 		.size = 11
81 	},
82 	{
83 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x01\xb6",
84 		.size = 11
85 	},
86 	{
87 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x01\xe0",
88 		.size = 11
89 	},
90 	{
91 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x02\x8b",
92 		.size = 11
93 	},
94 	{
95 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x02\xc5",
96 		.size = 11
97 	},
98 	{
99 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x03\xc2",
100 		.size = 11
101 	},
102 	{
103 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x04\x09",
104 		.size = 11
105 	},
106 	{
107 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x04\xe4",
108 		.size = 11
109 	},
110 	{
111 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x05\x57",
112 		.size = 11
113 	},
114 	{
115 		.data = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x05\x92",
116 		.size = 11
117 	},
118 	{
119 		.data = "\xc0\x10\x08\x00\x02\xfd\xe8\x00\x00\x2a\xf8",
120 		.size = 11
121 	},
122 	{
123 		.data = "\xc0\x20\x0c\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
124 		    "\x00\x03",
125 		.size = 15
126 	},
127 	{
128 		.data = "\xc0\x20\x18\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
129 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
130 		    "\x00\x03",
131 		.size = 27
132 	},
133 	{
134 		.data = "\xe0\x20\x24\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
135 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
136 		    "\x00\x03\x00\x00\xed\x5f\x00\x00\xed\x5f\x00\x00"
137 		    "\xed\x5f",
138 		.size = 39
139 	},
140 	{
141 		.data = "\xe0\x20\x24\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
142 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
143 		    "\x00\x03\x00\x03\x16\x49\x00\x03\x16\x49\x00\x00"
144 		    "\x00\x64",
145 		.size = 39
146 	},
147 	{
148 		.data = "\xe0\x20\x24\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
149 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
150 		    "\x00\x03\x00\x03\x16\xa9\x00\x03\x16\xa9\x00\x00"
151 		    "\x00\x00",
152 		.size = 39
153 	},
154 	{
155 		.data = "\xe0\x20\x24\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
156 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
157 		    "\x00\x03\x00\x03\x24\x92\x00\x00\x00\x03\x00\x00"
158 		    "\x00\x01",
159 		.size = 39
160 	},
161 	{
162 		.data = "\xe0\x20\x24\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
163 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
164 		    "\x00\x03\x00\x03\x25\x4b\x00\x00\x00\xc8\x00\x00"
165 		    "\x00\x00",
166 		.size = 39
167 	},
168 	{
169 		.data = "\xe0\x20\x24\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
170 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
171 		    "\x00\x03\x00\x03\x26\x8f\x00\x00\x01\x2c\x00\x00"
172 		    "\x00\x00",
173 		.size = 39
174 	},
175 	{
176 		.data = "\xe0\x20\x24\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
177 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
178 		    "\x00\x03\x00\x03\x26\xa3\x00\x00\x02\x58\x00\x03"
179 		    "\x26\xa3",
180 		.size = 39
181 	},
182 	{
183 		.data = "\xe0\x20\x24\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
184 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
185 		    "\x00\x03\x00\x03\x33\xc8\x00\x00\x07\xd0\x00\x00"
186 		    "\x00\x1e",
187 		.size = 39
188 	},
189 	{
190 		.data = "\xe0\x20\x30\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
191 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
192 		    "\x00\x03\x00\x00\xdf\x1e\x00\x00\x00\x1e\x00\x00"
193 		    "\x00\x00\x00\x00\xdf\x1e\x00\x00\x00\x1e\x00\x00"
194 		    "\x00\x0a",
195 		.size = 51
196 	},
197 	{
198 		.data = "\xe0\x20\x30\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
199 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
200 		    "\x00\x03\x00\x03\x1c\xe3\x00\x00\x00\x01\x00\x00"
201 		    "\x00\x00\x00\x03\x1c\xe3\x00\x00\x00\x01\x00\x00"
202 		    "\x00\x02",
203 		.size = 51
204 	},
205 	{
206 		.data = "\xe0\x20\x30\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
207 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
208 		    "\x00\x03\x00\x03\x26\xa3\x00\x00\x02\x58\x00\x03"
209 		    "\x26\xa3\x00\x03\x26\xa3\x00\x03\x26\xa3\x00\x00"
210 		    "\x00\xc8",
211 		.size = 51
212 	},
213 	{
214 		.data = "\xe0\x20\x30\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
215 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
216 		    "\x00\x03\x00\x03\x27\xdd\x00\x00\x00\x00\x00\x00"
217 		    "\x00\x00\x00\x03\x27\xdd\x00\x00\x00\x00\x00\x00"
218 		    "\x23\x49",
219 		.size = 51
220 	},
221 	{
222 		.data = "\xe0\x20\x30\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
223 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
224 		    "\x00\x03\x00\x03\x27\xdd\x00\x00\x00\x00\x00\x00"
225 		    "\x00\x00\x00\x03\x27\xdd\x00\x00\x00\x00\x00\x00"
226 		    "\xc2\x51",
227 		.size = 51
228 	},
229 	{
230 		.data = "\xe0\x20\x30\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
231 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
232 		    "\x00\x03\x00\x03\x28\xe8\x00\x00\x00\x00\x00\x00"
233 		    "\x00\x00\x00\x03\x28\xe8\x00\x00\x00\x01\x00\x00"
234 		    "\x00\x00",
235 		.size = 51
236 	},
237 	{
238 		.data = "\xe0\x20\x3c\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
239 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
240 		    "\x00\x03\x00\x02\x1a\xcd\x00\x00\xfc\x00\x00\x00"
241 		    "\x00\x0b\x00\x02\x1a\xcd\x00\x00\xfc\x00\x00\x00"
242 		    "\x00\x15\x00\x02\x1a\xcd\x00\x00\xff\xed\x00\x00"
243 		    "\x00\x01",
244 		.size = 63
245 	},
246 	{
247 		.data = "\xe0\x20\x3c\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
248 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
249 		    "\x00\x03\x00\x03\x16\xa9\x00\x00\x00\x00\x00\x03"
250 		    "\x35\x3a\x00\x03\x16\xa9\x00\x03\x16\xa9\x00\x00"
251 		    "\x00\x00\x00\x03\x26\xa3\x00\x03\x26\xa3\x00\x00"
252 		    "\x03\x84",
253 		.size = 63
254 	},
255 	{
256 		.data = "\xe0\x20\x3c\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
257 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
258 		    "\x00\x03\x00\x03\x16\xa9\x00\x03\x16\xa9\x00\x03"
259 		    "\x16\xa9\x00\x03\x26\xa3\x00\x00\x01\x2c\x00\x00"
260 		    "\x03\xe7\x00\x03\x26\xa3\x00\x00\x02\x58\x00\x03"
261 		    "\x26\xa3",
262 		.size = 63
263 	},
264 	{
265 		.data = "\xe0\x20\xb4\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
266 		    "\x00\x01\x00\x00\xd0\x5b\x00\x00\x00\x0b\x00\x00"
267 		    "\x00\x03\x00\x03\x22\xd3\x00\x00\x00\x0a\x00\x00"
268 		    "\x00\x0a\x00\x03\x22\xd3\x00\x00\x00\x0a\x00\x00"
269 		    "\x00\xc9\x00\x03\x22\xd3\x00\x00\x00\x0a\x00\x00"
270 		    "\x00\xca\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
271 		    "\x00\x0b\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
272 		    "\x00\x64\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
273 		    "\x00\x65\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
274 		    "\x00\x66\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
275 		    "\x00\x67\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
276 		    "\x00\x68\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
277 		    "\x00\xc8\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
278 		    "\x00\xcf\x00\x03\x22\xd3\x00\x00\x00\x14\x00\x00"
279 		    "\x00\xd0\x00\x03\x22\xd3\x00\x00\x00\x79\x00\x00"
280 		    "\x00\x00",
281 		.size = 183
282 	},
283 	{
284 		.data = "\xc0\x10\x08\x43\x00\x00\x00\x00\x00\x00\x02",
285 		.size = 11,
286 		.expected = "",
287 		.expsize = 0,
288 	},
289 	{
290 		.data = "\xc0\x10\x10\x00\x02\xfc\x00\x00\x00\x00\x40"
291 		    "\x43\x00\x00\x00\x00\x00\x00\x02",
292 		.size = 19,
293 		.expected = "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x00\x40",
294 		.expsize = 11,
295 	},
296 	{
297 		.data = "\xc0\x10\x18\x00\x02\xfc\x00\x00\x00\x00\x40"
298 		    "\x43\x00\x00\x00\x00\x00\x00\x02"
299 		    "\x06\x00\x00\x00\x00\x00\x00\x01",
300 		.size = 27,
301 		.expected = "\xc0\x10\x10\x06\x00\x00\x00\x00\x00\x00\x01"
302 		    "\x00\x02\xfc\x00\x00\x00\x00\x40",
303 		.expsize = 19,
304 	},
305 	{
306 		.data = "\xe0\x08\x04\x4e\x97\x00\x03"
307 		    "\xc0\x10\x08\x43\x00\x00\x00\x00\x00\x00\x02",
308 		.size = 7 + 11,
309 		.expected = "\xe0\x08\x04\x4e\x97\x00\x03",
310 		.expsize = 7,
311 	},
312 	{
313 		.data = "\xe0\x08\x04\x4e\x97\x00\x03"
314 		    "\xc0\x10\x10\x00\x02\xfc\x00\x00\x00\x00\x40"
315 		    "\x43\x00\x00\x00\x00\x00\x00\x02",
316 		.size = 7 + 19,
317 		.expected = "\xe0\x08\x04\x4e\x97\x00\x03"
318 		    "\xc0\x10\x08\x00\x02\xfc\x00\x00\x00\x00\x40",
319 		.expsize = 7 + 11,
320 	},
321 	{
322 		.data = "\xc0\x10\x08\x43\x00\x00\x00\x00\x00\x00\x02"
323 		    "\xc0\x20\x0c\x00\x00\xd0\x5b\x00\x00\x00\x0b"
324 		    "\x00\x00\x00\x03",
325 		.size = 11 + 15,
326 		.expected = "\xc0\x20\x0c\x00\x00\xd0\x5b\x00\x00\x00\x0b"
327 		    "\x00\x00\x00\x03",
328 		.expsize = 15,
329 	},
330 	{
331 		.data = "\xe0\x08\x04\x4e\x97\x00\x03"
332 		    "\xc0\x10\x08\x43\x00\x00\x00\x00\x00\x00\x02"
333 		    "\xc0\x20\x0c\x00\x00\xd0\x5b\x00\x00\x00\x0b"
334 		    "\x00\x00\x00\x03",
335 		.size = 7 + 11 + 15,
336 		.expected = "\xe0\x08\x04\x4e\x97\x00\x03"
337 		    "\xc0\x20\x0c\x00\x00\xd0\x5b\x00\x00\x00\x0b"
338 		    "\x00\x00\x00\x03",
339 		.expsize = 7 + 15,
340 	},
341 };
342 
343 struct community filters[] = {
344 	{ /* 0 */
345 		.flags = COMMUNITY_TYPE_BASIC,
346 		.data1 = COMMUNITY_WELLKNOWN,
347 		.data2 = COMMUNITY_NO_ADVERTISE
348 	},
349 	{ /* 1 */
350 		.flags = COMMUNITY_TYPE_BASIC,
351 		.data1 = COMMUNITY_WELLKNOWN,
352 		.data2 = COMMUNITY_NO_EXPORT
353 	},
354 	{ /* 2 */
355 		.flags = COMMUNITY_TYPE_BASIC,
356 		.data1 = COMMUNITY_WELLKNOWN,
357 		.data2 = COMMUNITY_NO_EXPSUBCONFED
358 	},
359 	{ /* 3 */
360 		.flags = COMMUNITY_TYPE_BASIC,
361 		.data1 = 22512,
362 		.data2 = 1
363 	},
364 	{ /* 4 */
365 		.flags = COMMUNITY_TYPE_BASIC,
366 		.data1 = 22512,
367 		.data2 = 42
368 	},
369 	{ /* 5 */
370 		.flags = COMMUNITY_TYPE_BASIC,
371 		.data1 = 22512,
372 		.data2 = 65366
373 	},
374 	{ /* 6 */
375 		.flags = COMMUNITY_TYPE_BASIC,
376 		.data1 = 1,
377 		.data2 = 22512
378 	},
379 	{ /* 7 */
380 		.flags = COMMUNITY_TYPE_BASIC,
381 		.data1 = 42,
382 		.data2 = 22512
383 	},
384 	{ /* 8 */
385 		.flags = COMMUNITY_TYPE_BASIC,
386 		.data1 = 65366,
387 		.data2 = 22512
388 	},
389 	{ /* 9 */
390 		.flags = COMMUNITY_TYPE_LARGE,
391 		.data1 = 22512,
392 		.data2 = 22512,
393 		.data3 = 22512
394 	},
395 	{ /* 10 */
396 		.flags = COMMUNITY_TYPE_LARGE,
397 		.data1 = 22512,
398 		.data2 = 42,
399 		.data3 = 22512
400 	},
401 	{ /* 11 */
402 		.flags = COMMUNITY_TYPE_LARGE,
403 		.data1 = 22512,
404 		.data2 = 42,
405 		.data3 = 42
406 	},
407 	{ /* 12 */
408 		.flags = COMMUNITY_TYPE_LARGE,
409 		.data1 = 42,
410 		.data2 = 22512,
411 		.data3 = 22512
412 	},
413 	{ /* 13 */
414 		.flags = COMMUNITY_TYPE_LARGE,
415 		.data1 = 42,
416 		.data2 = 42,
417 		.data3 = 22512
418 	},
419 	{ /* 14 */
420 		.flags = COMMUNITY_TYPE_LARGE,
421 		.data1 = 42,
422 		.data2 = 22512,
423 		.data3 = 42
424 	},
425 	{ /* 15 */
426 		.flags = COMMUNITY_TYPE_LARGE,
427 		.data1 = 65366,
428 		.data2 = 22512,
429 		.data3 = 22512
430 	},
431 	{ /* 16 */
432 		.flags = COMMUNITY_TYPE_LARGE,
433 		.data1 = 22512,
434 		.data2 = 65366,
435 		.data3 = 22512
436 	},
437 	{ /* 17 */
438 		.flags = COMMUNITY_TYPE_LARGE,
439 		.data1 = 22512,
440 		.data2 = 65366,
441 		.data3 = 65366
442 	},
443 	{ /* 18 */
444 		.flags = COMMUNITY_TYPE_LARGE,
445 		.data1 = 42,
446 		.data2 = 42,
447 		.data3 = 42
448 	},
449 	{ /* 19 */
450 		.flags = COMMUNITY_TYPE_LARGE,
451 		.data1 = 65366,
452 		.data2 = 65366,
453 		.data3 = 65366
454 	},
455 	{ /* 20 */
456 		.flags = COMMUNITY_TYPE_BASIC | (COMMUNITY_ANY << 16),
457 		.data1 = COMMUNITY_WELLKNOWN,
458 	},
459 	{ /* 21 */
460 		.flags = COMMUNITY_TYPE_BASIC | (COMMUNITY_ANY << 16),
461 		.data1 = 22512,
462 	},
463 	{ /* 22 */
464 		.flags = COMMUNITY_TYPE_BASIC | (COMMUNITY_ANY << 8),
465 		.data2 = 22512
466 	},
467 	{ /* 23 */
468 		.flags = COMMUNITY_TYPE_LARGE | (COMMUNITY_ANY << 8) |
469 		    (COMMUNITY_ANY << 16) | (COMMUNITY_ANY << 24),
470 	},
471 	{ /* 24 */
472 		.flags = COMMUNITY_TYPE_LARGE | (COMMUNITY_ANY << 16) |
473 		    (COMMUNITY_ANY << 24),
474 		.data1 = 22512,
475 	},
476 	{ /* 25 */
477 		.flags = COMMUNITY_TYPE_EXT,
478 		.data3 = EXT_COMMUNITY_TRANS_TWO_AS << 8 | 0x02,
479 		.data1 = 22512,
480 		.data2 = 42,
481 	},
482 	{ /* 26 */
483 		.flags = COMMUNITY_TYPE_EXT,
484 		.data3 = EXT_COMMUNITY_TRANS_FOUR_AS << 8 | 0x02,
485 		.data1 = 22512,
486 		.data2 = 42,
487 	},
488 	{ /* 27 */
489 		.flags = COMMUNITY_TYPE_EXT,
490 		.data3 = EXT_COMMUNITY_TRANS_FOUR_AS << 8 | 0x02,
491 		.data1 = 22512,
492 		.data2 = 15,
493 	},
494 	{ /* 28 */
495 		.flags = COMMUNITY_TYPE_BASIC | (COMMUNITY_LOCAL_AS << 8) |
496 		    (COMMUNITY_NEIGHBOR_AS << 16),
497 	},
498 	{ /* 29 */
499 		.flags = COMMUNITY_TYPE_LARGE | (COMMUNITY_LOCAL_AS << 8) |
500 		    (COMMUNITY_NEIGHBOR_AS << 24),
501 	},
502 	{ /* 30 */
503 		.flags = COMMUNITY_TYPE_EXT | (COMMUNITY_LOCAL_AS << 8) |
504 		    (COMMUNITY_NEIGHBOR_AS << 16),
505 		.data3 = EXT_COMMUNITY_TRANS_TWO_AS << 8 | 0x02,
506 	},
507 	{ /* 31 */
508 		.flags = COMMUNITY_TYPE_BASIC,
509 		.data1 = 42,
510 		.data2 = 22512,
511 	},
512 	{ /* 32 */
513 		.flags = COMMUNITY_TYPE_BASIC,
514 		.data1 = 65366,
515 		.data2 = 22512,
516 	},
517 	{ /* 33 */
518 		.flags = COMMUNITY_TYPE_BASIC,
519 		.data1 = 42,
520 		.data2 = 65366,
521 	},
522 	{ /* 34 */
523 		.flags = COMMUNITY_TYPE_LARGE,
524 		.data1 = 42,
525 		.data2 = 0,
526 		.data3 = 22512,
527 	},
528 	{ /* 35 */
529 		.flags = COMMUNITY_TYPE_LARGE,
530 		.data1 = 196618,
531 		.data2 = 0,
532 		.data3 = 22512,
533 	},
534 	{ /* 36 */
535 		.flags = COMMUNITY_TYPE_LARGE,
536 		.data1 = 22512,
537 		.data2 = 0,
538 		.data3 = 196618,
539 	},
540 	{ /* 37 */
541 		.flags = COMMUNITY_TYPE_LARGE,
542 		.data1 = 196618,
543 		.data2 = 0,
544 		.data3 = 424242,
545 	},
546 	{ /* 38 */
547 		.flags = COMMUNITY_TYPE_EXT,
548 		.data1 = 42,
549 		.data2 = 22512,
550 		.data3 = EXT_COMMUNITY_TRANS_TWO_AS << 8 | 0x02,
551 	},
552 	{ /* 39 */
553 		.flags = COMMUNITY_TYPE_EXT,
554 		.data1 = 42,
555 		.data2 = 22512,
556 		.data3 = EXT_COMMUNITY_TRANS_FOUR_AS << 8 | 0x02,
557 	},
558 	{ /* 40 */
559 		.flags = COMMUNITY_TYPE_EXT,
560 		.data1 = 196618,
561 		.data2 = 22512,
562 		.data3 = EXT_COMMUNITY_TRANS_FOUR_AS << 8 | 0x02,
563 	},
564 	{ /* 41 */
565 		.flags = COMMUNITY_TYPE_EXT,
566 		.data1 = 22512,
567 		.data2 = 196618,
568 		.data3 = EXT_COMMUNITY_TRANS_TWO_AS << 8 | 0x02,
569 	},
570 	{ /* 42 */
571 		.flags = COMMUNITY_TYPE_EXT | (COMMUNITY_ANY << 24),
572 	},
573 	{ /* 43 */
574 		.flags = COMMUNITY_TYPE_EXT | (COMMUNITY_ANY << 8),
575 		.data3 = (-1 << 8) | 0x02,
576 	},
577 	{ /* 44 */
578 		.flags = COMMUNITY_TYPE_EXT | (COMMUNITY_ANY << 8),
579 		.data3 = EXT_COMMUNITY_TRANS_FOUR_AS << 8 | 0x02,
580 	},
581 	{ /* 45 */
582 		.flags = COMMUNITY_TYPE_EXT | (COMMUNITY_ANY << 16),
583 		.data3 = EXT_COMMUNITY_TRANS_FOUR_AS << 8 | 0x02,
584 		.data1 = 196618,
585 	},
586 };
587 
588 struct testfilter {
589 	int		 in[8];
590 	int		 delete;
591 	int		 match;
592 	int		 mout;
593 	int		 ncomm;
594 	int		 next;
595 	int		 nlarge;
596 	struct rde_peer *peer;
597 } testfilters[] = {
598 	{
599 		.in = { 1, 2, -1 },
600 		.match = 1,
601 		.mout = 1,
602 		.delete = 1,
603 	},
604 	{
605 		.in = { 1, 2, -1 },
606 		.match = 2,
607 		.mout = 1,
608 		.delete = 2,
609 	},
610 	{
611 		.in = { 1, 2, -1 },
612 		.match = 20,
613 		.mout = 1,
614 		.delete = 20,
615 	},
616 	{
617 		.in = { 1, 2, 1, 2, -1 },
618 		.match = 5,
619 		.mout = 0,
620 		.delete = 5,
621 	},
622 	{
623 		.in = { 3, 4, 5, 6, 7, 8, -1 },
624 		.match = 5,
625 		.mout = 1,
626 		.delete = 5,
627 	},
628 	{ /* 5 */
629 		.in = { 3, 4, 5, 6, 7, 8, -1 },
630 		.match = 20,
631 		.mout = 0,
632 		.delete = -1,
633 	},
634 	{
635 		.in = { 3, 4, 5, 6, 7, 8, -1 },
636 		.match = 21,
637 		.mout = 1,
638 		.delete = 21,
639 	},
640 	{
641 		.in = { 3, 4, 5, 6, 7, 8, -1 },
642 		.match = 22,
643 		.mout = 1,
644 		.delete = 22,
645 	},
646 	{
647 		.in = { 17, 18, 19, -1 },
648 		.match = 22,
649 		.mout = 0,
650 		.delete = 17,
651 	},
652 	{
653 		.in = { 17, 18, 19, 7, 8, -1 },
654 		.match = 18,
655 		.mout = 1,
656 		.delete = 19,
657 	},
658 	{ /* 10 */
659 		.in = { 1, 3, 5, -1 },
660 		.match = 23,
661 		.mout = 0,
662 		.delete = -1,
663 	},
664 	{
665 		.in = { 1, 3, 5, 17, -1 },
666 		.match = 23,
667 		.mout = 1,
668 		.delete = 23,
669 	},
670 	{
671 		.in = { 1, 3, 5, 19, -1 },
672 		.match = 24,
673 		.mout = 0,
674 		.delete = -1,
675 	},
676 	{
677 		.in = { 19, 18, 17, -1 },
678 		.match = 24,
679 		.mout = 1,
680 		.delete = 24,
681 	},
682 	{
683 		.in = { 25, 26, -1 },
684 		.match = 25,
685 		.mout = 1,
686 		.delete = 25,
687 	},
688 	{ /* 15 */
689 		.in = { 25, 26, -1 },
690 		.match = 26,
691 		.mout = 1,
692 		.delete = 26,
693 	},
694 	{
695 		.in = { 17, 0, -1 },
696 		.match = 0,
697 		.mout = 1,
698 		.delete = 0,
699 	},
700 	{
701 		.in = { -1 },
702 		.match = 21,
703 		.mout = 0,
704 		.delete = -1,
705 		.ncomm = 0 + 1,
706 		.next = 0 + 1,
707 		.nlarge = 0 + 1,
708 	},
709 	{
710 		.in = { 0, 3, 6, -1 },
711 		.match = -1,
712 		.delete = -1,
713 		.ncomm = 3 + 1,
714 		.next = 0 + 1,
715 		.nlarge = 0 + 1,
716 	},
717 	{
718 		.in = { 0, 25, 26, 19, -1 },
719 		.match = -1,
720 		.delete = -1,
721 		.ncomm = 1 + 1,
722 		.next = 2 + 1,
723 		.nlarge = 1 + 1,
724 	},
725 	{ /* 20 */
726 		.in = { 0, 10, 26, -1 },
727 		.match = -1,
728 		.delete = -1,
729 		.ncomm = 1 + 1,
730 		.next = 1 + 1,
731 		.nlarge = 1 + 1,
732 	},
733 	{
734 		.in = { 28, -1 },
735 		.match = 28,
736 		.mout = 1,
737 		.delete = 28,
738 		.peer = &peer,
739 	},
740 	{
741 		.in = { 31, -1 },
742 		.match = 28,
743 		.mout = 1,
744 		.delete = 28,
745 		.peer = &peer,
746 	},
747 	{
748 		.in = { 31, -1 },
749 		.match = 28,
750 		.mout = 0,
751 		.peer = &peer_l4,
752 	},
753 	{
754 		.in = { 31, -1 },
755 		.match = 28,
756 		.mout = 0,
757 		.peer = &peer_r4,
758 	},
759 	{ /* 25 */
760 		.in = { 31, -1 },
761 		.match = 28,
762 		.mout = 0,
763 		.peer = &peer_b4,
764 	},
765 	{
766 		.in = { 32, -1 },
767 		.match = 28,
768 		.mout = 0,
769 		.peer = &peer,
770 	},
771 	{
772 		.in = { 32, -1 },
773 		.match = 28,
774 		.mout = 0,
775 		.peer = &peer_l4,
776 	},
777 	{
778 		.in = { 32, -1 },
779 		.match = 28,
780 		.mout = 0,
781 		.peer = &peer_r4,
782 	},
783 	{
784 		.in = { 32, -1 },
785 		.match = 28,
786 		.mout = 0,
787 		.peer = &peer_b4,
788 	},
789 	{ /* 30 */
790 		.in = { 33, -1 },
791 		.match = 28,
792 		.mout = 0,
793 		.peer = &peer,
794 	},
795 	{
796 		.in = { 33, -1 },
797 		.match = 28,
798 		.mout = 0,
799 		.peer = &peer_l4,
800 	},
801 	{
802 		.in = { 33, -1 },
803 		.match = 28,
804 		.mout = 0,
805 		.peer = &peer_r4,
806 	},
807 	{
808 		.in = { 33, -1 },
809 		.match = 28,
810 		.mout = 0,
811 		.peer = &peer_b4,
812 	},
813 	{
814 		.in = { 29, -1 },
815 		.match = 29,
816 		.mout = 1,
817 		.delete = 29,
818 		.peer = &peer,
819 	},
820 	{ /* 35 */
821 		.in = { 29, -1 },
822 		.match = 29,
823 		.mout = 1,
824 		.delete = 29,
825 		.peer = &peer_l4,
826 	},
827 	{
828 		.in = { 29, -1 },
829 		.match = 29,
830 		.mout = 1,
831 		.delete = 29,
832 		.peer = &peer_r4,
833 	},
834 	{
835 		.in = { 29, -1 },
836 		.match = 29,
837 		.mout = 1,
838 		.delete = 29,
839 		.peer = &peer_b4,
840 	},
841 	{
842 		.in = { 34, -1 },
843 		.match = 29,
844 		.mout = 1,
845 		.peer = &peer,
846 	},
847 	{
848 		.in = { 34, -1 },
849 		.match = 29,
850 		.mout = 0,
851 		.peer = &peer_l4,
852 	},
853 	{ /* 40 */
854 		.in = { 34, -1 },
855 		.match = 29,
856 		.mout = 0,
857 		.peer = &peer_r4,
858 	},
859 	{
860 		.in = { 34, -1 },
861 		.match = 29,
862 		.mout = 0,
863 		.peer = &peer_b4,
864 	},
865 	{
866 		.in = { 35, -1 },
867 		.match = 29,
868 		.mout = 0,
869 		.peer = &peer,
870 	},
871 	{
872 		.in = { 35, -1 },
873 		.match = 29,
874 		.mout = 1,
875 		.peer = &peer_l4,
876 	},
877 	{
878 		.in = { 35, -1 },
879 		.match = 29,
880 		.mout = 0,
881 		.peer = &peer_r4,
882 	},
883 	{ /* 45 */
884 		.in = { 35, -1 },
885 		.match = 29,
886 		.mout = 0,
887 		.peer = &peer_b4,
888 	},
889 	{
890 		.in = { 36, -1 },
891 		.match = 29,
892 		.mout = 0,
893 		.peer = &peer,
894 	},
895 	{
896 		.in = { 36, -1 },
897 		.match = 29,
898 		.mout = 0,
899 		.peer = &peer_l4,
900 	},
901 	{
902 		.in = { 36, -1 },
903 		.match = 29,
904 		.mout = 1,
905 		.peer = &peer_r4,
906 	},
907 	{
908 		.in = { 36, -1 },
909 		.match = 29,
910 		.mout = 0,
911 		.peer = &peer_b4,
912 	},
913 	{ /* 50 */
914 		.in = { 37, -1 },
915 		.match = 29,
916 		.mout = 0,
917 		.peer = &peer,
918 	},
919 	{
920 		.in = { 37, -1 },
921 		.match = 29,
922 		.mout = 0,
923 		.peer = &peer_l4,
924 	},
925 	{
926 		.in = { 37, -1 },
927 		.match = 29,
928 		.mout = 0,
929 		.peer = &peer_r4,
930 	},
931 	{
932 		.in = { 37, -1 },
933 		.match = 29,
934 		.mout = 1,
935 		.peer = &peer_b4,
936 	},
937 	{
938 		.in = { 30, -1 },
939 		.match = 30,
940 		.mout = 1,
941 		.delete = 30,
942 		.peer = &peer,
943 	},
944 	{ /* 55 */
945 		.in = { 30, -1 },
946 		.match = 30,
947 		.mout = 1,
948 		.delete = 30,
949 		.peer = &peer_l4,
950 	},
951 	{
952 		.in = { 30, -1 },
953 		.match = 30,
954 		.mout = 1,
955 		.delete = 30,
956 		.peer = &peer_r4,
957 	},
958 	{
959 		.in = { 38, -1 },
960 		.match = 30,
961 		.mout = 1,
962 		.peer = &peer,
963 	},
964 	{
965 		.in = { 38, -1 },
966 		.match = 30,
967 		.mout = 0,
968 		.peer = &peer_l4,
969 	},
970 	{
971 		.in = { 38, -1 },
972 		.match = 30,
973 		.mout = 0,
974 		.peer = &peer_r4,
975 	},
976 	{ /* 60 */
977 		.in = { 39, -1 },
978 		.match = 30,
979 		.mout = 1,
980 		.peer = &peer,
981 	},
982 	{
983 		.in = { 39, -1 },
984 		.match = 30,
985 		.mout = 0,
986 		.peer = &peer_l4,
987 	},
988 	{
989 		.in = { 39, -1 },
990 		.match = 30,
991 		.mout = 0,
992 		.peer = &peer_r4,
993 	},
994 	{
995 		.in = { 40, -1 },
996 		.match = 30,
997 		.mout = 0,
998 		.peer = &peer,
999 	},
1000 	{
1001 		.in = { 40, -1 },
1002 		.match = 30,
1003 		.mout = 1,
1004 		.peer = &peer_l4,
1005 	},
1006 	{ /* 65 */
1007 		.in = { 40, -1 },
1008 		.match = 30,
1009 		.mout = 0,
1010 		.peer = &peer_r4,
1011 	},
1012 	{
1013 		.in = { 41, -1 },
1014 		.match = 30,
1015 		.mout = 0,
1016 		.peer = &peer,
1017 	},
1018 	{
1019 		.in = { 41, -1 },
1020 		.match = 30,
1021 		.mout = 0,
1022 		.peer = &peer_l4,
1023 	},
1024 	{
1025 		.in = { 41, -1 },
1026 		.match = 30,
1027 		.mout = 1,
1028 		.peer = &peer_r4,
1029 	},
1030 	{
1031 		.in = { 38, -1 },
1032 		.match = 30,
1033 		.mout = 1,
1034 		.peer = &peer,
1035 	},
1036 	{ /* 70 */
1037 		.in = { 38, 39, 40, -1 },
1038 		.match = 42,
1039 		.mout = 1,
1040 		.delete = 42,
1041 		.next = 0 + 1,
1042 		.peer = &peer,
1043 	},
1044 	{
1045 		.in = { 38, 39, 40, -1 },
1046 		.match = 43,
1047 		.mout = 1,
1048 		.delete = 43,
1049 		.next = 0 + 1,
1050 		.peer = &peer,
1051 	},
1052 	{
1053 		.in = { 39, 40, -1 },
1054 		.match = 44,
1055 		.mout = 1,
1056 		.delete = 44,
1057 		.next = 0 + 1,
1058 		.peer = &peer,
1059 	},
1060 	{
1061 		.in = { 38, -1 },
1062 		.match = 44,
1063 		.mout = 0,
1064 		.peer = &peer,
1065 	},
1066 	{
1067 		.in = { 40, -1 },
1068 		.match = 45,
1069 		.mout = 1,
1070 		.delete = 45,
1071 		.next = 0 + 1,
1072 		.peer = &peer,
1073 	},
1074 	{ /* 75 */
1075 		.in = { 38, 39, 41, -1 },
1076 		.match = 45,
1077 		.mout = 0,
1078 		.peer = &peer,
1079 	},
1080 };
1081