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>
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;
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
*/
struct ethtool_cmd ecmd;
int sd;
int rc;
- int ret, saved_errno;
const char *ifname = interface->name;
/* initialize struct */
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) {