mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 06:38:04 +00:00 
			
		
		
		
	* bgp_attr.[ch]
  * bgp_mp_reach_parse(): add extra arguments and a uniform flag
    check block
  * bgp_mp_unreach_parse(): idem
  * bgp_attr_parse(): provide extra arguments
* bgp_mp_attr_test.c
  * parse_test(): justify respective calls
		
	
			
		
			
				
	
	
		
			536 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			536 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <zebra.h>
 | 
						|
 | 
						|
#include "vty.h"
 | 
						|
#include "stream.h"
 | 
						|
#include "privs.h"
 | 
						|
#include "memory.h"
 | 
						|
 | 
						|
#include "bgpd/bgpd.h"
 | 
						|
#include "bgpd/bgp_attr.h"
 | 
						|
#include "bgpd/bgp_open.h"
 | 
						|
#include "bgpd/bgp_debug.h"
 | 
						|
 | 
						|
#define VT100_RESET "\x1b[0m"
 | 
						|
#define VT100_RED "\x1b[31m"
 | 
						|
#define VT100_GREEN "\x1b[32m"
 | 
						|
#define VT100_YELLOW "\x1b[33m"
 | 
						|
 | 
						|
 | 
						|
#define CAPABILITY 0
 | 
						|
#define DYNCAP     1
 | 
						|
#define OPT_PARAM  2
 | 
						|
 | 
						|
/* need these to link in libbgp */
 | 
						|
struct zebra_privs_t *bgpd_privs = NULL;
 | 
						|
struct thread_master *master = NULL;
 | 
						|
 | 
						|
static int failed = 0;
 | 
						|
static int tty = 0;
 | 
						|
 | 
						|
/* test segments to parse and validate, and use for other tests */
 | 
						|
static struct test_segment {
 | 
						|
  const char *name;
 | 
						|
  const char *desc;
 | 
						|
  const u_char data[1024];
 | 
						|
  int len;
 | 
						|
#define SHOULD_PARSE	0
 | 
						|
#define SHOULD_ERR	-1
 | 
						|
  int parses; /* whether it should parse or not */
 | 
						|
  
 | 
						|
  /* AFI/SAFI validation */
 | 
						|
  afi_t afi;
 | 
						|
  safi_t safi;
 | 
						|
#define VALID_AFI 1
 | 
						|
#define INVALID_AFI 0
 | 
						|
  int afi_valid;
 | 
						|
} mp_reach_segments [] = 
 | 
						|
{
 | 
						|
  { "IPv6",
 | 
						|
    "IPV6 MP Reach, global nexthop, 1 NLRI", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	16,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		32, 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
    },
 | 
						|
    (4 + 16 + 1 + 5), 
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-2",
 | 
						|
    "IPV6 MP Reach, global nexthop, 2 NLRIs", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	16,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,   /* ffee:102:... */
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		32, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
    },
 | 
						|
    (4 + 16 + 1 + 5 + 9), 
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-default",
 | 
						|
    "IPV6 MP Reach, global nexthop, 2 NLRIs + default", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	16,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		32, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
                                0x0, /* ::/0 */
 | 
						|
    },
 | 
						|
    (4 + 16 + 1 + 5 + 9 + 1),
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-lnh",
 | 
						|
    "IPV6 MP Reach, global+local nexthops, 2 NLRIs + default", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	32,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
 | 
						|
                                0x0,  0x0,  0x0,  0x0,
 | 
						|
                                0x2,  0x10, 0x2,  0xff,
 | 
						|
                                0x1,  0x2,  0x3,  0x4,
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		32, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
                                0x0, /* ::/0 */
 | 
						|
    },
 | 
						|
    (4 + 32 + 1 + 5 + 9 + 1),
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-nhlen",
 | 
						|
    "IPV6 MP Reach, inappropriate nexthop length", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	4,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
 | 
						|
                                0x0,  0x0,  0x0,  0x0,
 | 
						|
                                0x2,  0x10, 0x2,  0xff,
 | 
						|
                                0x1,  0x2,  0x3,  0x4,
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		32, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
                                0x0, /* ::/0 */
 | 
						|
    },
 | 
						|
    (4 + 32 + 1 + 5 + 9 + 1),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-nhlen2",
 | 
						|
    "IPV6 MP Reach, invalid nexthop length", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	5,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
 | 
						|
                                0x0,  0x0,  0x0,  0x0,
 | 
						|
                                0x2,  0x10, 0x2,  0xff,
 | 
						|
                                0x1,  0x2,  0x3,  0x4,
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		32, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
                                0x0, /* ::/0 */
 | 
						|
    },
 | 
						|
    (4 + 32 + 1 + 5 + 9 + 1),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-nhlen3",
 | 
						|
    "IPV6 MP Reach, nexthop length overflow", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	32,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
    },
 | 
						|
    (4 + 16),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-nhlen4",
 | 
						|
    "IPV6 MP Reach, nexthop length short", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	16,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
 | 
						|
                                0x0,  0x0,  0x0,  0x0,
 | 
						|
                                0x2,  0x10, 0x2,  0xff,
 | 
						|
                                0x1,  0x2,  0x3,  0x4,
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		32, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
                                0x0, /* ::/0 */
 | 
						|
    },
 | 
						|
    (4 + 32 + 1 + 5 + 9 + 1),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-nlri",
 | 
						|
    "IPV6 MP Reach, NLRI bitlen overflow", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	32,
 | 
						|
      /* Nexthop (global) */	0xff, 0xfe, 0x1,  0x2,  /* fffe:102:... */
 | 
						|
                                0xaa, 0xbb, 0xcc, 0xdd,
 | 
						|
                                0x3,  0x4,  0x5,  0x6,
 | 
						|
                                0xa1, 0xa2, 0xa3, 0xa4,
 | 
						|
      /* Nexthop (local) */     0xfe, 0x80, 0x0,  0x0,  /* fe80::210:2ff:.. */
 | 
						|
                                0x0,  0x0,  0x0,  0x0,
 | 
						|
                                0x2,  0x10, 0x2,  0xff,
 | 
						|
                                0x1,  0x2,  0x3,  0x4,
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		120, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
                                0, /* ::/0 */
 | 
						|
    },
 | 
						|
    (4 + 32 + 1 + 5 + 9 + 1),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv4",
 | 
						|
    "IPv4 MP Reach, 2 NLRIs + default", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	4,
 | 
						|
      /* Nexthop */		192, 168,   0,  1, 
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
 | 
						|
                                17, 10, 2, 3, /* 10.2.3/17 */
 | 
						|
                                0, /* 0/0 */
 | 
						|
    },
 | 
						|
    (4 + 4 + 1 + 3 + 4 + 1),
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv4-nhlen",
 | 
						|
    "IPv4 MP Reach, nexthop lenth overflow", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	32,
 | 
						|
      /* Nexthop */		192, 168,   0,  1, 
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
 | 
						|
                                17, 10, 2, 3, /* 10.2.3/17 */
 | 
						|
                                0, /* 0/0 */
 | 
						|
    },
 | 
						|
    (4 + 4 + 1 + 3 + 4 + 1),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv4-nlrilen",
 | 
						|
    "IPv4 MP Reach, nlri lenth overflow", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
 | 
						|
      /* nexthop bytes */	4,
 | 
						|
      /* Nexthop */		192, 168,   0,  1, 
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
 | 
						|
                                30, 10, 
 | 
						|
                                0, /* 0/0 */
 | 
						|
    },
 | 
						|
    (4 + 4 + 1 + 3 + 2 + 1),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv4-MLVPN",
 | 
						|
    "IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, 3 NLRIs", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
 | 
						|
      /* nexthop bytes */	12,
 | 
						|
      /* RD */			0, 0, 1, 2,
 | 
						|
                                0, 0xff, 3, 4,
 | 
						|
      /* Nexthop */		192, 168,   0,  1, 
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
 | 
						|
                                17, 10, 2, 3,  /* 10.2.3/17 */
 | 
						|
                                0, /* 0/0 */
 | 
						|
    },
 | 
						|
    (4 + 12 + 1 + 3 + 4 + 1),
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  /* From bug #385 */
 | 
						|
  { "IPv6-bug",
 | 
						|
    "IPv6, global nexthop, 1 default NLRI", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, 0x2, 0x1,
 | 
						|
      /* nexthop bytes */	0x20,
 | 
						|
      /* Nexthop (global) */	0x20, 0x01, 0x04, 0x70, 
 | 
						|
                                0x00, 0x01, 0x00, 0x06,
 | 
						|
                                0x00, 0x00, 0x00, 0x00,
 | 
						|
                                0x00, 0x00, 0x00, 0x01, 
 | 
						|
      /* Nexthop (local) */     0xfe, 0x80, 0x00, 0x00, 
 | 
						|
                                0x00, 0x00, 0x00, 0x00,
 | 
						|
                                0x02, 0x0c, 0xdb, 0xff, 
 | 
						|
                                0xfe, 0xfe, 0xeb, 0x00,
 | 
						|
      /* SNPA (defunct, MBZ) */	0,
 | 
						|
      /* NLRI tuples */		/* Should have 0 here for ::/0, but dont */
 | 
						|
    },
 | 
						|
    37,
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  
 | 
						|
  { NULL, NULL, {0}, 0, 0}
 | 
						|
};
 | 
						|
 | 
						|
/* MP_UNREACH_NLRI tests */
 | 
						|
static struct test_segment mp_unreach_segments [] =
 | 
						|
{
 | 
						|
  { "IPv6-unreach",
 | 
						|
    "IPV6 MP Unreach, 1 NLRI", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* NLRI tuples */		32, 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
    },
 | 
						|
    (3 + 5), 
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-unreach2",
 | 
						|
    "IPV6 MP Unreach, 2 NLRIs", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* NLRI tuples */		32, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
    },
 | 
						|
    (3 + 5 + 9), 
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-unreach-default",
 | 
						|
    "IPV6 MP Unreach, 2 NLRIs + default", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* NLRI tuples */		32, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
                                0x0, /* ::/0 */
 | 
						|
    },
 | 
						|
    (3 + 5 + 9 + 1),
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv6-unreach-nlri",
 | 
						|
    "IPV6 MP Unreach, NLRI bitlen overflow", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP6, SAFI_UNICAST,
 | 
						|
      /* NLRI tuples */		120, 
 | 
						|
                                0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
 | 
						|
                                64,
 | 
						|
                                0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
 | 
						|
                                0x0,  0x2,  0x0, 0x3,
 | 
						|
                                0, /* ::/0 */
 | 
						|
    },
 | 
						|
    (3 + 5 + 9 + 1),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP6, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv4-unreach",
 | 
						|
    "IPv4 MP Unreach, 2 NLRIs + default", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
 | 
						|
      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
 | 
						|
                                17, 10, 2, 3, /* 10.2.3/17 */
 | 
						|
                                0, /* 0/0 */
 | 
						|
    },
 | 
						|
    (3 + 3 + 4 + 1),
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv4-unreach-nlrilen",
 | 
						|
    "IPv4 MP Unreach, nlri length overflow", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP, SAFI_UNICAST,
 | 
						|
      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
 | 
						|
                                30, 10, 
 | 
						|
                                0, /* 0/0 */
 | 
						|
    },
 | 
						|
    (3 + 3 + 2 + 1),
 | 
						|
    SHOULD_ERR,
 | 
						|
    AFI_IP, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { "IPv4-unreach-MLVPN",
 | 
						|
    "IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs", 
 | 
						|
    {
 | 
						|
      /* AFI / SAFI */		0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,
 | 
						|
      /* nexthop bytes */	12,
 | 
						|
      /* RD */			0, 0, 1, 2,
 | 
						|
                                0, 0xff, 3, 4,
 | 
						|
      /* Nexthop */		192, 168,   0,  1, 
 | 
						|
      /* SNPA (defunct, MBZ) */	0x0,
 | 
						|
      /* NLRI tuples */		16, 10, 1,    /* 10.1/16 */
 | 
						|
                                17, 10, 2, 3,  /* 10.2.3/17 */
 | 
						|
                                0, /* 0/0 */
 | 
						|
    },
 | 
						|
    (3 + 3 + 4 + 1),
 | 
						|
    SHOULD_PARSE,
 | 
						|
    AFI_IP, SAFI_UNICAST, VALID_AFI,
 | 
						|
  },
 | 
						|
  { NULL, NULL, {0}, 0, 0}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* basic parsing test */
 | 
						|
static void
 | 
						|
parse_test (struct peer *peer, struct test_segment *t, int type)
 | 
						|
{
 | 
						|
  int ret;
 | 
						|
  int oldfailed = failed;
 | 
						|
  struct attr attr;
 | 
						|
  struct bgp_nlri nlri;
 | 
						|
#define RANDOM_FUZZ 35
 | 
						|
  
 | 
						|
  stream_reset (peer->ibuf);
 | 
						|
  stream_put (peer->ibuf, NULL, RANDOM_FUZZ);
 | 
						|
  stream_set_getp (peer->ibuf, RANDOM_FUZZ);
 | 
						|
  
 | 
						|
  stream_write (peer->ibuf, t->data, t->len);
 | 
						|
  
 | 
						|
  printf ("%s: %s\n", t->name, t->desc);
 | 
						|
 | 
						|
  if (type == BGP_ATTR_MP_REACH_NLRI)
 | 
						|
    ret = bgp_mp_reach_parse (peer, t->len, &attr, BGP_ATTR_FLAG_OPTIONAL, BGP_INPUT_PNT (peer), &nlri);
 | 
						|
  else
 | 
						|
    ret = bgp_mp_unreach_parse (peer, t->len, BGP_ATTR_FLAG_OPTIONAL, BGP_INPUT_PNT (peer), &nlri);
 | 
						|
 | 
						|
  if (!ret)
 | 
						|
    {
 | 
						|
      safi_t safi = t->safi;
 | 
						|
      
 | 
						|
      if (bgp_afi_safi_valid_indices (t->afi, &safi) != t->afi_valid)
 | 
						|
        failed++;
 | 
						|
      
 | 
						|
      printf ("MP: %u/%u (%u): recv %u, nego %u\n",
 | 
						|
              t->afi, t->safi, safi,
 | 
						|
              peer->afc_recv[t->afi][safi],
 | 
						|
              peer->afc_nego[t->afi][safi]);
 | 
						|
    }
 | 
						|
  
 | 
						|
  printf ("parsed?: %s\n", ret ? "no" : "yes");
 | 
						|
  
 | 
						|
  if (ret != t->parses)
 | 
						|
    failed++;
 | 
						|
  
 | 
						|
  if (tty)
 | 
						|
    printf ("%s", (failed > oldfailed) ? VT100_RED "failed!" VT100_RESET 
 | 
						|
                                         : VT100_GREEN "OK" VT100_RESET);
 | 
						|
  else
 | 
						|
    printf ("%s", (failed > oldfailed) ? "failed!" : "OK" );
 | 
						|
  
 | 
						|
  if (failed)
 | 
						|
    printf (" (%u)", failed);
 | 
						|
  
 | 
						|
  printf ("\n\n");
 | 
						|
}
 | 
						|
 | 
						|
static struct bgp *bgp;
 | 
						|
static as_t asn = 100;
 | 
						|
 | 
						|
int
 | 
						|
main (void)
 | 
						|
{
 | 
						|
  struct peer *peer;
 | 
						|
  int i, j;
 | 
						|
  
 | 
						|
  conf_bgp_debug_fsm = -1UL;
 | 
						|
  conf_bgp_debug_events = -1UL;
 | 
						|
  conf_bgp_debug_packet = -1UL;
 | 
						|
  conf_bgp_debug_normal = -1UL;
 | 
						|
  conf_bgp_debug_as4 = -1UL;
 | 
						|
  term_bgp_debug_fsm = -1UL;
 | 
						|
  term_bgp_debug_events = -1UL;
 | 
						|
  term_bgp_debug_packet = -1UL;
 | 
						|
  term_bgp_debug_normal = -1UL;
 | 
						|
  term_bgp_debug_as4 = -1UL;
 | 
						|
  
 | 
						|
  master = thread_master_create ();
 | 
						|
  bgp_master_init ();
 | 
						|
  
 | 
						|
  if (fileno (stdout) >= 0) 
 | 
						|
    tty = isatty (fileno (stdout));
 | 
						|
  
 | 
						|
  if (bgp_get (&bgp, &asn, NULL))
 | 
						|
    return -1;
 | 
						|
  
 | 
						|
  peer = peer_create_accept (bgp);
 | 
						|
  peer->host = "foo";
 | 
						|
  
 | 
						|
  for (i = AFI_IP; i < AFI_MAX; i++)
 | 
						|
    for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
 | 
						|
      {
 | 
						|
        peer->afc[i][j] = 1;
 | 
						|
        peer->afc_adv[i][j] = 1;
 | 
						|
      }
 | 
						|
  
 | 
						|
  i = 0;
 | 
						|
  while (mp_reach_segments[i].name)
 | 
						|
    parse_test (peer, &mp_reach_segments[i++], BGP_ATTR_MP_REACH_NLRI);
 | 
						|
 | 
						|
  i = 0;
 | 
						|
  while (mp_unreach_segments[i].name)
 | 
						|
    parse_test (peer, &mp_unreach_segments[i++], BGP_ATTR_MP_UNREACH_NLRI);
 | 
						|
 | 
						|
  printf ("failures: %d\n", failed);
 | 
						|
  return failed;
 | 
						|
}
 |