From 58cf4b28ff00d1ebb6a64e79393f5faa11567ac3 Mon Sep 17 00:00:00 2001 From: vivek Date: Mon, 15 May 2017 13:48:18 -0700 Subject: [PATCH] bgpd: Fix check for martian next hops Ensure that the check for martian next hop is correct, including for MP nexthops, if IPv4. Signed-off-by: Vivek Venkatraman Reviewed-by: Donald Sharp --- bgpd/bgp_nexthop.c | 4 ++-- bgpd/bgp_nexthop.h | 2 +- bgpd/bgp_route.c | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c index d0c4d2c945..ed3594e7a0 100644 --- a/bgpd/bgp_nexthop.c +++ b/bgpd/bgp_nexthop.c @@ -329,11 +329,11 @@ bgp_connected_delete (struct bgp *bgp, struct connected *ifc) } int -bgp_nexthop_self (struct bgp *bgp, struct attr *attr) +bgp_nexthop_self (struct bgp *bgp, struct in_addr nh_addr) { struct bgp_addr tmp, *addr; - tmp.addr = attr->nexthop; + tmp.addr = nh_addr; addr = hash_lookup (bgp->address_hash, &tmp); if (addr) diff --git a/bgpd/bgp_nexthop.h b/bgpd/bgp_nexthop.h index c5d9232e33..3aa20a9d5b 100644 --- a/bgpd/bgp_nexthop.h +++ b/bgpd/bgp_nexthop.h @@ -74,7 +74,7 @@ extern void bgp_connected_add (struct bgp *bgp, struct connected *c); extern void bgp_connected_delete (struct bgp *bgp, struct connected *c); extern int bgp_multiaccess_check_v4 (struct in_addr, struct peer *); extern int bgp_config_write_scan_time (struct vty *); -extern int bgp_nexthop_self (struct bgp *, struct attr *); +extern int bgp_nexthop_self (struct bgp *, struct in_addr); extern struct bgp_nexthop_cache *bnc_new(void); extern void bnc_free(struct bgp_nexthop_cache *bnc); extern void bnc_nexthop_free(struct bgp_nexthop_cache *bnc); diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 12ad65883e..d72da431f1 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2442,8 +2442,8 @@ bgp_update_martian_nexthop (struct bgp *bgp, afi_t afi, safi_t safi, struct attr { if (attr->nexthop.s_addr == 0 || IPV4_CLASS_DE (ntohl (attr->nexthop.s_addr)) || - bgp_nexthop_self (bgp, attr)) - ret = 1; + bgp_nexthop_self (bgp, attr->nexthop)) + return 1; } /* If MP_NEXTHOP is present, validate it. */ @@ -2458,7 +2458,8 @@ bgp_update_martian_nexthop (struct bgp *bgp, afi_t afi, safi_t safi, struct attr case BGP_ATTR_NHLEN_IPV4: case BGP_ATTR_NHLEN_VPNV4: ret = (attre->mp_nexthop_global_in.s_addr == 0 || - IPV4_CLASS_DE (ntohl (attre->mp_nexthop_global_in.s_addr))); + IPV4_CLASS_DE (ntohl (attre->mp_nexthop_global_in.s_addr)) || + bgp_nexthop_self (bgp, attre->mp_nexthop_global_in)); break; case BGP_ATTR_NHLEN_IPV6_GLOBAL: -- 2.39.5