[zebra:linux] netlink: quiet harmless errors

2008-06-17 Stephen Hemminger <stephen.hemminger@vyatta.com>

	* rt_netlink.c: (netlink_parse_info) There can be harmless races
	  such as adding an existing route, or deleting an already deleted
	  route. Don't bother logging these unless debugging is turned on.

Signed-off-by: Paul Jakma <paul@quagga.net>
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index a0dad99..904367e 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -331,6 +331,8 @@
           if (h->nlmsg_type == NLMSG_ERROR)
             {
               struct nlmsgerr *err = (struct nlmsgerr *) NLMSG_DATA (h);
+	      int errnum = err->error;
+	      int msg_type = err->msg.nlmsg_type;
 
               /* If the error field is zero, then this is an ACK */
               if (err->error == 0)
@@ -359,27 +361,24 @@
                   return -1;
                 }
 
-              /* Deal with Error Noise  - MAG */
-              {
-                int loglvl = LOG_ERR;
-                int errnum = err->error;
-                int msg_type = err->msg.nlmsg_type;
+              /* Deal with errors that occur because of races in link handling */
+	      if (nl == &netlink_cmd
+		  && ((msg_type == RTM_DELROUTE &&
+		       (-errnum == ENODEV || -errnum == ESRCH))
+		      || (msg_type == RTM_NEWROUTE && -errnum == EEXIST)))
+		{
+		  if (IS_ZEBRA_DEBUG_KERNEL)
+		    zlog_debug ("%s: error: %s type=%s(%u), seq=%u, pid=%u",
+				nl->name, safe_strerror (-errnum),
+				lookup (nlmsg_str, msg_type),
+				msg_type, err->msg.nlmsg_seq, err->msg.nlmsg_pid);
+		  return 0;
+		}
 
-                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=%u",
-                      nl->name, safe_strerror (-errnum),
-                      lookup (nlmsg_str, msg_type),
-                      msg_type, err->msg.nlmsg_seq, err->msg.nlmsg_pid);
-              }
-              /*
-                 ret = -1;
-                 continue;
-               */
+	      zlog_err ("%s error: %s, type=%s(%u), seq=%u, pid=%u",
+			nl->name, safe_strerror (-errnum),
+			lookup (nlmsg_str, msg_type),
+			msg_type, err->msg.nlmsg_seq, err->msg.nlmsg_pid);
               return -1;
             }