]> git.puffer.fish Git - matthieu/frr.git/commitdiff
Matthew Grant <grantma@anathoth.gen.nz>
authorpaul <paul>
Wed, 22 Jan 2003 19:45:50 +0000 (19:45 +0000)
committerpaul <paul>
Wed, 22 Jan 2003 19:45:50 +0000 (19:45 +0000)
Subject: [zebra 17290] [PATCHES] - Fixes for problems in 0.93b

Added ifupstaticfix

zebra/rt_netlink.c
zebra/zebra_rib.c

index 94573aa53f2df3fa3c58cfd3ccfd0a4e723888aa..4f4ebb7a50467bc3d70b97ce42fc87c3d095fb18 100644 (file)
@@ -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;
index ec07e2e3a0b5e6f2aedb555ea716ccce22f9cb65..0f7ccebc52cf99cfd2a71babc00dda2307729f3a 100644 (file)
@@ -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;
     }