aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Niro <blowfist@xroutine.net>2020-04-22 23:36:11 -0400
committerDenys Vlasenko <vda.linux@googlemail.com>2021-10-07 23:24:56 +0200
commitc28313bb176639e1e4b11a63f6452baebf69f28e (patch)
tree879f9b48bc923818c23f20171cd5fcc7aff307e5
parenteb048a450cc7a0d92ac435a59d56f378b9f82667 (diff)
downloadbusybox-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.c2
-rw-r--r--networking/libiproute/iplink.c35
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 */
156static 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 */
156static int get_address(char *dev, int *htype) 180static 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;