diff options
Diffstat (limited to 'tests/bgpd/test_mp_attr.c')
-rw-r--r-- | tests/bgpd/test_mp_attr.c | 1758 |
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; } |