diff options
author | Paul Jakma <paul.jakma@hpe.com> | 2016-01-27 16:37:33 +0000 |
---|---|---|
committer | Paul Jakma <paul.jakma@hpe.com> | 2016-03-08 17:53:10 +0000 |
commit | 18ab08b71e6b29e67b36df5e2261569d381b1708 (patch) | |
tree | 1160aff3b43a6e0bdf5e8b553425ad5bea12640f /bgpd/bgp_route.c | |
parent | c49a2747f6a6199dba27c0c413f4de6112fa649e (diff) | |
download | quagga-18ab08b71e6b29e67b36df5e2261569d381b1708.tar.bz2 quagga-18ab08b71e6b29e67b36df5e2261569d381b1708.tar.xz |
bgpd: Regularise BGP NLRI sanity checks a bit
* bgp_route.h: (bgp_nlri_sanity_check) The bulk of the args are equivalent
to a (struct bgp_nlri), consolidate.
* bgp_route.c: (bgp_nlri_sanity_check) Make this a frontend for all afi/safis.
Including SAFI_MPLS_LABELED_VPN.
(bgp_nlri_sanity_check_ip) Regular IP NLRI sanity check based on the
existing code, and adjusted for (struct bgp_nlri *) arg.
* bgp_attr.c: (bgp_mp_reach_parse) Adjust for passing (struct bgp_nlri *)
to bgp_nlri_sanity_check.
Get rid of special-casing to not sanity check VPN.
(bgp_mp_unreach_parse) Ditto.
* bgp_mplsvpn.c: Use the same VPN parsing code for both the sanity
check and the actual parse.
(bgp_nlri_parse_vpn) renamed to bgp_nlri_parse_vpn_body and made
internal.
(bgp_nlri_parse_vpn_body) Added (bool) argument to control whether it
is sanity checking or whether it should update routing state for each
NLRI. Send a NOTIFY and reset the session, if there's a parsing
error, as bgp_nlri_sanity_check_ip does, and as is required by the
RFC.
(bgp_nlri_parse_vpn) now a wrapper to call _body with update.
(bgp_nlri_sanity_check_vpn) wrapper to call parser without
updating.
* bgp_mplsvpn.h: (bgp_nlri_sanity_check_vpn) export for
bgp_nlri_sanity_check.
* bgp_packet.c: (bgp_update_receive) Adjust for bgp_nlri_sanity_check
argument changes.
* test/bgp_mp_attr_test.c: Extend to also test the NLRI parsing functions,
if the initial MP-attr parsing has succeeded. Fix the NLRI in the
VPN cases. Add further VPN tests.
* tests/bgpd.tests/testbgpmpattr.exp: Add the new test cases.
This commit a joint effort of:
Lou Berger <lberger@labn.net>
Donald Sharp <sharpd@cumulusnetworks.com>
Paul Jakma <paul.jakma@hpe.com> / <paul@jakma.org>
Diffstat (limited to 'bgpd/bgp_route.c')
-rw-r--r-- | bgpd/bgp_route.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 0dcae61e..c1e5e59b 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -3322,16 +3322,16 @@ bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet) return 0; } -/* NLRI encode syntax check routine. */ -int -bgp_nlri_sanity_check (struct peer *peer, int afi, safi_t safi, - u_char *pnt, bgp_size_t length) +static int +bgp_nlri_sanity_check_ip (struct peer *peer, struct bgp_nlri *nlri) { u_char *end; u_char prefixlen; int psize; - - end = pnt + length; + u_char *pnt = nlri->nlri; + afi_t afi = nlri->afi; + safi_t safi = nlri->safi; + end = pnt + nlri->length; /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for syntactic validity. If the field is syntactically incorrect, @@ -3395,6 +3395,20 @@ bgp_nlri_sanity_check (struct peer *peer, int afi, safi_t safi, return 0; } +int +bgp_nlri_sanity_check (struct peer *peer, struct bgp_nlri *nlri) +{ + switch (nlri->safi) + { + case SAFI_MPLS_LABELED_VPN: + return bgp_nlri_sanity_check_vpn (peer, nlri); + case SAFI_UNICAST: + case SAFI_MULTICAST: + return bgp_nlri_sanity_check_ip (peer, nlri); + default: return -1; + } +} + static struct bgp_static * bgp_static_new (void) { |