diff options
Diffstat (limited to 'zebra')
| -rw-r--r-- | zebra/rt_netlink.c | 20 | ||||
| -rw-r--r-- | zebra/zebra_rib.c | 21 | 
2 files changed, 41 insertions, 0 deletions
| diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 6a3df192..b38df20b 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1323,13 +1323,24 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,      {        for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)  	{ +  	  if ((cmd == RTM_NEWROUTE   	       && CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))  	      || (cmd == RTM_DELROUTE  		  && CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)))  	    { +  	      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))  		{ +		  if (IS_ZEBRA_DEBUG_KERNEL) { +			zlog_info ("netlink_route_multipath(): %s %s/%d via %s if %u", +		          lookup (nlmsg_str, cmd), +		          inet_ntoa (p->u.prefix4), +		          p->prefixlen,  +		          inet_ntoa (nexthop->rgate.ipv4), +		          nexthop->rifindex); +		  } +  		  if (nexthop->rtype == NEXTHOP_TYPE_IPV4   		      || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)  		    addattr_l (&req.n, sizeof req, RTA_GATEWAY, @@ -1351,6 +1362,15 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,  		}  	      else  		{ +		  if (IS_ZEBRA_DEBUG_KERNEL) { +            zlog_info ("netlink_route_multipath(): %s %s/%d via %s if %u", +		                lookup (nlmsg_str, cmd), +		                inet_ntoa (p->u.prefix4), +		                p->prefixlen, +		                inet_ntoa (nexthop->gate.ipv4),  +		                nexthop->ifindex); +		  } +  		  if (nexthop->type == NEXTHOP_TYPE_IPV4   		      || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)  		    addattr_l (&req.n, sizeof req, RTA_GATEWAY, diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 2209364c..09d2da5b 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -1146,6 +1146,13 @@ rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,    /* Apply mask. */    apply_mask_ipv4 (p); +  if (IS_ZEBRA_DEBUG_KERNEL && gate) +    zlog_info ("rib_delete_ipv4(): route delete %s/%d via %s ifindex %d", +		       inet_ntop (AF_INET, &p->prefix, buf1, BUFSIZ), +		       p->prefixlen,  +		       inet_ntoa (*gate),  +		       ifindex); +    /* Lookup route node. */    rn = route_node_lookup (table, (struct prefix *) p);    if (! rn) @@ -1192,6 +1199,20 @@ rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,  	      break;  	    }  	} +      else if (gate)  +        { +          nexthop = rib->nexthop; + +	  /* Make sure that the route found has the same gateway. */ +	  if (rib->type == type +	      && nexthop && +	          (IPV4_ADDR_SAME (&nexthop->gate.ipv4, gate) ||  +		    IPV4_ADDR_SAME (&nexthop->rgate.ipv4, gate)) ) +	    { +	      same = rib; +	      break; +	    } +	}        else  	{  	  if (rib->type == type) | 
