diff options
Diffstat (limited to 'zebra')
| -rw-r--r-- | zebra/rt_netlink.c | 23 | ||||
| -rw-r--r-- | zebra/zebra_rib.c | 20 | 
2 files changed, 38 insertions, 5 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 94573aa5..4f4ebb7a 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -245,11 +245,26 @@ netlink_parse_info (int (*filter) (struct sockaddr_nl *, struct nlmsghdr *),  			nl->name);  		  return -1;  		} -	      zlog (NULL, LOG_ERR, "%s error: %s, type=%s(%u), seq=%u, pid=%d", -		    nl->name, strerror (-err->error), -		    lookup (nlmsg_str, err->msg.nlmsg_type), -		    err->msg.nlmsg_type, err->msg.nlmsg_seq, +	       +	      /* Deal with Error Noise  - MAG*/ +	      { +		int loglvl = LOG_ERR; +		int errnum = err->error; +		int msg_type = err->msg.nlmsg_type; +		 +		if (nl == &netlink_cmd  +		    && (-errnum == ENODEV || -errnum == ESRCH) +		    && (msg_type == RTM_NEWROUTE  +			|| msg_type == RTM_DELROUTE))  +		    loglvl = LOG_DEBUG; + +		zlog (NULL, loglvl, "%s error: %s, type=%s(%u), " +		      "seq=%u, pid=%d", +		      nl->name, strerror (-errnum), +		      lookup (nlmsg_str, msg_type), +		      msg_type, err->msg.nlmsg_seq,  		    err->msg.nlmsg_pid); +	      }  	      /*  	      ret = -1;  	      continue; diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index ec07e2e3..0f7ccebc 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -855,11 +855,13 @@ rib_process (struct route_node *rn, struct rib *del)    struct rib *next;    struct rib *fib = NULL;    struct rib *select = NULL; +  int installed = 0; +  struct nexthop *nexthop = NULL;    for (rib = rn->info; rib; rib = next)      {        next = rib->next; - +              /* Currently installed rib. */        if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))  	fib = rib; @@ -898,6 +900,22 @@ rib_process (struct route_node *rn, struct rib *del)  	    rib_install_kernel (rn, select);  	  redistribute_add (&rn->p, select);  	} +      else if (! RIB_SYSTEM_ROUTE (select)) +	{ +	  /* Housekeeping code to deal with  +	     race conditions in kernel with linux +	     netlink reporting interface up before IPv4 or IPv6 protocol +	     is ready to add routes. +	     This makes sure the routes are IN the kernel. +	  */ + +	  for (nexthop = select->nexthop; nexthop; nexthop = nexthop->next) +	    { +	      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)) +		installed = 1; +	    } +	    if (! installed) rib_install_kernel (rn, select); +	}        return;      }  | 
