Matthew Grant <grantma@anathoth.gen.nz>
Subject: [zebra 17290] [PATCHES] - Fixes for problems in 0.93b

Added ifupstaticfix
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 94573aa..4f4ebb7 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -245,11 +245,26 @@
 			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 ec07e2e..0f7cceb 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -855,11 +855,13 @@
   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_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;
     }