diff options
author | Nathan Skrzypczak <nathan.skrzypczak@gmail.com> | 2021-07-19 18:21:43 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2021-07-22 15:22:22 +0000 |
commit | 4cef6de5915d22508c3e79335fbbe226f47ad0f5 (patch) | |
tree | 2f002039bc89a43d37265deee740330d84bfaf56 /src/plugins | |
parent | 2cf583e3d6b7f8290e4fefec3b70968048d8dae0 (diff) |
vppinfra: add abstract socket & netns fns
* Add clib_socket_init support for abstract sockets
if name starts with an '@'
* Add clib_socket_init_netns to open socket in netns
* Add clib_netns_open
Type: feature
Change-Id: I89637ad657c702ec38ddecb5c03a1673d0dfb104
Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/linux-cp/lcp_interface.c | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/src/plugins/linux-cp/lcp_interface.c b/src/plugins/linux-cp/lcp_interface.c index 3fc91179cd1..da409619746 100644 --- a/src/plugins/linux-cp/lcp_interface.c +++ b/src/plugins/linux-cp/lcp_interface.c @@ -14,7 +14,6 @@ */ #define _GNU_SOURCE -#include <sched.h> #include <fcntl.h> #include <ctype.h> #include <sys/socket.h> @@ -26,6 +25,8 @@ #include <vnet/plugin/plugin.h> #include <vnet/plugin/plugin.h> +#include <vppinfra/linux/netns.h> + #include <vnet/ip/ip_punt_drop.h> #include <vnet/fib/fib_table.h> #include <vnet/adj/adj_mcast.h> @@ -614,17 +615,6 @@ lcp_validate_if_name (u8 *name) return 1; } -static int -lcp_itf_get_ns_fd (char *ns_name) -{ - char ns_path[256] = "/proc/self/ns/net"; - - if (ns_name) - snprintf (ns_path, sizeof (ns_path) - 1, "/var/run/netns/%s", ns_name); - - return open (ns_path, O_RDONLY); -} - static void lcp_itf_set_vif_link_state (u32 vif_index, u8 up, u8 *ns) { @@ -634,13 +624,10 @@ lcp_itf_set_vif_link_state (u32 vif_index, u8 up, u8 *ns) if (ns) { - u8 *ns_path = 0; - - curr_ns_fd = open ("/proc/self/ns/net", O_RDONLY); - ns_path = format (0, "/var/run/netns/%s%c", (char *) ns, 0); - vif_ns_fd = open ((char *) ns_path, O_RDONLY); + curr_ns_fd = clib_netns_open (NULL /* self */); + vif_ns_fd = clib_netns_open (ns); if (vif_ns_fd != -1) - setns (vif_ns_fd, CLONE_NEWNET); + clib_setns (vif_ns_fd); } vnet_netlink_set_link_state (vif_index, up); @@ -650,7 +637,7 @@ lcp_itf_set_vif_link_state (u32 vif_index, u8 up, u8 *ns) if (curr_ns_fd != -1) { - setns (curr_ns_fd, CLONE_NEWNET); + clib_setns (curr_ns_fd); close (curr_ns_fd); } } @@ -706,12 +693,12 @@ lcp_itf_pair_create (u32 phy_sw_if_index, u8 *host_if_name, if (ns && ns[0] != 0) { - orig_ns_fd = lcp_itf_get_ns_fd (NULL); - ns_fd = lcp_itf_get_ns_fd ((char *) ns); + orig_ns_fd = clib_netns_open (NULL /* self */); + ns_fd = clib_netns_open (ns); if (orig_ns_fd == -1 || ns_fd == -1) goto socket_close; - setns (ns_fd, CLONE_NEWNET); + clib_setns (ns_fd); } vif_index = if_nametoindex ((const char *) host_if_name); @@ -745,7 +732,7 @@ lcp_itf_pair_create (u32 phy_sw_if_index, u8 *host_if_name, socket_close: if (orig_ns_fd != -1) { - setns (orig_ns_fd, CLONE_NEWNET); + clib_setns (orig_ns_fd); close (orig_ns_fd); } if (ns_fd != -1) |