]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/if_ioctl.c
Doc: Update manual sample build instruction with symlink for vtysh and reference...
[mirror_frr.git] / zebra / if_ioctl.c
index 6396911e1b9c8d2db48ad27e2c36e35004c6fa7a..df79d285a3609e3807523928be4dc83978b13290 100644 (file)
 #include "log.h"
 #include "vrf.h"
 #include "vty.h"
+#include "lib_errors.h"
 
 #include "zebra/interface.h"
 #include "zebra/rib.h"
+#include "zebra/rt.h"
+#include "zebra/zebra_errors.h"
 
 #include <ifaddrs.h>
 
@@ -55,8 +58,9 @@ static int interface_list_ioctl(void)
        /* Normally SIOCGIFCONF works with AF_INET socket. */
        sock = socket(AF_INET, SOCK_DGRAM, 0);
        if (sock < 0) {
-               zlog_warn("Can't make AF_INET socket stream: %s",
-                         safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET,
+                            "Can't make AF_INET socket stream: %s",
+                            safe_strerror(errno));
                return -1;
        }
 
@@ -84,7 +88,8 @@ static int interface_list_ioctl(void)
                ret = ioctl(sock, SIOCGIFCONF, &ifconf);
 
                if (ret < 0) {
-                       zlog_warn("SIOCGIFCONF: %s", safe_strerror(errno));
+                       flog_err_sys(EC_LIB_SYSTEM_CALL, "SIOCGIFCONF: %s",
+                                    safe_strerror(errno));
                        goto end;
                }
                /* Repeatedly get info til buffer fails to grow. */
@@ -105,10 +110,7 @@ static int interface_list_ioctl(void)
                unsigned int size;
 
                ifreq = (struct ifreq *)((caddr_t)ifconf.ifc_req + n);
-               ifp = if_get_by_name_len(
-                       ifreq->ifr_name,
-                       strnlen(ifreq->ifr_name, sizeof(ifreq->ifr_name)),
-                       VRF_DEFAULT, 0);
+               ifp = if_get_by_name(ifreq->ifr_name, VRF_DEFAULT);
                if_add_update(ifp);
                size = ifreq->ifr_addr.sa_len;
                if (size < sizeof(ifreq->ifr_addr))
@@ -118,10 +120,7 @@ static int interface_list_ioctl(void)
        }
 #else
        for (n = 0; n < ifconf.ifc_len; n += sizeof(struct ifreq)) {
-               ifp = if_get_by_name_len(
-                       ifreq->ifr_name,
-                       strnlen(ifreq->ifr_name, sizeof(ifreq->ifr_name)),
-                       VRF_DEFAULT, 0);
+               ifp = if_get_by_name(ifreq->ifr_name, VRF_DEFAULT);
                if_add_update(ifp);
                ifreq++;
        }
@@ -137,7 +136,7 @@ end:
 /* Get interface's index by ioctl. */
 static int if_get_index(struct interface *ifp)
 {
-       ifp->ifindex = if_nametoindex(ifp->name);
+       if_set_index(ifp, if_nametoindex(ifp->name));
        return ifp->ifindex;
 }
 
@@ -152,7 +151,7 @@ static int if_get_hwaddr(struct interface *ifp)
        ifreq.ifr_addr.sa_family = AF_INET;
 
        /* Fetch Hardware address if available. */
-       ret = if_ioctl(SIOCGIFHWADDR, (caddr_t)&ifreq);
+       ret = vrf_if_ioctl(SIOCGIFHWADDR, (caddr_t)&ifreq, ifp->vrf_id);
        if (ret < 0)
                ifp->hw_addr_len = 0;
        else {
@@ -181,13 +180,15 @@ static int if_getaddrs(void)
 
        ret = getifaddrs(&ifap);
        if (ret != 0) {
-               zlog_err("getifaddrs(): %s", safe_strerror(errno));
+               flog_err_sys(EC_LIB_SYSTEM_CALL, "getifaddrs(): %s",
+                            safe_strerror(errno));
                return -1;
        }
 
        for (ifapfree = ifap; ifap; ifap = ifap->ifa_next) {
                if (ifap->ifa_addr == NULL) {
-                       zlog_err(
+                       flog_err(
+                               EC_LIB_INTERFACE,
                                "%s: nonsensical ifaddr with NULL ifa_addr, ifname %s",
                                __func__,
                                (ifap->ifa_name ? ifap->ifa_name : "(null)"));
@@ -196,7 +197,8 @@ static int if_getaddrs(void)
 
                ifp = if_lookup_by_name(ifap->ifa_name, VRF_DEFAULT);
                if (ifp == NULL) {
-                       zlog_err("if_getaddrs(): Can't lookup interface %s\n",
+                       flog_err(EC_LIB_INTERFACE,
+                                "if_getaddrs(): Can't lookup interface %s\n",
                                 ifap->ifa_name);
                        continue;
                }
@@ -248,14 +250,14 @@ static int if_getaddrs(void)
 #if defined(KAME)
                        if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6_addr)) {
                                addr->sin6_scope_id =
-                                       ntohs(*(u_int16_t *)&addr->sin6_addr
+                                       ntohs(*(uint16_t *)&addr->sin6_addr
                                                       .s6_addr[2]);
                                addr->sin6_addr.s6_addr[2] =
                                        addr->sin6_addr.s6_addr[3] = 0;
                        }
 #endif
 
-                       connected_add_ipv6(ifp, flags, &addr->sin6_addr,
+                       connected_add_ipv6(ifp, flags, &addr->sin6_addr, NULL,
                                           prefixlen, NULL);
                }
        }
@@ -268,10 +270,10 @@ static int if_getaddrs(void)
 /* Fetch interface information via ioctl(). */
 static void interface_info_ioctl()
 {
-       struct listnode *node, *nnode;
+       struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
        struct interface *ifp;
 
-       for (ALL_LIST_ELEMENTS(vrf_iflist(VRF_DEFAULT), node, nnode, ifp)) {
+       FOR_ALL_INTERFACES (vrf, ifp) {
                if_get_index(ifp);
 #ifdef SIOCGIFHWADDR
                if_get_hwaddr(ifp);