diff options
author | Nicholas Niro <blowfist@xroutine.net> | 2020-04-22 23:36:11 -0400 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-10-07 23:24:56 +0200 |
commit | c28313bb176639e1e4b11a63f6452baebf69f28e (patch) | |
tree | 879f9b48bc923818c23f20171cd5fcc7aff307e5 | |
parent | eb048a450cc7a0d92ac435a59d56f378b9f82667 (diff) | |
download | busybox-w32-c28313bb176639e1e4b11a63f6452baebf69f28e.tar.gz busybox-w32-c28313bb176639e1e4b11a63f6452baebf69f28e.tar.bz2 busybox-w32-c28313bb176639e1e4b11a63f6452baebf69f28e.zip |
ip: added support for setting netns on devices
function old new delta
set_netns - 130 +130
do_iplink 1252 1315 +63
.rodata 104173 104179 +6
packed_usage 34020 33993 -27
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/1 up/down: 199/-27) Total: 172 bytes
Signed-off-by: Nicholas Niro <blowfist@xroutine.net>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/ip.c | 2 | ||||
-rw-r--r-- | networking/libiproute/iplink.c | 35 |
2 files changed, 34 insertions, 3 deletions
diff --git a/networking/ip.c b/networking/ip.c index 85b1ba080..7c3208699 100644 --- a/networking/ip.c +++ b/networking/ip.c | |||
@@ -152,7 +152,7 @@ | |||
152 | //usage:#define iplink_trivial_usage | 152 | //usage:#define iplink_trivial_usage |
153 | //usage: /*Usage:iplink*/"set IFACE [up|down] [arp on|off] [multicast on|off]\n" | 153 | //usage: /*Usage:iplink*/"set IFACE [up|down] [arp on|off] [multicast on|off]\n" |
154 | //usage: " [promisc on|off] [mtu NUM] [name NAME] [qlen NUM] [address MAC]\n" | 154 | //usage: " [promisc on|off] [mtu NUM] [name NAME] [qlen NUM] [address MAC]\n" |
155 | //usage: " [master IFACE | nomaster]" | 155 | //usage: " [master IFACE | nomaster] [netns PID]" |
156 | // * short help shows only "set" command, long help continues (with just one "\n") | 156 | // * short help shows only "set" command, long help continues (with just one "\n") |
157 | // * and shows all other commands: | 157 | // * and shows all other commands: |
158 | //usage:#define iplink_full_usage "\n" | 158 | //usage:#define iplink_full_usage "\n" |
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c index 1a1064bdc..68d199044 100644 --- a/networking/libiproute/iplink.c +++ b/networking/libiproute/iplink.c | |||
@@ -153,6 +153,30 @@ static void set_master(char *dev, int master) | |||
153 | } | 153 | } |
154 | 154 | ||
155 | /* Exits on error */ | 155 | /* Exits on error */ |
156 | static void set_netns(char *dev, int netns) | ||
157 | { | ||
158 | struct rtnl_handle rth; | ||
159 | struct { | ||
160 | struct nlmsghdr n; | ||
161 | struct ifinfomsg i; | ||
162 | char buf[1024]; | ||
163 | } req; | ||
164 | |||
165 | memset(&req, 0, sizeof(req)); | ||
166 | req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); | ||
167 | req.n.nlmsg_flags = NLM_F_REQUEST; | ||
168 | req.n.nlmsg_type = RTM_NEWLINK; | ||
169 | req.i.ifi_family = preferred_family; | ||
170 | |||
171 | xrtnl_open(&rth); | ||
172 | req.i.ifi_index = xll_name_to_index(dev); | ||
173 | //printf("netns %i for %i\n", netns, req.i.ifi_index); | ||
174 | addattr_l(&req.n, sizeof(req), IFLA_NET_NS_PID, &netns, 4); | ||
175 | if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0) | ||
176 | xfunc_die(); | ||
177 | } | ||
178 | |||
179 | /* Exits on error */ | ||
156 | static int get_address(char *dev, int *htype) | 180 | static int get_address(char *dev, int *htype) |
157 | { | 181 | { |
158 | struct ifreq ifr; | 182 | struct ifreq ifr; |
@@ -226,6 +250,7 @@ static int do_set(char **argv) | |||
226 | int qlen = -1; | 250 | int qlen = -1; |
227 | int mtu = -1; | 251 | int mtu = -1; |
228 | int master = -1; | 252 | int master = -1; |
253 | int netns = -1; | ||
229 | char *newaddr = NULL; | 254 | char *newaddr = NULL; |
230 | char *newbrd = NULL; | 255 | char *newbrd = NULL; |
231 | struct ifreq ifr0, ifr1; | 256 | struct ifreq ifr0, ifr1; |
@@ -234,11 +259,11 @@ static int do_set(char **argv) | |||
234 | /* If you add stuff here, update iplink_full_usage */ | 259 | /* If you add stuff here, update iplink_full_usage */ |
235 | static const char keywords[] ALIGN1 = | 260 | static const char keywords[] ALIGN1 = |
236 | "up\0""down\0""name\0""mtu\0""qlen\0""multicast\0" | 261 | "up\0""down\0""name\0""mtu\0""qlen\0""multicast\0" |
237 | "arp\0""promisc\0""address\0" | 262 | "arp\0""promisc\0""address\0""netns\0" |
238 | "master\0""nomaster\0" | 263 | "master\0""nomaster\0" |
239 | "dev\0" /* must be last */; | 264 | "dev\0" /* must be last */; |
240 | enum { ARG_up = 0, ARG_down, ARG_name, ARG_mtu, ARG_qlen, ARG_multicast, | 265 | enum { ARG_up = 0, ARG_down, ARG_name, ARG_mtu, ARG_qlen, ARG_multicast, |
241 | ARG_arp, ARG_promisc, ARG_addr, | 266 | ARG_arp, ARG_promisc, ARG_addr, ARG_netns, |
242 | ARG_master, ARG_nomaster, | 267 | ARG_master, ARG_nomaster, |
243 | ARG_dev }; | 268 | ARG_dev }; |
244 | enum { PARM_on = 0, PARM_off }; | 269 | enum { PARM_on = 0, PARM_off }; |
@@ -276,6 +301,9 @@ static int do_set(char **argv) | |||
276 | master = xll_name_to_index(*argv); | 301 | master = xll_name_to_index(*argv); |
277 | } else if (key == ARG_nomaster) { | 302 | } else if (key == ARG_nomaster) { |
278 | master = 0; | 303 | master = 0; |
304 | } else if (key == ARG_netns) { | ||
305 | NEXT_ARG(); | ||
306 | netns = get_unsigned(*argv, "netns"); | ||
279 | } else if (key >= ARG_dev) { | 307 | } else if (key >= ARG_dev) { |
280 | /* ^^^^^^ ">=" here results in "dev IFACE" treated as default */ | 308 | /* ^^^^^^ ">=" here results in "dev IFACE" treated as default */ |
281 | if (key == ARG_dev) { | 309 | if (key == ARG_dev) { |
@@ -463,6 +491,9 @@ static int do_set(char **argv) | |||
463 | if (master != -1) { | 491 | if (master != -1) { |
464 | set_master(dev, master); | 492 | set_master(dev, master); |
465 | } | 493 | } |
494 | if (netns != -1) { | ||
495 | set_netns(dev, netns); | ||
496 | } | ||
466 | if (mask) | 497 | if (mask) |
467 | do_chflags(dev, flags, mask); | 498 | do_chflags(dev, flags, mask); |
468 | return 0; | 499 | return 0; |