Annotation of embedaddon/quagga/tests/bgp_mp_attr_test.c, revision 1.1.1.4
1.1.1.4 ! misho 1: /*
! 2: * Copyright (C) 2008 Sun Microsystems, Inc.
! 3: *
! 4: * This file is part of Quagga.
! 5: *
! 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
! 9: * later version.
! 10: *
! 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.
! 15: *
! 16: * You should have received a copy of the GNU General Public License
! 17: * along with Quagga; see the file COPYING. If not, write to the Free
! 18: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 19: * 02111-1307, USA.
! 20: */
! 21:
1.1 misho 22: #include <zebra.h>
23:
24: #include "vty.h"
25: #include "stream.h"
26: #include "privs.h"
27: #include "memory.h"
1.1.1.4 ! misho 28: #include "filter.h"
1.1 misho 29:
30: #include "bgpd/bgpd.h"
31: #include "bgpd/bgp_attr.h"
32: #include "bgpd/bgp_open.h"
33: #include "bgpd/bgp_debug.h"
1.1.1.4 ! misho 34: #include "bgpd/bgp_route.h"
! 35: #include "bgpd/bgp_packet.h"
! 36: #include "bgpd/bgp_mplsvpn.h"
! 37: #include "bgpd/bgp_nexthop.h"
1.1 misho 38:
39: #define VT100_RESET "\x1b[0m"
40: #define VT100_RED "\x1b[31m"
41: #define VT100_GREEN "\x1b[32m"
42: #define VT100_YELLOW "\x1b[33m"
43:
44:
45: #define CAPABILITY 0
46: #define DYNCAP 1
47: #define OPT_PARAM 2
48:
49: /* need these to link in libbgp */
50: struct zebra_privs_t *bgpd_privs = NULL;
51: struct thread_master *master = NULL;
52:
53: static int failed = 0;
54: static int tty = 0;
55:
56: /* test segments to parse and validate, and use for other tests */
57: static struct test_segment {
58: const char *name;
59: const char *desc;
60: const u_char data[1024];
61: int len;
62: #define SHOULD_PARSE 0
63: #define SHOULD_ERR -1
64: int parses; /* whether it should parse or not */
65:
66: /* AFI/SAFI validation */
67: afi_t afi;
68: safi_t safi;
69: #define VALID_AFI 1
70: #define INVALID_AFI 0
71: int afi_valid;
72: } mp_reach_segments [] =
73: {
74: { "IPv6",
75: "IPV6 MP Reach, global nexthop, 1 NLRI",
76: {
77: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
78: /* nexthop bytes */ 16,
79: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2,
80: 0xaa, 0xbb, 0xcc, 0xdd,
81: 0x3, 0x4, 0x5, 0x6,
82: 0xa1, 0xa2, 0xa3, 0xa4,
83: /* SNPA (defunct, MBZ) */ 0x0,
84: /* NLRI tuples */ 32, 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
85: },
86: (4 + 16 + 1 + 5),
87: SHOULD_PARSE,
88: AFI_IP6, SAFI_UNICAST, VALID_AFI,
89: },
90: { "IPv6-2",
91: "IPV6 MP Reach, global nexthop, 2 NLRIs",
92: {
93: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
94: /* nexthop bytes */ 16,
95: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* ffee:102:... */
96: 0xaa, 0xbb, 0xcc, 0xdd,
97: 0x3, 0x4, 0x5, 0x6,
98: 0xa1, 0xa2, 0xa3, 0xa4,
99: /* SNPA (defunct, MBZ) */ 0x0,
100: /* NLRI tuples */ 32,
101: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
102: 64,
103: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
104: 0x0, 0x2, 0x0, 0x3,
105: },
106: (4 + 16 + 1 + 5 + 9),
107: SHOULD_PARSE,
108: AFI_IP6, SAFI_UNICAST, VALID_AFI,
109: },
110: { "IPv6-default",
111: "IPV6 MP Reach, global nexthop, 2 NLRIs + default",
112: {
113: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
114: /* nexthop bytes */ 16,
115: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2,
116: 0xaa, 0xbb, 0xcc, 0xdd,
117: 0x3, 0x4, 0x5, 0x6,
118: 0xa1, 0xa2, 0xa3, 0xa4,
119: /* SNPA (defunct, MBZ) */ 0x0,
120: /* NLRI tuples */ 32,
121: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
122: 64,
123: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
124: 0x0, 0x2, 0x0, 0x3,
125: 0x0, /* ::/0 */
126: },
127: (4 + 16 + 1 + 5 + 9 + 1),
128: SHOULD_PARSE,
129: AFI_IP6, SAFI_UNICAST, VALID_AFI,
130: },
131: { "IPv6-lnh",
132: "IPV6 MP Reach, global+local nexthops, 2 NLRIs + default",
133: {
134: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
135: /* nexthop bytes */ 32,
136: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
137: 0xaa, 0xbb, 0xcc, 0xdd,
138: 0x3, 0x4, 0x5, 0x6,
139: 0xa1, 0xa2, 0xa3, 0xa4,
140: /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
141: 0x0, 0x0, 0x0, 0x0,
142: 0x2, 0x10, 0x2, 0xff,
143: 0x1, 0x2, 0x3, 0x4,
144: /* SNPA (defunct, MBZ) */ 0x0,
145: /* NLRI tuples */ 32,
146: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
147: 64,
148: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
149: 0x0, 0x2, 0x0, 0x3,
150: 0x0, /* ::/0 */
151: },
152: (4 + 32 + 1 + 5 + 9 + 1),
153: SHOULD_PARSE,
154: AFI_IP6, SAFI_UNICAST, VALID_AFI,
155: },
156: { "IPv6-nhlen",
157: "IPV6 MP Reach, inappropriate nexthop length",
158: {
159: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
160: /* nexthop bytes */ 4,
161: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
162: 0xaa, 0xbb, 0xcc, 0xdd,
163: 0x3, 0x4, 0x5, 0x6,
164: 0xa1, 0xa2, 0xa3, 0xa4,
165: /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
166: 0x0, 0x0, 0x0, 0x0,
167: 0x2, 0x10, 0x2, 0xff,
168: 0x1, 0x2, 0x3, 0x4,
169: /* SNPA (defunct, MBZ) */ 0x0,
170: /* NLRI tuples */ 32,
171: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
172: 64,
173: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
174: 0x0, 0x2, 0x0, 0x3,
175: 0x0, /* ::/0 */
176: },
177: (4 + 32 + 1 + 5 + 9 + 1),
178: SHOULD_ERR,
179: AFI_IP6, SAFI_UNICAST, VALID_AFI,
180: },
181: { "IPv6-nhlen2",
182: "IPV6 MP Reach, invalid nexthop length",
183: {
184: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
185: /* nexthop bytes */ 5,
186: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
187: 0xaa, 0xbb, 0xcc, 0xdd,
188: 0x3, 0x4, 0x5, 0x6,
189: 0xa1, 0xa2, 0xa3, 0xa4,
190: /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
191: 0x0, 0x0, 0x0, 0x0,
192: 0x2, 0x10, 0x2, 0xff,
193: 0x1, 0x2, 0x3, 0x4,
194: /* SNPA (defunct, MBZ) */ 0x0,
195: /* NLRI tuples */ 32,
196: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
197: 64,
198: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
199: 0x0, 0x2, 0x0, 0x3,
200: 0x0, /* ::/0 */
201: },
202: (4 + 32 + 1 + 5 + 9 + 1),
203: SHOULD_ERR,
204: AFI_IP6, SAFI_UNICAST, VALID_AFI,
205: },
206: { "IPv6-nhlen3",
207: "IPV6 MP Reach, nexthop length overflow",
208: {
209: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
210: /* nexthop bytes */ 32,
211: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
212: 0xaa, 0xbb, 0xcc, 0xdd,
213: 0x3, 0x4, 0x5, 0x6,
214: 0xa1, 0xa2, 0xa3, 0xa4,
215: },
216: (4 + 16),
217: SHOULD_ERR,
218: AFI_IP6, SAFI_UNICAST, VALID_AFI,
219: },
220: { "IPv6-nhlen4",
221: "IPV6 MP Reach, nexthop length short",
222: {
223: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
224: /* nexthop bytes */ 16,
225: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
226: 0xaa, 0xbb, 0xcc, 0xdd,
227: 0x3, 0x4, 0x5, 0x6,
228: 0xa1, 0xa2, 0xa3, 0xa4,
229: /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
230: 0x0, 0x0, 0x0, 0x0,
231: 0x2, 0x10, 0x2, 0xff,
232: 0x1, 0x2, 0x3, 0x4,
233: /* SNPA (defunct, MBZ) */ 0x0,
234: /* NLRI tuples */ 32,
235: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
236: 64,
237: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
238: 0x0, 0x2, 0x0, 0x3,
239: 0x0, /* ::/0 */
240: },
241: (4 + 32 + 1 + 5 + 9 + 1),
242: SHOULD_ERR,
243: AFI_IP6, SAFI_UNICAST, VALID_AFI,
244: },
245: { "IPv6-nlri",
246: "IPV6 MP Reach, NLRI bitlen overflow",
247: {
248: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
249: /* nexthop bytes */ 32,
250: /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
251: 0xaa, 0xbb, 0xcc, 0xdd,
252: 0x3, 0x4, 0x5, 0x6,
253: 0xa1, 0xa2, 0xa3, 0xa4,
254: /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
255: 0x0, 0x0, 0x0, 0x0,
256: 0x2, 0x10, 0x2, 0xff,
257: 0x1, 0x2, 0x3, 0x4,
258: /* SNPA (defunct, MBZ) */ 0x0,
259: /* NLRI tuples */ 120,
260: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
261: 64,
262: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
263: 0x0, 0x2, 0x0, 0x3,
264: 0, /* ::/0 */
265: },
266: (4 + 32 + 1 + 5 + 9 + 1),
267: SHOULD_ERR,
268: AFI_IP6, SAFI_UNICAST, VALID_AFI,
269: },
270: { "IPv4",
271: "IPv4 MP Reach, 2 NLRIs + default",
272: {
273: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
274: /* nexthop bytes */ 4,
275: /* Nexthop */ 192, 168, 0, 1,
276: /* SNPA (defunct, MBZ) */ 0x0,
277: /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
278: 17, 10, 2, 3, /* 10.2.3/17 */
279: 0, /* 0/0 */
280: },
281: (4 + 4 + 1 + 3 + 4 + 1),
282: SHOULD_PARSE,
283: AFI_IP, SAFI_UNICAST, VALID_AFI,
284: },
285: { "IPv4-nhlen",
286: "IPv4 MP Reach, nexthop lenth overflow",
287: {
288: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
289: /* nexthop bytes */ 32,
290: /* Nexthop */ 192, 168, 0, 1,
291: /* SNPA (defunct, MBZ) */ 0x0,
292: /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
293: 17, 10, 2, 3, /* 10.2.3/17 */
294: 0, /* 0/0 */
295: },
296: (4 + 4 + 1 + 3 + 4 + 1),
297: SHOULD_ERR,
298: AFI_IP, SAFI_UNICAST, VALID_AFI,
299: },
300: { "IPv4-nlrilen",
301: "IPv4 MP Reach, nlri lenth overflow",
302: {
303: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
304: /* nexthop bytes */ 4,
305: /* Nexthop */ 192, 168, 0, 1,
306: /* SNPA (defunct, MBZ) */ 0x0,
307: /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
308: 30, 10,
309: 0, /* 0/0 */
310: },
311: (4 + 4 + 1 + 3 + 2 + 1),
312: SHOULD_ERR,
313: AFI_IP, SAFI_UNICAST, VALID_AFI,
314: },
1.1.1.4 ! misho 315: { "IPv4-VPNv4",
! 316: "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs",
! 317: {
! 318: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
! 319: /* nexthop bytes */ 12,
! 320: /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
! 321: 0, 0, 0, 0,
! 322: /* Nexthop */ 192, 168, 0, 1,
! 323: /* SNPA (defunct, MBZ) */ 0x0,
! 324: /* NLRI tuples */ 88 + 16,
! 325: 0, 1, 2, /* tag */
! 326: /* rd, 8 octets */
! 327: 0, 0, /* RD_TYPE_AS */
! 328: 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
! 329: 10, 1, /* 10.1/16 */
! 330: 88 + 17,
! 331: 0xff, 0, 0, /* tag */
! 332: /* rd, 8 octets */
! 333: 0, 0, /* RD_TYPE_IP */
! 334: 192, 168, 0, 1, /* IPv4 */
! 335: 10, 2, 3, /* 10.2.3/17 */
! 336: },
! 337: (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
! 338: SHOULD_PARSE,
! 339: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
! 340: },
! 341: { "IPv4-VPNv4-bogus-plen",
! 342: "IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, NLRI / bogus p'len",
1.1 misho 343: {
1.1.1.2 misho 344: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
1.1 misho 345: /* nexthop bytes */ 12,
346: /* RD */ 0, 0, 1, 2,
347: 0, 0xff, 3, 4,
348: /* Nexthop */ 192, 168, 0, 1,
349: /* SNPA (defunct, MBZ) */ 0x0,
350: /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
351: 17, 10, 2, 3, /* 10.2.3/17 */
352: 0, /* 0/0 */
353: },
1.1.1.4 ! misho 354: (3 + 1 + 3*4 + 1 + 3 + 4 + 1),
! 355: SHOULD_ERR,
! 356: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
! 357: },
! 358: { "IPv4-VPNv4-plen1-short",
! 359: "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen short",
! 360: {
! 361: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
! 362: /* nexthop bytes */ 12,
! 363: /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
! 364: 0, 0, 0, 0,
! 365: /* Nexthop */ 192, 168, 0, 1,
! 366: /* SNPA (defunct, MBZ) */ 0x0,
! 367: /* NLRI tuples */ 88 + 1,
! 368: 0, 1, 2, /* tag */
! 369: /* rd, 8 octets */
! 370: 0, 0, /* RD_TYPE_AS */
! 371: 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
! 372: 10, 1, /* 10.1/16 */
! 373: 88 + 17,
! 374: 0xff, 0, 0, /* tag */
! 375: /* rd, 8 octets */
! 376: 0, 0, /* RD_TYPE_IP */
! 377: 192, 168, 0, 1, /* IPv4 */
! 378: 10, 2, 3, /* 10.2.3/17 */
! 379: },
! 380: (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
! 381: SHOULD_ERR,
! 382: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
! 383: },
! 384: { "IPv4-VPNv4-plen1-long",
! 385: "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen long",
! 386: {
! 387: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
! 388: /* nexthop bytes */ 12,
! 389: /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
! 390: 0, 0, 0, 0,
! 391: /* Nexthop */ 192, 168, 0, 1,
! 392: /* SNPA (defunct, MBZ) */ 0x0,
! 393: /* NLRI tuples */ 88 + 32,
! 394: 0, 1, 2, /* tag */
! 395: /* rd, 8 octets */
! 396: 0, 0, /* RD_TYPE_AS */
! 397: 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
! 398: 10, 1, /* 10.1/16 */
! 399: 88 + 17,
! 400: 0xff, 0, 0, /* tag */
! 401: /* rd, 8 octets */
! 402: 0, 0, /* RD_TYPE_IP */
! 403: 192, 168, 0, 1, /* IPv4 */
! 404: 10, 2, 3, /* 10.2.3/17 */
! 405: },
! 406: (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
! 407: SHOULD_ERR,
! 408: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
! 409: },
! 410: { "IPv4-VPNv4-plenn-long",
! 411: "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRIs, last plen long",
! 412: {
! 413: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
! 414: /* nexthop bytes */ 12,
! 415: /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
! 416: 0, 0, 0, 0,
! 417: /* Nexthop */ 192, 168, 0, 1,
! 418: /* SNPA (defunct, MBZ) */ 0x0,
! 419: /* NLRI tuples */ 88 + 16,
! 420: 0, 1, 2, /* tag */
! 421: /* rd, 8 octets */
! 422: 0, 0, /* RD_TYPE_AS */
! 423: 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
! 424: 10, 1, /* 10.1/16 */
! 425: 88 + 17,
! 426: 0xff, 0, 0, /* tag */
! 427: /* rd, 8 octets */
! 428: 0, 0, /* RD_TYPE_IP */
! 429: 192, 168, 0, 1, /* IPv4 */
! 430: 10, 2, 3, /* 10.2.3/17 */
! 431: 88 + 1, /* bogus */
! 432: },
! 433: (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3) + 1),
! 434: SHOULD_ERR,
! 435: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
! 436: },
! 437: { "IPv4-VPNv4-plenn-short",
! 438: "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, last plen short",
! 439: {
! 440: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
! 441: /* nexthop bytes */ 12,
! 442: /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
! 443: 0, 0, 0, 0,
! 444: /* Nexthop */ 192, 168, 0, 1,
! 445: /* SNPA (defunct, MBZ) */ 0x0,
! 446: /* NLRI tuples */ 88 + 16,
! 447: 0, 1, 2, /* tag */
! 448: /* rd, 8 octets */
! 449: 0, 0, /* RD_TYPE_AS */
! 450: 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
! 451: 10, 1, /* 10.1/16 */
! 452: 88 + 2,
! 453: 0xff, 0, 0, /* tag */
! 454: /* rd, 8 octets */
! 455: 0, 0, /* RD_TYPE_IP */
! 456: 192, 168, 0, 1, /* IPv4 */
! 457: 10, 2, 3, /* 10.2.3/17 */
! 458: },
! 459: (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
! 460: SHOULD_ERR,
! 461: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
! 462: },
! 463: { "IPv4-VPNv4-bogus-rd-type",
! 464: "IPv4/VPNv4 MP Reach, RD, NH, 2 NLRI, unknown RD in 1st (log, but parse)",
! 465: {
! 466: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
! 467: /* nexthop bytes */ 12,
! 468: /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
! 469: 0, 0, 0, 0,
! 470: /* Nexthop */ 192, 168, 0, 1,
! 471: /* SNPA (defunct, MBZ) */ 0x0,
! 472: /* NLRI tuples */ 88 + 16,
! 473: 0, 1, 2, /* tag */
! 474: /* rd, 8 octets */
! 475: 0xff, 0, /* Bogus RD */
! 476: 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
! 477: 10, 1, /* 10.1/16 */
! 478: 88 + 17,
! 479: 0xff, 0, 0, /* tag */
! 480: /* rd, 8 octets */
! 481: 0, 0, /* RD_TYPE_IP */
! 482: 192, 168, 0, 1, /* IPv4 */
! 483: 10, 2, 3, /* 10.2.3/17 */
! 484: },
! 485: (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
1.1 misho 486: SHOULD_PARSE,
1.1.1.4 ! misho 487: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
1.1 misho 488: },
1.1.1.4 ! misho 489: { "IPv4-VPNv4-0-nlri",
! 490: "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRI, 3rd 0 bogus",
! 491: {
! 492: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
! 493: /* nexthop bytes */ 12,
! 494: /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
! 495: 0, 0, 0, 0,
! 496: /* Nexthop */ 192, 168, 0, 1,
! 497: /* SNPA (defunct, MBZ) */ 0x0,
! 498: /* NLRI tuples */ 88 + 16,
! 499: 0, 1, 2, /* tag */
! 500: /* rd, 8 octets */
! 501: 0, 0, /* RD_TYPE_AS */
! 502: 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
! 503: 10, 1, /* 10.1/16 */
! 504: 88 + 17,
! 505: 0xff, 0, 0, /* tag */
! 506: /* rd, 8 octets */
! 507: 0, 0, /* RD_TYPE_IP */
! 508: 192, 168, 0, 1, /* IPv4 */
! 509: 10, 2, 3, /* 10.2.3/17 */
! 510: 0 /* 0/0, bogus for vpnv4 ?? */
! 511: },
! 512: (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3) + 1),
! 513: SHOULD_ERR,
! 514: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
! 515: },
! 516:
1.1 misho 517: /* From bug #385 */
518: { "IPv6-bug",
519: "IPv6, global nexthop, 1 default NLRI",
520: {
521: /* AFI / SAFI */ 0x0, 0x2, 0x1,
522: /* nexthop bytes */ 0x20,
523: /* Nexthop (global) */ 0x20, 0x01, 0x04, 0x70,
524: 0x00, 0x01, 0x00, 0x06,
525: 0x00, 0x00, 0x00, 0x00,
526: 0x00, 0x00, 0x00, 0x01,
527: /* Nexthop (local) */ 0xfe, 0x80, 0x00, 0x00,
528: 0x00, 0x00, 0x00, 0x00,
529: 0x02, 0x0c, 0xdb, 0xff,
530: 0xfe, 0xfe, 0xeb, 0x00,
531: /* SNPA (defunct, MBZ) */ 0,
532: /* NLRI tuples */ /* Should have 0 here for ::/0, but dont */
533: },
534: 37,
535: SHOULD_ERR,
536: AFI_IP6, SAFI_UNICAST, VALID_AFI,
537: },
538:
539: { NULL, NULL, {0}, 0, 0}
540: };
541:
542: /* MP_UNREACH_NLRI tests */
543: static struct test_segment mp_unreach_segments [] =
544: {
545: { "IPv6-unreach",
546: "IPV6 MP Unreach, 1 NLRI",
547: {
548: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
549: /* NLRI tuples */ 32, 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
550: },
551: (3 + 5),
552: SHOULD_PARSE,
553: AFI_IP6, SAFI_UNICAST, VALID_AFI,
554: },
555: { "IPv6-unreach2",
556: "IPV6 MP Unreach, 2 NLRIs",
557: {
558: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
559: /* NLRI tuples */ 32,
560: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
561: 64,
562: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
563: 0x0, 0x2, 0x0, 0x3,
564: },
565: (3 + 5 + 9),
566: SHOULD_PARSE,
567: AFI_IP6, SAFI_UNICAST, VALID_AFI,
568: },
569: { "IPv6-unreach-default",
570: "IPV6 MP Unreach, 2 NLRIs + default",
571: {
572: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
573: /* NLRI tuples */ 32,
574: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
575: 64,
576: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
577: 0x0, 0x2, 0x0, 0x3,
578: 0x0, /* ::/0 */
579: },
580: (3 + 5 + 9 + 1),
581: SHOULD_PARSE,
582: AFI_IP6, SAFI_UNICAST, VALID_AFI,
583: },
584: { "IPv6-unreach-nlri",
585: "IPV6 MP Unreach, NLRI bitlen overflow",
586: {
587: /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
588: /* NLRI tuples */ 120,
589: 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
590: 64,
591: 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
592: 0x0, 0x2, 0x0, 0x3,
593: 0, /* ::/0 */
594: },
595: (3 + 5 + 9 + 1),
596: SHOULD_ERR,
597: AFI_IP6, SAFI_UNICAST, VALID_AFI,
598: },
599: { "IPv4-unreach",
600: "IPv4 MP Unreach, 2 NLRIs + default",
601: {
602: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
603: /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
604: 17, 10, 2, 3, /* 10.2.3/17 */
605: 0, /* 0/0 */
606: },
607: (3 + 3 + 4 + 1),
608: SHOULD_PARSE,
609: AFI_IP, SAFI_UNICAST, VALID_AFI,
610: },
611: { "IPv4-unreach-nlrilen",
612: "IPv4 MP Unreach, nlri length overflow",
613: {
614: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
615: /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
616: 30, 10,
617: 0, /* 0/0 */
618: },
619: (3 + 3 + 2 + 1),
620: SHOULD_ERR,
621: AFI_IP, SAFI_UNICAST, VALID_AFI,
622: },
1.1.1.4 ! misho 623: { "IPv4-unreach-VPNv4",
1.1.1.2 misho 624: "IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs",
1.1 misho 625: {
1.1.1.2 misho 626: /* AFI / SAFI */ 0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
1.1.1.4 ! misho 627: /* NLRI tuples */ 88 + 16,
! 628: 0, 1, 2, /* tag */
! 629: /* rd, 8 octets */
! 630: 0, 0, /* RD_TYPE_AS */
! 631: 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
! 632: 10, 1, /* 10.1/16 */
! 633: 88 + 17,
! 634: 0xff, 0, 0, /* tag */
! 635: /* rd, 8 octets */
! 636: 0, 0, /* RD_TYPE_IP */
! 637: 192, 168, 0, 1, /* IPv4 */
! 638: 10, 2, 3, /* 10.2.3/17 */
1.1 misho 639: },
1.1.1.4 ! misho 640: (3 + (1+3+8+2) + (1+3+8+3)),
1.1 misho 641: SHOULD_PARSE,
1.1.1.4 ! misho 642: AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,
1.1 misho 643: },
644: { NULL, NULL, {0}, 0, 0}
645: };
646:
1.1.1.4 ! misho 647: /* nlri_parse indicates 0 on successful parse, and -1 otherwise.
! 648: * attr_parse indicates BGP_ATTR_PARSE_PROCEED/0 on success,
! 649: * and BGP_ATTR_PARSE_ERROR/-1 or lower negative ret on err.
! 650: */
! 651: static void
! 652: handle_result (struct peer *peer, struct test_segment *t,
! 653: int parse_ret, int nlri_ret)
! 654: {
! 655: int oldfailed = failed;
! 656:
! 657: if (!parse_ret)
! 658: {
! 659: safi_t safi = t->safi;
! 660:
! 661: if (bgp_afi_safi_valid_indices (t->afi, &safi) != t->afi_valid)
! 662: failed++;
! 663:
! 664: printf ("MP: %u/%u (%u): recv %u, nego %u\n",
! 665: t->afi, t->safi, safi,
! 666: peer->afc_recv[t->afi][safi],
! 667: peer->afc_nego[t->afi][safi]);
! 668: }
! 669:
! 670: printf ("mp attr parsed?: %s\n", parse_ret ? "no" : "yes");
! 671: if (!parse_ret)
! 672: printf ("nrli parsed?: %s\n", nlri_ret ? "no" : "yes");
! 673: printf ("should parse?: %s\n", t->parses ? "no" : "yes");
! 674:
! 675: if ((parse_ret != 0 || nlri_ret != 0) != (t->parses != 0))
! 676: failed++;
! 677:
! 678:
! 679: if (tty)
! 680: printf ("%s", (failed > oldfailed) ? VT100_RED "failed!" VT100_RESET
! 681: : VT100_GREEN "OK" VT100_RESET);
! 682: else
! 683: printf ("%s", (failed > oldfailed) ? "failed!" : "OK" );
! 684:
! 685: if (failed)
! 686: printf (" (%u)", failed);
! 687:
! 688: printf ("\n\n");
! 689: }
1.1 misho 690:
691: /* basic parsing test */
692: static void
693: parse_test (struct peer *peer, struct test_segment *t, int type)
694: {
1.1.1.4 ! misho 695: int parse_ret = 0, nlri_ret = 0;
1.1.1.3 misho 696: struct attr attr = { };
697: struct bgp_nlri nlri = { };
698: struct bgp_attr_parser_args attr_args = {
699: .peer = peer,
700: .length = t->len,
701: .total = 1,
702: .attr = &attr,
1.1.1.4 ! misho 703: .type = type,
1.1.1.3 misho 704: .flags = BGP_ATTR_FLAG_OPTIONAL,
705: .startp = BGP_INPUT_PNT (peer),
706: };
1.1 misho 707: #define RANDOM_FUZZ 35
708:
709: stream_reset (peer->ibuf);
710: stream_put (peer->ibuf, NULL, RANDOM_FUZZ);
711: stream_set_getp (peer->ibuf, RANDOM_FUZZ);
712:
713: stream_write (peer->ibuf, t->data, t->len);
714:
715: printf ("%s: %s\n", t->name, t->desc);
1.1.1.3 misho 716:
1.1 misho 717: if (type == BGP_ATTR_MP_REACH_NLRI)
1.1.1.4 ! misho 718: parse_ret = bgp_mp_reach_parse (&attr_args, &nlri);
1.1 misho 719: else
1.1.1.4 ! misho 720: parse_ret = bgp_mp_unreach_parse (&attr_args, &nlri);
1.1 misho 721:
1.1.1.4 ! misho 722: if (parse_ret == 0 && t->afi_valid == VALID_AFI)
! 723: assert (nlri.afi == t->afi && nlri.safi == t->safi);
1.1 misho 724:
1.1.1.4 ! misho 725: if (!parse_ret)
! 726: {
! 727: if (type == BGP_ATTR_MP_REACH_NLRI)
! 728: nlri_ret = bgp_nlri_parse (peer, &attr, &nlri);
! 729: else
! 730: nlri_ret = bgp_nlri_parse (peer, NULL, &nlri);
! 731: }
1.1 misho 732:
1.1.1.4 ! misho 733: handle_result (peer, t, parse_ret, nlri_ret);
1.1 misho 734: }
735:
736: static struct bgp *bgp;
737: static as_t asn = 100;
738:
739: int
740: main (void)
741: {
742: struct peer *peer;
743: int i, j;
744:
745: conf_bgp_debug_fsm = -1UL;
746: conf_bgp_debug_events = -1UL;
747: conf_bgp_debug_packet = -1UL;
748: conf_bgp_debug_normal = -1UL;
749: conf_bgp_debug_as4 = -1UL;
750: term_bgp_debug_fsm = -1UL;
751: term_bgp_debug_events = -1UL;
752: term_bgp_debug_packet = -1UL;
753: term_bgp_debug_normal = -1UL;
754: term_bgp_debug_as4 = -1UL;
755:
756: master = thread_master_create ();
757: bgp_master_init ();
1.1.1.3 misho 758: bgp_option_set (BGP_OPT_NO_LISTEN);
1.1.1.4 ! misho 759: bgp_attr_init ();
! 760: bgp_address_init ();
1.1 misho 761:
762: if (fileno (stdout) >= 0)
763: tty = isatty (fileno (stdout));
764:
765: if (bgp_get (&bgp, &asn, NULL))
766: return -1;
767:
768: peer = peer_create_accept (bgp);
1.1.1.4 ! misho 769: peer->host = (char *)"foo";
! 770: peer->status = Established;
1.1 misho 771:
772: for (i = AFI_IP; i < AFI_MAX; i++)
773: for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
774: {
775: peer->afc[i][j] = 1;
776: peer->afc_adv[i][j] = 1;
777: }
778:
779: i = 0;
780: while (mp_reach_segments[i].name)
781: parse_test (peer, &mp_reach_segments[i++], BGP_ATTR_MP_REACH_NLRI);
782:
783: i = 0;
784: while (mp_unreach_segments[i].name)
785: parse_test (peer, &mp_unreach_segments[i++], BGP_ATTR_MP_UNREACH_NLRI);
786:
787: printf ("failures: %d\n", failed);
788: return failed;
789: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>