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
22#include <zebra.h>
23
24#include "vty.h"
25#include "stream.h"
26#include "privs.h"
27#include "memory.h"
28
29#include "bgpd/bgpd.h"
30#include "bgpd/bgp_attr.h"
31#include "bgpd/bgp_open.h"
32#include "bgpd/bgp_debug.h"
33
34#define VT100_RESET "\x1b[0m"
35#define VT100_RED "\x1b[31m"
36#define VT100_GREEN "\x1b[32m"
37#define VT100_YELLOW "\x1b[33m"
38
39
40#define CAPABILITY 0
41#define DYNCAP     1
42#define OPT_PARAM  2
43
44/* need these to link in libbgp */
45struct zebra_privs_t *bgpd_privs = NULL;
46struct thread_master *master = NULL;
47
48static int failed = 0;
49static int tty = 0;
50
51/* test segments to parse and validate, and use for other tests */
52static struct test_segment {
53  const char *name;
54  const char *desc;
55  const u_char data[1024];
56  int len;
57#define SHOULD_PARSE	0
58#define SHOULD_ERR	-1
59  int parses; /* whether it should parse or not */
60
61  /* AFI/SAFI validation */
62  afi_t afi;
63  safi_t safi;
64#define VALID_AFI 1
65#define INVALID_AFI 0
66  int afi_valid;
67} mp_reach_segments [] =
68{
69  { "IPv6",
70    "IPV6 MP Reach, global nexthop, 1 NLRI",
71    {
72      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
73      /* nexthop bytes */	16,
74      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,
75                                0xaa, 0xbb, 0xcc, 0xdd,
76                                0x3,  0x4,  0x5,  0x6,
77                                0xa1, 0xa2, 0xa3, 0xa4,
78      /* SNPA (defunct, MBZ) */	0x0,
79      /* NLRI tuples */		32, 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
80    },
81    (4 + 16 + 1 + 5),
82    SHOULD_PARSE,
83    AFI_IP6, SAFI_UNICAST, VALID_AFI,
84  },
85  { "IPv6-2",
86    "IPV6 MP Reach, global nexthop, 2 NLRIs",
87    {
88      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
89      /* nexthop bytes */	16,
90      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,   /* ffee:102:... */
91                                0xaa, 0xbb, 0xcc, 0xdd,
92                                0x3,  0x4,  0x5,  0x6,
93                                0xa1, 0xa2, 0xa3, 0xa4,
94      /* SNPA (defunct, MBZ) */	0x0,
95      /* NLRI tuples */		32,
96                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
97                                64,
98                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
99                                0x0,  0x2,  0x0, 0x3,
100    },
101    (4 + 16 + 1 + 5 + 9),
102    SHOULD_PARSE,
103    AFI_IP6, SAFI_UNICAST, VALID_AFI,
104  },
105  { "IPv6-default",
106    "IPV6 MP Reach, global nexthop, 2 NLRIs + default",
107    {
108      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
109      /* nexthop bytes */	16,
110      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,
111                                0xaa, 0xbb, 0xcc, 0xdd,
112                                0x3,  0x4,  0x5,  0x6,
113                                0xa1, 0xa2, 0xa3, 0xa4,
114      /* SNPA (defunct, MBZ) */	0x0,
115      /* NLRI tuples */		32,
116                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
117                                64,
118                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
119                                0x0,  0x2,  0x0, 0x3,
120                                0x0, /* ::/0 */
121    },
122    (4 + 16 + 1 + 5 + 9 + 1),
123    SHOULD_PARSE,
124    AFI_IP6, SAFI_UNICAST, VALID_AFI,
125  },
126  { "IPv6-lnh",
127    "IPV6 MP Reach, global+local nexthops, 2 NLRIs + default",
128    {
129      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
130      /* nexthop bytes */	32,
131      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
132                                0xaa, 0xbb, 0xcc, 0xdd,
133                                0x3,  0x4,  0x5,  0x6,
134                                0xa1, 0xa2, 0xa3, 0xa4,
135      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
136                                0x0,  0x0,  0x0,  0x0,
137                                0x2,  0x10, 0x2,  0xff,
138                                0x1,  0x2,  0x3,  0x4,
139      /* SNPA (defunct, MBZ) */	0x0,
140      /* NLRI tuples */		32,
141                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
142                                64,
143                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
144                                0x0,  0x2,  0x0, 0x3,
145                                0x0, /* ::/0 */
146    },
147    (4 + 32 + 1 + 5 + 9 + 1),
148    SHOULD_PARSE,
149    AFI_IP6, SAFI_UNICAST, VALID_AFI,
150  },
151  { "IPv6-nhlen",
152    "IPV6 MP Reach, inappropriate nexthop length",
153    {
154      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
155      /* nexthop bytes */	4,
156      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
157                                0xaa, 0xbb, 0xcc, 0xdd,
158                                0x3,  0x4,  0x5,  0x6,
159                                0xa1, 0xa2, 0xa3, 0xa4,
160      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
161                                0x0,  0x0,  0x0,  0x0,
162                                0x2,  0x10, 0x2,  0xff,
163                                0x1,  0x2,  0x3,  0x4,
164      /* SNPA (defunct, MBZ) */	0x0,
165      /* NLRI tuples */		32,
166                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
167                                64,
168                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
169                                0x0,  0x2,  0x0, 0x3,
170                                0x0, /* ::/0 */
171    },
172    (4 + 32 + 1 + 5 + 9 + 1),
173    SHOULD_ERR,
174    AFI_IP6, SAFI_UNICAST, VALID_AFI,
175  },
176  { "IPv6-nhlen2",
177    "IPV6 MP Reach, invalid nexthop length",
178    {
179      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
180      /* nexthop bytes */	5,
181      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
182                                0xaa, 0xbb, 0xcc, 0xdd,
183                                0x3,  0x4,  0x5,  0x6,
184                                0xa1, 0xa2, 0xa3, 0xa4,
185      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
186                                0x0,  0x0,  0x0,  0x0,
187                                0x2,  0x10, 0x2,  0xff,
188                                0x1,  0x2,  0x3,  0x4,
189      /* SNPA (defunct, MBZ) */	0x0,
190      /* NLRI tuples */		32,
191                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
192                                64,
193                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
194                                0x0,  0x2,  0x0, 0x3,
195                                0x0, /* ::/0 */
196    },
197    (4 + 32 + 1 + 5 + 9 + 1),
198    SHOULD_ERR,
199    AFI_IP6, SAFI_UNICAST, VALID_AFI,
200  },
201  { "IPv6-nhlen3",
202    "IPV6 MP Reach, nexthop length overflow",
203    {
204      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
205      /* nexthop bytes */	32,
206      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
207                                0xaa, 0xbb, 0xcc, 0xdd,
208                                0x3,  0x4,  0x5,  0x6,
209                                0xa1, 0xa2, 0xa3, 0xa4,
210    },
211    (4 + 16),
212    SHOULD_ERR,
213    AFI_IP6, SAFI_UNICAST, VALID_AFI,
214  },
215  { "IPv6-nhlen4",
216    "IPV6 MP Reach, nexthop length short",
217    {
218      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
219      /* nexthop bytes */	16,
220      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
221                                0xaa, 0xbb, 0xcc, 0xdd,
222                                0x3,  0x4,  0x5,  0x6,
223                                0xa1, 0xa2, 0xa3, 0xa4,
224      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
225                                0x0,  0x0,  0x0,  0x0,
226                                0x2,  0x10, 0x2,  0xff,
227                                0x1,  0x2,  0x3,  0x4,
228      /* SNPA (defunct, MBZ) */	0x0,
229      /* NLRI tuples */		32,
230                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
231                                64,
232                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
233                                0x0,  0x2,  0x0, 0x3,
234                                0x0, /* ::/0 */
235    },
236    (4 + 32 + 1 + 5 + 9 + 1),
237    SHOULD_ERR,
238    AFI_IP6, SAFI_UNICAST, VALID_AFI,
239  },
240  { "IPv6-nlri",
241    "IPV6 MP Reach, NLRI bitlen overflow",
242    {
243      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
244      /* nexthop bytes */	32,
245      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
246                                0xaa, 0xbb, 0xcc, 0xdd,
247                                0x3,  0x4,  0x5,  0x6,
248                                0xa1, 0xa2, 0xa3, 0xa4,
249      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
250                                0x0,  0x0,  0x0,  0x0,
251                                0x2,  0x10, 0x2,  0xff,
252                                0x1,  0x2,  0x3,  0x4,
253      /* SNPA (defunct, MBZ) */	0x0,
254      /* NLRI tuples */		120,
255                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
256                                64,
257                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
258                                0x0,  0x2,  0x0, 0x3,
259                                0, /* ::/0 */
260    },
261    (4 + 32 + 1 + 5 + 9 + 1),
262    SHOULD_ERR,
263    AFI_IP6, SAFI_UNICAST, VALID_AFI,
264  },
265  { "IPv4",
266    "IPv4 MP Reach, 2 NLRIs + default",
267    {
268      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
269      /* nexthop bytes */	4,
270      /* Nexthop */		192, 168,   0,  1,
271      /* SNPA (defunct, MBZ) */	0x0,
272      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
273                                17, 10, 2, 3, /* 10.2.3/17 */
274                                0, /* 0/0 */
275    },
276    (4 + 4 + 1 + 3 + 4 + 1),
277    SHOULD_PARSE,
278    AFI_IP, SAFI_UNICAST, VALID_AFI,
279  },
280  { "IPv4-nhlen",
281    "IPv4 MP Reach, nexthop lenth overflow",
282    {
283      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
284      /* nexthop bytes */	32,
285      /* Nexthop */		192, 168,   0,  1,
286      /* SNPA (defunct, MBZ) */	0x0,
287      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
288                                17, 10, 2, 3, /* 10.2.3/17 */
289                                0, /* 0/0 */
290    },
291    (4 + 4 + 1 + 3 + 4 + 1),
292    SHOULD_ERR,
293    AFI_IP, SAFI_UNICAST, VALID_AFI,
294  },
295  { "IPv4-nlrilen",
296    "IPv4 MP Reach, nlri lenth overflow",
297    {
298      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
299      /* nexthop bytes */	4,
300      /* Nexthop */		192, 168,   0,  1,
301      /* SNPA (defunct, MBZ) */	0x0,
302      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
303                                30, 10,
304                                0, /* 0/0 */
305    },
306    (4 + 4 + 1 + 3 + 2 + 1),
307    SHOULD_ERR,
308    AFI_IP, SAFI_UNICAST, VALID_AFI,
309  },
310  { "IPv4-MLVPN",
311    "IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, 3 NLRIs",
312    {
313      /* AFI / SAFI */		0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
314      /* nexthop bytes */	12,
315      /* RD */			0, 0, 1, 2,
316                                0, 0xff, 3, 4,
317      /* Nexthop */		192, 168,   0,  1,
318      /* SNPA (defunct, MBZ) */	0x0,
319      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
320                                17, 10, 2, 3,  /* 10.2.3/17 */
321                                0, /* 0/0 */
322    },
323    (4 + 12 + 1 + 3 + 4 + 1),
324    SHOULD_PARSE,
325    AFI_IP, SAFI_UNICAST, VALID_AFI,
326  },
327  /* From bug #385 */
328  { "IPv6-bug",
329    "IPv6, global nexthop, 1 default NLRI",
330    {
331      /* AFI / SAFI */		0x0, 0x2, 0x1,
332      /* nexthop bytes */	0x20,
333      /* Nexthop (global) */	0x20, 0x01, 0x04, 0x70,
334                                0x00, 0x01, 0x00, 0x06,
335                                0x00, 0x00, 0x00, 0x00,
336                                0x00, 0x00, 0x00, 0x01,
337      /* Nexthop (local) */     0xfe, 0x80, 0x00, 0x00,
338                                0x00, 0x00, 0x00, 0x00,
339                                0x02, 0x0c, 0xdb, 0xff,
340                                0xfe, 0xfe, 0xeb, 0x00,
341      /* SNPA (defunct, MBZ) */	0,
342      /* NLRI tuples */		/* Should have 0 here for ::/0, but dont */
343    },
344    37,
345    SHOULD_ERR,
346    AFI_IP6, SAFI_UNICAST, VALID_AFI,
347  },
348
349  { NULL, NULL, {0}, 0, 0}
350};
351
352/* MP_UNREACH_NLRI tests */
353static struct test_segment mp_unreach_segments [] =
354{
355  { "IPv6-unreach",
356    "IPV6 MP Unreach, 1 NLRI",
357    {
358      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
359      /* NLRI tuples */		32, 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
360    },
361    (3 + 5),
362    SHOULD_PARSE,
363    AFI_IP6, SAFI_UNICAST, VALID_AFI,
364  },
365  { "IPv6-unreach2",
366    "IPV6 MP Unreach, 2 NLRIs",
367    {
368      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
369      /* NLRI tuples */		32,
370                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
371                                64,
372                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
373                                0x0,  0x2,  0x0, 0x3,
374    },
375    (3 + 5 + 9),
376    SHOULD_PARSE,
377    AFI_IP6, SAFI_UNICAST, VALID_AFI,
378  },
379  { "IPv6-unreach-default",
380    "IPV6 MP Unreach, 2 NLRIs + default",
381    {
382      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
383      /* NLRI tuples */		32,
384                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
385                                64,
386                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
387                                0x0,  0x2,  0x0, 0x3,
388                                0x0, /* ::/0 */
389    },
390    (3 + 5 + 9 + 1),
391    SHOULD_PARSE,
392    AFI_IP6, SAFI_UNICAST, VALID_AFI,
393  },
394  { "IPv6-unreach-nlri",
395    "IPV6 MP Unreach, NLRI bitlen overflow",
396    {
397      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
398      /* NLRI tuples */		120,
399                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
400                                64,
401                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
402                                0x0,  0x2,  0x0, 0x3,
403                                0, /* ::/0 */
404    },
405    (3 + 5 + 9 + 1),
406    SHOULD_ERR,
407    AFI_IP6, SAFI_UNICAST, VALID_AFI,
408  },
409  { "IPv4-unreach",
410    "IPv4 MP Unreach, 2 NLRIs + default",
411    {
412      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
413      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
414                                17, 10, 2, 3, /* 10.2.3/17 */
415                                0, /* 0/0 */
416    },
417    (3 + 3 + 4 + 1),
418    SHOULD_PARSE,
419    AFI_IP, SAFI_UNICAST, VALID_AFI,
420  },
421  { "IPv4-unreach-nlrilen",
422    "IPv4 MP Unreach, nlri length overflow",
423    {
424      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
425      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
426                                30, 10,
427                                0, /* 0/0 */
428    },
429    (3 + 3 + 2 + 1),
430    SHOULD_ERR,
431    AFI_IP, SAFI_UNICAST, VALID_AFI,
432  },
433  { "IPv4-unreach-MLVPN",
434    "IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs",
435    {
436      /* AFI / SAFI */		0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
437      /* nexthop bytes */	12,
438      /* RD */			0, 0, 1, 2,
439                                0, 0xff, 3, 4,
440      /* Nexthop */		192, 168,   0,  1,
441      /* SNPA (defunct, MBZ) */	0x0,
442      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
443                                17, 10, 2, 3,  /* 10.2.3/17 */
444                                0, /* 0/0 */
445    },
446    (3 + 3 + 4 + 1),
447    SHOULD_PARSE,
448    AFI_IP, SAFI_UNICAST, VALID_AFI,
449  },
450  { NULL, NULL, {0}, 0, 0}
451};
452
453
454/* basic parsing test */
455static void
456parse_test (struct peer *peer, struct test_segment *t, int type)
457{
458  int ret;
459  int oldfailed = failed;
460  struct attr attr = { };
461  struct bgp_nlri nlri = { };
462  struct bgp_attr_parser_args attr_args = {
463    .peer = peer,
464    .length = t->len,
465    .total = 1,
466    .attr = &attr,
467    .type = BGP_ATTR_MP_REACH_NLRI,
468    .flags = BGP_ATTR_FLAG_OPTIONAL,
469    .startp = BGP_INPUT_PNT (peer),
470  };
471#define RANDOM_FUZZ 35
472
473  stream_reset (peer->ibuf);
474  stream_put (peer->ibuf, NULL, RANDOM_FUZZ);
475  stream_set_getp (peer->ibuf, RANDOM_FUZZ);
476
477  stream_write (peer->ibuf, t->data, t->len);
478
479  printf ("%s: %s\n", t->name, t->desc);
480
481
482  if (type == BGP_ATTR_MP_REACH_NLRI)
483    ret = bgp_mp_reach_parse (&attr_args, &nlri);
484  else
485    ret = bgp_mp_unreach_parse (&attr_args, &nlri);
486
487  if (!ret)
488    {
489      safi_t safi = t->safi;
490
491      if (bgp_afi_safi_valid_indices (t->afi, &safi) != t->afi_valid)
492        failed++;
493
494      printf ("MP: %u/%u (%u): recv %u, nego %u\n",
495              t->afi, t->safi, safi,
496              peer->afc_recv[t->afi][safi],
497              peer->afc_nego[t->afi][safi]);
498    }
499
500  printf ("parsed?: %s\n", ret ? "no" : "yes");
501
502  if ((ret == 0) != (t->parses == 0))
503    failed++;
504
505  if (tty)
506    printf ("%s", (failed > oldfailed) ? VT100_RED "failed!" VT100_RESET
507                                         : VT100_GREEN "OK" VT100_RESET);
508  else
509    printf ("%s", (failed > oldfailed) ? "failed!" : "OK" );
510
511  if (failed)
512    printf (" (%u)", failed);
513
514  printf ("\n\n");
515}
516
517static struct bgp *bgp;
518static as_t asn = 100;
519
520int
521main (void)
522{
523  struct peer *peer;
524  int i, j;
525
526  conf_bgp_debug_fsm = -1UL;
527  conf_bgp_debug_events = -1UL;
528  conf_bgp_debug_packet = -1UL;
529  conf_bgp_debug_normal = -1UL;
530  conf_bgp_debug_as4 = -1UL;
531  term_bgp_debug_fsm = -1UL;
532  term_bgp_debug_events = -1UL;
533  term_bgp_debug_packet = -1UL;
534  term_bgp_debug_normal = -1UL;
535  term_bgp_debug_as4 = -1UL;
536
537  master = thread_master_create ();
538  bgp_master_init ();
539  bgp_option_set (BGP_OPT_NO_LISTEN);
540
541  if (fileno (stdout) >= 0)
542    tty = isatty (fileno (stdout));
543
544  if (bgp_get (&bgp, &asn, NULL))
545    return -1;
546
547  peer = peer_create_accept (bgp);
548  peer->host = "foo";
549
550  for (i = AFI_IP; i < AFI_MAX; i++)
551    for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
552      {
553        peer->afc[i][j] = 1;
554        peer->afc_adv[i][j] = 1;
555      }
556
557  i = 0;
558  while (mp_reach_segments[i].name)
559    parse_test (peer, &mp_reach_segments[i++], BGP_ATTR_MP_REACH_NLRI);
560
561  i = 0;
562  while (mp_unreach_segments[i].name)
563    parse_test (peer, &mp_unreach_segments[i++], BGP_ATTR_MP_UNREACH_NLRI);
564
565  printf ("failures: %d\n", failed);
566  return failed;
567}
568