]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: add vrf_ioctl API
authorPhilippe Guibert <philippe.guibert@6wind.com>
Mon, 5 Feb 2018 16:00:45 +0000 (17:00 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 27 Feb 2018 10:11:24 +0000 (11:11 +0100)
That API can be used to wrap the ioctl call with various vrf instances.
This permits transparently doing the ioctl() call without taking into
consideration the vrf backend kind.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
lib/vrf.c
lib/vrf.h
zebra/if_netlink.c

index 0ca517d051fa5231b582548ff41136a12880849d..890a7adca2099fc43d560548e68457ec75bcd393 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -815,6 +815,26 @@ int vrf_getaddrinfo(const char *node, const char *service,
        return ret;
 }
 
+int vrf_ioctl(vrf_id_t vrf_id, int d, unsigned long request, char *params)
+{
+       int ret, saved_errno, rc;
+
+       ret = vrf_switch_to_netns(vrf_id);
+       if (ret < 0) {
+               zlog_err("%s: Can't switch to VRF %u (%s)",
+                        __func__, vrf_id, safe_strerror(errno));
+               return 0;
+       }
+       rc = ioctl(d, request, params);
+       saved_errno = errno;
+       ret = vrf_switchback_to_initial();
+       if (ret < 0)
+               zlog_err("%s: Can't switchback from VRF %u (%s)",
+                        __func__, vrf_id, safe_strerror(errno));
+       errno = saved_errno;
+       return rc;
+}
+
 int vrf_sockunion_socket(const union sockunion *su, vrf_id_t vrf_id)
 {
        int ret, save_errno, ret2;
index 326418791ddf3b9cd4f8159a3f8117e1233c1e88..cb4159a0a3a6ff9229fe35e8a098d79ef6bfdba9 100644 (file)
--- a/lib/vrf.h
+++ b/lib/vrf.h
@@ -216,6 +216,8 @@ extern int vrf_getaddrinfo(const char *node, const char *service,
                    const struct addrinfo *hints,
                    struct addrinfo **res, vrf_id_t vrf_id);
 
+extern int vrf_ioctl(vrf_id_t vrf_id, int d, unsigned long request, char *args);
+
 /* function called by macro VRF_DEFAULT
  * to get the default VRF_ID
  */
index a02533c1fe9ab73b8fe2d5b7af36bdc743889ea5..65f1e56587dd3cf776ea5a7b64465af848ad1c2b 100644 (file)
@@ -351,7 +351,6 @@ static int get_iflink_speed(struct interface *interface)
        struct ethtool_cmd ecmd;
        int sd;
        int rc;
-       int ret, saved_errno;
        const char *ifname = interface->name;
 
        /* initialize struct */
@@ -376,17 +375,7 @@ static int get_iflink_speed(struct interface *interface)
                return 0;
        }
        /* Get the current link state for the interface */
-       ret = vrf_switch_to_netns(interface->vrf_id);
-       if (ret < 0)
-               zlog_err("%s: Can't switch to VRF %u (%s)",
-                        __func__, interface->vrf_id, safe_strerror(errno));
-       rc = ioctl(sd, SIOCETHTOOL, (char *)&ifdata);
-       saved_errno = errno;
-       ret = vrf_switchback_to_initial();
-       if (ret < 0)
-               zlog_err("%s: Can't switchback from VRF %u (%s)",
-                        __func__, interface->vrf_id, safe_strerror(errno));
-       errno = saved_errno;
+       rc = vrf_ioctl(interface->vrf_id, sd, SIOCETHTOOL, (char *)&ifdata);
        if (zserv_privs.change(ZPRIVS_LOWER))
                zlog_err("Can't lower privileges");
        if (rc < 0) {