summaryrefslogtreecommitdiffstats
path: root/tests/bgpd/test_mp_attr.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/bgpd/test_mp_attr.c')
-rw-r--r--tests/bgpd/test_mp_attr.c1758
1 files changed, 1054 insertions, 704 deletions
diff --git a/tests/bgpd/test_mp_attr.c b/tests/bgpd/test_mp_attr.c
index f6f0fb70a..7c0afa1b9 100644
--- a/tests/bgpd/test_mp_attr.c
+++ b/tests/bgpd/test_mp_attr.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (C) 2008 Sun Microsystems, Inc.
*
* This file is part of Quagga.
@@ -42,7 +42,6 @@
#define VT100_GREEN "\x1b[32m"
#define VT100_YELLOW "\x1b[33m"
-
#define CAPABILITY 0
#define DYNCAP 1
#define OPT_PARAM 2
@@ -56,729 +55,1080 @@ 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;
+ 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;
+ 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-VPNv4",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_PARSE,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-bogus-plen",
- "IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, NLRI / bogus p'len",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_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 + 1 + 3*4 + 1 + 3 + 4 + 1),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-plen1-short",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen short",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 1,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-plen1-long",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen long",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 32,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-plenn-long",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRIs, last plen long",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- 88 + 1, /* bogus */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3) + 1),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-plenn-short",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, last plen short",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 2,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-bogus-rd-type",
- "IPv4/VPNv4 MP Reach, RD, NH, 2 NLRI, unknown RD in 1st (log, but parse)",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0xff, 0, /* Bogus RD */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_PARSE,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-0-nlri",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRI, 3rd 0 bogus",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- 0 /* 0/0, bogus for vpnv4 ?? */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3) + 1),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, 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}
-};
+ 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-VPNv4",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_PARSE,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-bogus-plen",
+ "IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, NLRI / bogus p'len",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP,
+ IANA_SAFI_MPLS_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 + 1 + 3 * 4 + 1 + 3 + 4 + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-plen1-short",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen short",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 1, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-plen1-long",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen long",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 32, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-plenn-long",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRIs, last plen long",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ 88 + 1, /* bogus */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3) + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-plenn-short",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, last plen short",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 2, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-bogus-rd-type",
+ "IPv4/VPNv4 MP Reach, RD, NH, 2 NLRI, unknown RD in 1st (log, but parse)",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0xff, 0, /* Bogus RD */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_PARSE,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-0-nlri",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRI, 3rd 0 bogus",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ 0 /* 0/0, bogus for vpnv4 ?? */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3) + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ 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-VPNv4",
- "IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (3 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_PARSE,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { NULL, NULL, {0}, 0, 0}
-};
+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-VPNv4",
+ "IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (3 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_PARSE,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {NULL, NULL, {0}, 0, 0}};
/* nlri_parse indicates 0 on successful parse, and -1 otherwise.
* attr_parse indicates BGP_ATTR_PARSE_PROCEED/0 on success,
* and BGP_ATTR_PARSE_ERROR/-1 or lower negative ret on err.
*/
-static void
-handle_result (struct peer *peer, struct test_segment *t,
- int parse_ret, int nlri_ret)
+static void handle_result(struct peer *peer, struct test_segment *t,
+ int parse_ret, int nlri_ret)
{
- int oldfailed = failed;
-
- printf ("mp attr parsed?: %s\n", parse_ret ? "no" : "yes");
- if (!parse_ret)
- printf ("nrli parsed?: %s\n", nlri_ret ? "no" : "yes");
- printf ("should parse?: %s\n", t->parses ? "no" : "yes");
-
- if ((parse_ret != 0 || nlri_ret != 0) != (t->parses != 0))
- 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");
+ int oldfailed = failed;
+
+ printf("mp attr parsed?: %s\n", parse_ret ? "no" : "yes");
+ if (!parse_ret)
+ printf("nrli parsed?: %s\n", nlri_ret ? "no" : "yes");
+ printf("should parse?: %s\n", t->parses ? "no" : "yes");
+
+ if ((parse_ret != 0 || nlri_ret != 0) != (t->parses != 0))
+ 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");
}
/* basic parsing test */
-static void
-parse_test (struct peer *peer, struct test_segment *t, int type)
+static void parse_test(struct peer *peer, struct test_segment *t, int type)
{
- int parse_ret = 0, nlri_ret = 0;
- struct attr attr = { };
- struct bgp_nlri nlri = { };
- struct bgp_attr_parser_args attr_args = {
- .peer = peer,
- .length = t->len,
- .total = 1,
- .attr = &attr,
- .type = type,
- .flags = BGP_ATTR_FLAG_OPTIONAL,
- .startp = BGP_INPUT_PNT (peer),
- };
+ int parse_ret = 0, nlri_ret = 0;
+ struct attr attr = {};
+ struct bgp_nlri nlri = {};
+ struct bgp_attr_parser_args attr_args = {
+ .peer = peer,
+ .length = t->len,
+ .total = 1,
+ .attr = &attr,
+ .type = type,
+ .flags = BGP_ATTR_FLAG_OPTIONAL,
+ .startp = BGP_INPUT_PNT(peer),
+ };
#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)
- parse_ret = bgp_mp_reach_parse (&attr_args, &nlri);
- else
- parse_ret = bgp_mp_unreach_parse (&attr_args, &nlri);
- if (!parse_ret)
- {
- iana_afi_t pkt_afi;
- safi_t pkt_safi;
-
- /* Convert AFI, SAFI to internal values, check. */
- if (bgp_map_afi_safi_int2iana (nlri.afi, nlri.safi, &pkt_afi, &pkt_safi))
- assert (0);
-
- printf ("MP: %u(%u)/%u(%u): recv %u, nego %u\n",
- nlri.afi , pkt_afi, nlri.safi, pkt_safi,
- peer->afc_recv[nlri.afi][nlri.safi],
- peer->afc_nego[nlri.afi][nlri.safi]);
- }
-
- if (!parse_ret)
- {
- if (type == BGP_ATTR_MP_REACH_NLRI)
- nlri_ret = bgp_nlri_parse (peer, &attr, &nlri, 0);
- else
- nlri_ret = bgp_nlri_parse (peer, &attr, &nlri, 1);
- }
- handle_result (peer, t, parse_ret, nlri_ret);
+ 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)
+ parse_ret = bgp_mp_reach_parse(&attr_args, &nlri);
+ else
+ parse_ret = bgp_mp_unreach_parse(&attr_args, &nlri);
+ if (!parse_ret) {
+ iana_afi_t pkt_afi;
+ safi_t pkt_safi;
+
+ /* Convert AFI, SAFI to internal values, check. */
+ if (bgp_map_afi_safi_int2iana(nlri.afi, nlri.safi, &pkt_afi,
+ &pkt_safi))
+ assert(0);
+
+ printf("MP: %u(%u)/%u(%u): recv %u, nego %u\n", nlri.afi,
+ pkt_afi, nlri.safi, pkt_safi,
+ peer->afc_recv[nlri.afi][nlri.safi],
+ peer->afc_nego[nlri.afi][nlri.safi]);
+ }
+
+ if (!parse_ret) {
+ if (type == BGP_ATTR_MP_REACH_NLRI)
+ nlri_ret = bgp_nlri_parse(peer, &attr, &nlri, 0);
+ else
+ nlri_ret = bgp_nlri_parse(peer, &attr, &nlri, 1);
+ }
+ handle_result(peer, t, parse_ret, nlri_ret);
}
static struct bgp *bgp;
static as_t asn = 100;
-int
-main (void)
+int main(void)
{
- struct peer *peer;
- int i, j;
-
- conf_bgp_debug_neighbor_events = -1UL;
- conf_bgp_debug_packet = -1UL;
- conf_bgp_debug_as4 = -1UL;
- term_bgp_debug_neighbor_events = -1UL;
- term_bgp_debug_packet = -1UL;
- term_bgp_debug_as4 = -1UL;
-
- qobj_init ();
- master = thread_master_create(NULL);
- bgp_master_init (master);
- vrf_init (NULL, NULL, NULL, NULL);
- bgp_option_set (BGP_OPT_NO_LISTEN);
- bgp_attr_init ();
-
- if (fileno (stdout) >= 0)
- tty = isatty (fileno (stdout));
-
- if (bgp_get (&bgp, &asn, NULL, BGP_INSTANCE_TYPE_DEFAULT))
- return -1;
-
- peer = peer_create_accept (bgp);
- peer->host = (char *)"foo";
- peer->status = Established;
-
- 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;
+ struct peer *peer;
+ int i, j;
+
+ conf_bgp_debug_neighbor_events = -1UL;
+ conf_bgp_debug_packet = -1UL;
+ conf_bgp_debug_as4 = -1UL;
+ term_bgp_debug_neighbor_events = -1UL;
+ term_bgp_debug_packet = -1UL;
+ term_bgp_debug_as4 = -1UL;
+
+ qobj_init();
+ master = thread_master_create(NULL);
+ bgp_master_init(master);
+ vrf_init(NULL, NULL, NULL, NULL);
+ bgp_option_set(BGP_OPT_NO_LISTEN);
+ bgp_attr_init();
+
+ if (fileno(stdout) >= 0)
+ tty = isatty(fileno(stdout));
+
+ if (bgp_get(&bgp, &asn, NULL, BGP_INSTANCE_TYPE_DEFAULT))
+ return -1;
+
+ peer = peer_create_accept(bgp);
+ peer->host = (char *)"foo";
+ peer->status = Established;
+
+ 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;
}