]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: Fix check for martian next hops
authorvivek <vivek@cumulusnetworks.com>
Mon, 15 May 2017 20:48:18 +0000 (13:48 -0700)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 12 Jul 2017 16:34:33 +0000 (12:34 -0400)
Ensure that the check for martian next hop is correct, including for MP
nexthops, if IPv4.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
bgpd/bgp_nexthop.c
bgpd/bgp_nexthop.h
bgpd/bgp_route.c

index d0c4d2c945b0c28ae96d6a25f5923bdd59e5e889..ed3594e7a0b36f4a5b35163320478a2c379a5e18 100644 (file)
@@ -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)
index c5d9232e339279abb9b6606e7f1617bb4344f3fc..3aa20a9d5b75a0330b7bec20e6c127c3da98ce62 100644 (file)
@@ -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);
index 12ad65883ea2d8e36d8c97a075300875d577f828..d72da431f1705d3b2af4ab06996f3196df0c7ac7 100644 (file)
@@ -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: