]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/ioctl.c
Merge pull request #296 from opensourcerouting/ldpd-sighup
[mirror_frr.git] / zebra / ioctl.c
index d536771a1147211c96e32aaa0f65a05d594e9cbf..dfd69300f9c3c85645ca860cb7424d72a7123a05 100644 (file)
@@ -29,6 +29,7 @@
 #include "log.h"
 #include "privs.h"
 
+#include "vty.h"
 #include "zebra/rib.h"
 #include "zebra/rt.h"
 #include "zebra/interface.h"
@@ -52,23 +53,23 @@ if_ioctl (u_long request, caddr_t buffer)
 {
   int sock;
   int ret;
-  int err;
+  int err = 0;
 
   if (zserv_privs.change(ZPRIVS_RAISE))
-    zlog (NULL, LOG_ERR, "Can't raise privileges");
+    zlog_err("Can't raise privileges");
   sock = socket (AF_INET, SOCK_DGRAM, 0);
   if (sock < 0)
     {
       int save_errno = errno;
       if (zserv_privs.change(ZPRIVS_LOWER))
-        zlog (NULL, LOG_ERR, "Can't lower privileges");
+        zlog_err("Can't lower privileges");
       zlog_err("Cannot create UDP socket: %s", safe_strerror(save_errno));
       exit (1);
     }
   if ((ret = ioctl (sock, request, buffer)) < 0)
     err = errno;
   if (zserv_privs.change(ZPRIVS_LOWER))
-    zlog (NULL, LOG_ERR, "Can't lower privileges");
+    zlog_err("Can't lower privileges");
   close (sock);
   
   if (ret < 0) 
@@ -79,22 +80,21 @@ if_ioctl (u_long request, caddr_t buffer)
   return 0;
 }
 
-#ifdef HAVE_IPV6
 static int
 if_ioctl_ipv6 (u_long request, caddr_t buffer)
 {
   int sock;
   int ret;
-  int err;
+  int err = 0;
 
   if (zserv_privs.change(ZPRIVS_RAISE))
-    zlog (NULL, LOG_ERR, "Can't raise privileges");
+    zlog_err("Can't raise privileges");
   sock = socket (AF_INET6, SOCK_DGRAM, 0);
   if (sock < 0)
     {
       int save_errno = errno;
       if (zserv_privs.change(ZPRIVS_LOWER))
-        zlog (NULL, LOG_ERR, "Can't lower privileges");
+        zlog_err("Can't lower privileges");
       zlog_err("Cannot create IPv6 datagram socket: %s",
               safe_strerror(save_errno));
       exit (1);
@@ -103,7 +103,7 @@ if_ioctl_ipv6 (u_long request, caddr_t buffer)
   if ((ret = ioctl (sock, request, buffer)) < 0)
     err = errno;
   if (zserv_privs.change(ZPRIVS_LOWER))
-    zlog (NULL, LOG_ERR, "Can't lower privileges");
+    zlog_err("Can't lower privileges");
   close (sock);
   
   if (ret < 0) 
@@ -113,7 +113,6 @@ if_ioctl_ipv6 (u_long request, caddr_t buffer)
     }
   return 0;
 }
-#endif /* HAVE_IPV6 */
 
 /*
  * get interface metric
@@ -163,7 +162,7 @@ if_get_mtu (struct interface *ifp)
   zebra_interface_up_update(ifp);
 
 #else
-  zlog (NULL, LOG_INFO, "Can't lookup mtu on this system");
+  zlog_info("Can't lookup mtu on this system");
   ifp->mtu6 = ifp->mtu = -1;
 #endif
 }
@@ -196,7 +195,7 @@ if_set_prefix (struct interface *ifp, struct connected *ifc)
   struct prefix_ipv4 *p;
 
   p = (struct prefix_ipv4 *) ifc->address;
-  rib_lookup_and_pushup (p);
+  rib_lookup_and_pushup (p, ifp->vrf_id);
 
   memset (&addreq, 0, sizeof addreq);
   strncpy ((char *)&addreq.ifra_name, ifp->name, sizeof addreq.ifra_name);
@@ -362,22 +361,29 @@ if_get_flags (struct interface *ifp)
       return;
     }
 #ifdef HAVE_BSD_LINK_DETECT /* Detect BSD link-state at start-up */
-  (void) memset(&ifmr, 0, sizeof(ifmr));
-  strncpy (&ifmr.ifm_name, ifp->name, IFNAMSIZ);
-  if (if_ioctl(SIOCGIFMEDIA, (caddr_t) &ifmr) < 0)
-    {
-      zlog_err("if_ioctl(SIOCGIFMEDIA) failed: %s", safe_strerror(errno));
-      return;
-    }
-  if (ifmr.ifm_status & IFM_AVALID) /* Link state is valid */
+
+  /* Per-default, IFF_RUNNING is held high, unless link-detect says
+   * otherwise - we abuse IFF_RUNNING inside zebra as a link-state flag,
+   * following practice on Linux and Solaris kernels
+   */
+  SET_FLAG(ifreq.ifr_flags, IFF_RUNNING);
+  
+  if (CHECK_FLAG (ifp->status, ZEBRA_INTERFACE_LINKDETECTION))
     {
-      if (ifmr.ifm_status & IFM_ACTIVE)
-       SET_FLAG(ifreq.ifr_flags, IFF_RUNNING);
-      else
-       UNSET_FLAG(ifreq.ifr_flags, IFF_RUNNING);
-    }
-  else /* Force always up */
-    SET_FLAG(ifreq.ifr_flags, IFF_RUNNING);
+      (void) memset(&ifmr, 0, sizeof(ifmr));
+      strncpy (ifmr.ifm_name, ifp->name, IFNAMSIZ);
+      
+      /* Seems not all interfaces implement this ioctl */
+      if (if_ioctl(SIOCGIFMEDIA, (caddr_t) &ifmr) < 0)
+        zlog_err("if_ioctl(SIOCGIFMEDIA) failed: %s", safe_strerror(errno));
+      else if (ifmr.ifm_status & IFM_AVALID) /* Link state is valid */
+        {
+          if (ifmr.ifm_status & IFM_ACTIVE)
+            SET_FLAG(ifreq.ifr_flags, IFF_RUNNING);
+          else
+            UNSET_FLAG(ifreq.ifr_flags, IFF_RUNNING);
+        }
+  }
 #endif /* HAVE_BSD_LINK_DETECT */
 
   if_flags_update (ifp, (ifreq.ifr_flags & 0x0000ffff));
@@ -429,8 +435,6 @@ if_unset_flags (struct interface *ifp, uint64_t flags)
   return 0;
 }
 
-#ifdef HAVE_IPV6
-
 #ifdef LINUX_IPV6
 #ifndef _LINUX_IN6_H
 /* linux/include/net/ipv6.h */
@@ -586,5 +590,3 @@ if_prefix_delete_ipv6 (struct interface *ifp, struct connected *ifc)
 #endif /* HAVE_STRUCT_IN6_ALIASREQ */
 
 #endif /* LINUX_IPV6 */
-
-#endif /* HAVE_IPV6 */