* [PATCH iproute2 0/4] Switch network ns w/o execvp for iproute2 tools
@ 2014-12-13 17:55 Vadim Kochan
2014-12-13 17:55 ` [PATCH iproute2 1/4] lib: Add netns_switch func for change network namespace Vadim Kochan
` (3 more replies)
0 siblings, 4 replies; 12+ messages in thread
From: Vadim Kochan @ 2014-12-13 17:55 UTC (permalink / raw)
To: netdev; +Cc: Vadim Kochan
This series adds new -n[etns] option to ip, tc & bridge tools which
allows to easy and faster switch to specified network namespace. So instead of:
ip netns exec NETNS { ip | tc | bridge } OBJECT COMMAND
it will be possible do the same by:
{ ip | tc | bridge } -n[etns] NETNS OBJECT COMMAND
I skipped misc tools and will work on them later.
Vadim Kochan (4):
lib: Add netns_switch func for change network namespace
ip: Allow to easy change network namespace
bridge: Allow to easy change network namespace
tc: Allow to easy change network namespace
bridge/Makefile | 4 ++
bridge/bridge.c | 7 +++-
include/namespace.h | 46 +++++++++++++++++++++++
ip/ip.c | 7 +++-
ip/ipnetns.c | 106 ++--------------------------------------------------
lib/Makefile | 6 ++-
lib/namespace.c | 86 ++++++++++++++++++++++++++++++++++++++++++
man/man8/bridge.8 | 23 +++++++++++-
man/man8/ip.8 | 23 +++++++++++-
man/man8/tc.8 | 65 ++++++++++++++++++++++++--------
tc/Makefile | 5 +++
tc/tc.c | 8 +++-
12 files changed, 262 insertions(+), 124 deletions(-)
create mode 100644 include/namespace.h
create mode 100644 lib/namespace.c
--
2.1.3
^ permalink raw reply [flat|nested] 12+ messages in thread* [PATCH iproute2 1/4] lib: Add netns_switch func for change network namespace 2014-12-13 17:55 [PATCH iproute2 0/4] Switch network ns w/o execvp for iproute2 tools Vadim Kochan @ 2014-12-13 17:55 ` Vadim Kochan 2014-12-14 9:35 ` Jiri Pirko 2014-12-13 17:55 ` [PATCH iproute2 2/4] ip: Allow to easy " Vadim Kochan ` (2 subsequent siblings) 3 siblings, 1 reply; 12+ messages in thread From: Vadim Kochan @ 2014-12-13 17:55 UTC (permalink / raw) To: netdev; +Cc: Vadim Kochan From: Vadim Kochan <vadim4j@gmail.com> New netns_switch func moved to the lib/namespace.c from ip/ipnetns.c so it can be used from the other tools for fast switching network namespace. Signed-off-by: Vadim Kochan <vadim4j@gmail.com> --- include/namespace.h | 46 +++++++++++++++++++++++ ip/ipnetns.c | 106 ++-------------------------------------------------- lib/Makefile | 6 ++- lib/namespace.c | 86 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 140 insertions(+), 104 deletions(-) create mode 100644 include/namespace.h create mode 100644 lib/namespace.c diff --git a/include/namespace.h b/include/namespace.h new file mode 100644 index 0000000..2f13e65 --- /dev/null +++ b/include/namespace.h @@ -0,0 +1,46 @@ +#ifndef __NAMESPACE_H__ +#define __NAMESPACE_H__ 1 + +#include <sched.h> +#include <sys/mount.h> +#include <errno.h> + +#define NETNS_RUN_DIR "/var/run/netns" +#define NETNS_ETC_DIR "/etc/netns" + +#ifndef CLONE_NEWNET +#define CLONE_NEWNET 0x40000000 /* New network namespace (lo, device, names sockets, etc) */ +#endif + +#ifndef MNT_DETACH +#define MNT_DETACH 0x00000002 /* Just detach from the tree */ +#endif /* MNT_DETACH */ + +/* sys/mount.h may be out too old to have these */ +#ifndef MS_REC +#define MS_REC 16384 +#endif + +#ifndef MS_SLAVE +#define MS_SLAVE (1 << 19) +#endif + +#ifndef MS_SHARED +#define MS_SHARED (1 << 20) +#endif + +#ifndef HAVE_SETNS +static int setns(int fd, int nstype) +{ +#ifdef __NR_setns + return syscall(__NR_setns, fd, nstype); +#else + errno = ENOSYS; + return -1; +#endif +} +#endif /* HAVE_SETNS */ + +extern int netns_switch(char *netns); + +#endif /* __NAMESPACE_H__ */ diff --git a/ip/ipnetns.c b/ip/ipnetns.c index 1c8aa02..519d518 100644 --- a/ip/ipnetns.c +++ b/ip/ipnetns.c @@ -17,42 +17,7 @@ #include "utils.h" #include "ip_common.h" - -#define NETNS_RUN_DIR "/var/run/netns" -#define NETNS_ETC_DIR "/etc/netns" - -#ifndef CLONE_NEWNET -#define CLONE_NEWNET 0x40000000 /* New network namespace (lo, device, names sockets, etc) */ -#endif - -#ifndef MNT_DETACH -#define MNT_DETACH 0x00000002 /* Just detach from the tree */ -#endif /* MNT_DETACH */ - -/* sys/mount.h may be out too old to have these */ -#ifndef MS_REC -#define MS_REC 16384 -#endif - -#ifndef MS_SLAVE -#define MS_SLAVE (1 << 19) -#endif - -#ifndef MS_SHARED -#define MS_SHARED (1 << 20) -#endif - -#ifndef HAVE_SETNS -static int setns(int fd, int nstype) -{ -#ifdef __NR_setns - return syscall(__NR_setns, fd, nstype); -#else - errno = ENOSYS; - return -1; -#endif -} -#endif /* HAVE_SETNS */ +#include "namespace.h" static int usage(void) { @@ -101,42 +66,12 @@ static int netns_list(int argc, char **argv) return 0; } -static void bind_etc(const char *name) -{ - char etc_netns_path[MAXPATHLEN]; - char netns_name[MAXPATHLEN]; - char etc_name[MAXPATHLEN]; - struct dirent *entry; - DIR *dir; - - snprintf(etc_netns_path, sizeof(etc_netns_path), "%s/%s", NETNS_ETC_DIR, name); - dir = opendir(etc_netns_path); - if (!dir) - return; - - while ((entry = readdir(dir)) != NULL) { - if (strcmp(entry->d_name, ".") == 0) - continue; - if (strcmp(entry->d_name, "..") == 0) - continue; - snprintf(netns_name, sizeof(netns_name), "%s/%s", etc_netns_path, entry->d_name); - snprintf(etc_name, sizeof(etc_name), "/etc/%s", entry->d_name); - if (mount(netns_name, etc_name, "none", MS_BIND, NULL) < 0) { - fprintf(stderr, "Bind %s -> %s failed: %s\n", - netns_name, etc_name, strerror(errno)); - } - } - closedir(dir); -} - static int netns_exec(int argc, char **argv) { /* Setup the proper environment for apps that are not netns * aware, and execute a program in that environment. */ - const char *name, *cmd; - char net_path[MAXPATHLEN]; - int netns; + const char *cmd; if (argc < 1) { fprintf(stderr, "No netns name specified\n"); @@ -146,45 +81,10 @@ static int netns_exec(int argc, char **argv) fprintf(stderr, "No command specified\n"); return -1; } - - name = argv[0]; cmd = argv[1]; - snprintf(net_path, sizeof(net_path), "%s/%s", NETNS_RUN_DIR, name); - netns = open(net_path, O_RDONLY | O_CLOEXEC); - if (netns < 0) { - fprintf(stderr, "Cannot open network namespace \"%s\": %s\n", - name, strerror(errno)); - return -1; - } - - if (setns(netns, CLONE_NEWNET) < 0) { - fprintf(stderr, "setting the network namespace \"%s\" failed: %s\n", - name, strerror(errno)); - return -1; - } - if (unshare(CLONE_NEWNS) < 0) { - fprintf(stderr, "unshare failed: %s\n", strerror(errno)); - return -1; - } - /* Don't let any mounts propagate back to the parent */ - if (mount("", "/", "none", MS_SLAVE | MS_REC, NULL)) { - fprintf(stderr, "\"mount --make-rslave /\" failed: %s\n", - strerror(errno)); + if (netns_switch(argv[0])) return -1; - } - /* Mount a version of /sys that describes the network namespace */ - if (umount2("/sys", MNT_DETACH) < 0) { - fprintf(stderr, "umount of /sys failed: %s\n", strerror(errno)); - return -1; - } - if (mount(name, "/sys", "sysfs", 0, NULL) < 0) { - fprintf(stderr, "mount of /sys failed: %s\n",strerror(errno)); - return -1; - } - - /* Setup bind mounts for config files in /etc */ - bind_etc(name); fflush(stdout); diff --git a/lib/Makefile b/lib/Makefile index a42b885..66f89f1 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,8 +1,12 @@ include ../Config +ifeq ($(IP_CONFIG_SETNS),y) + CFLAGS += -DHAVE_SETNS +endif + CFLAGS += -fPIC -UTILOBJ=utils.o rt_names.o ll_types.o ll_proto.o ll_addr.o inet_proto.o +UTILOBJ=utils.o rt_names.o ll_types.o ll_proto.o ll_addr.o inet_proto.o namespace.o NLOBJ=libgenl.o ll_map.o libnetlink.o diff --git a/lib/namespace.c b/lib/namespace.c new file mode 100644 index 0000000..1554ce0 --- /dev/null +++ b/lib/namespace.c @@ -0,0 +1,86 @@ +/* + * namespace.c + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include <fcntl.h> +#include <dirent.h> + +#include "utils.h" +#include "namespace.h" + +static void bind_etc(const char *name) +{ + char etc_netns_path[MAXPATHLEN]; + char netns_name[MAXPATHLEN]; + char etc_name[MAXPATHLEN]; + struct dirent *entry; + DIR *dir; + + snprintf(etc_netns_path, sizeof(etc_netns_path), "%s/%s", NETNS_ETC_DIR, name); + dir = opendir(etc_netns_path); + if (!dir) + return; + + while ((entry = readdir(dir)) != NULL) { + if (strcmp(entry->d_name, ".") == 0) + continue; + if (strcmp(entry->d_name, "..") == 0) + continue; + snprintf(netns_name, sizeof(netns_name), "%s/%s", etc_netns_path, entry->d_name); + snprintf(etc_name, sizeof(etc_name), "/etc/%s", entry->d_name); + if (mount(netns_name, etc_name, "none", MS_BIND, NULL) < 0) { + fprintf(stderr, "Bind %s -> %s failed: %s\n", + netns_name, etc_name, strerror(errno)); + } + } + closedir(dir); +} + +int netns_switch(char *name) +{ + char net_path[MAXPATHLEN]; + int netns; + + snprintf(net_path, sizeof(net_path), "%s/%s", NETNS_RUN_DIR, name); + netns = open(net_path, O_RDONLY | O_CLOEXEC); + if (netns < 0) { + fprintf(stderr, "Cannot open network namespace \"%s\": %s\n", + name, strerror(errno)); + return -1; + } + + if (setns(netns, CLONE_NEWNET) < 0) { + fprintf(stderr, "setting the network namespace \"%s\" failed: %s\n", + name, strerror(errno)); + return -1; + } + + if (unshare(CLONE_NEWNS) < 0) { + fprintf(stderr, "unshare failed: %s\n", strerror(errno)); + return -1; + } + /* Don't let any mounts propagate back to the parent */ + if (mount("", "/", "none", MS_SLAVE | MS_REC, NULL)) { + fprintf(stderr, "\"mount --make-rslave /\" failed: %s\n", + strerror(errno)); + return -1; + } + /* Mount a version of /sys that describes the network namespace */ + if (umount2("/sys", MNT_DETACH) < 0) { + fprintf(stderr, "umount of /sys failed: %s\n", strerror(errno)); + return -1; + } + if (mount(name, "/sys", "sysfs", 0, NULL) < 0) { + fprintf(stderr, "mount of /sys failed: %s\n",strerror(errno)); + return -1; + } + + /* Setup bind mounts for config files in /etc */ + bind_etc(name); + return 0; +} -- 2.1.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 1/4] lib: Add netns_switch func for change network namespace 2014-12-13 17:55 ` [PATCH iproute2 1/4] lib: Add netns_switch func for change network namespace Vadim Kochan @ 2014-12-14 9:35 ` Jiri Pirko 0 siblings, 0 replies; 12+ messages in thread From: Jiri Pirko @ 2014-12-14 9:35 UTC (permalink / raw) To: Vadim Kochan; +Cc: netdev Sat, Dec 13, 2014 at 06:55:31PM CET, vadim4j@gmail.com wrote: >From: Vadim Kochan <vadim4j@gmail.com> > >New netns_switch func moved to the lib/namespace.c from ip/ipnetns.c >so it can be used from the other tools for fast switching >network namespace. > >Signed-off-by: Vadim Kochan <vadim4j@gmail.com> Signed-off-by: Jiri Pirko <jiri@resnulli.us> ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH iproute2 2/4] ip: Allow to easy change network namespace 2014-12-13 17:55 [PATCH iproute2 0/4] Switch network ns w/o execvp for iproute2 tools Vadim Kochan 2014-12-13 17:55 ` [PATCH iproute2 1/4] lib: Add netns_switch func for change network namespace Vadim Kochan @ 2014-12-13 17:55 ` Vadim Kochan 2014-12-14 9:36 ` Jiri Pirko 2014-12-24 20:35 ` Stephen Hemminger 2014-12-13 17:55 ` [PATCH iproute2 3/4] bridge: " Vadim Kochan 2014-12-13 17:55 ` [PATCH iproute2 4/4] tc: " Vadim Kochan 3 siblings, 2 replies; 12+ messages in thread From: Vadim Kochan @ 2014-12-13 17:55 UTC (permalink / raw) To: netdev; +Cc: Vadim Kochan From: Vadim Kochan <vadim4j@gmail.com> Added new '-netns' option to simplify executing following cmd: ip netns exec NETNS ip OPTIONS COMMAND OBJECT to ip -n[etns] NETNS OPTIONS COMMAND OBJECT e.g.: ip -net vnet0 link add br0 type bridge ip -n vnet0 link Signed-off-by: Vadim Kochan <vadim4j@gmail.com> --- ip/ip.c | 7 ++++++- man/man8/ip.8 | 23 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/ip/ip.c b/ip/ip.c index 5f759d5..96e64a3 100644 --- a/ip/ip.c +++ b/ip/ip.c @@ -22,6 +22,7 @@ #include "SNAPSHOT.h" #include "utils.h" #include "ip_common.h" +#include "namespace.h" int preferred_family = AF_UNSPEC; int human_readable = 0; @@ -54,7 +55,7 @@ static void usage(void) " -4 | -6 | -I | -D | -B | -0 |\n" " -l[oops] { maximum-addr-flush-attempts } |\n" " -o[neline] | -t[imestamp] | -b[atch] [filename] |\n" -" -rc[vbuf] [size]}\n"); +" -rc[vbuf] [size] | -n[etns] name }\n"); exit(-1); } @@ -262,6 +263,10 @@ int main(int argc, char **argv) rcvbuf = size; } else if (matches(opt, "-help") == 0) { usage(); + } else if (matches(opt, "-netns") == 0) { + NEXT_ARG(); + if (netns_switch(argv[1])) + exit(-1); } else { fprintf(stderr, "Option \"%s\" is unknown, try \"ip -help\".\n", opt); exit(-1); diff --git a/man/man8/ip.8 b/man/man8/ip.8 index 2d42e98..0bae59e 100644 --- a/man/man8/ip.8 +++ b/man/man8/ip.8 @@ -31,7 +31,8 @@ ip \- show / manipulate routing, devices, policy routing and tunnels \fB\-r\fR[\fIesolve\fR] | \fB\-f\fR[\fIamily\fR] { .BR inet " | " inet6 " | " ipx " | " dnet " | " link " } | " -\fB\-o\fR[\fIneline\fR] } +\fB\-o\fR[\fIneline\fR] | +\fB\-n\fR[\fIetns\fR] name } .SH OPTIONS @@ -134,6 +135,26 @@ the output. use the system's name resolver to print DNS names instead of host addresses. +.TP +.BR "\-n" , " \-net" , " \-netns " <NETNS> +switches +.B ip +to the specified network namespace +.IR NETNS . +Actually it just simplifies executing of: + +.B ip netns exec +.IR NETNS +.B ip +.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | " +.BR help " }" + +to + +.B ip +.RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | " +.BR help " }" + .SH IP - COMMAND SYNTAX .SS -- 2.1.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 2/4] ip: Allow to easy change network namespace 2014-12-13 17:55 ` [PATCH iproute2 2/4] ip: Allow to easy " Vadim Kochan @ 2014-12-14 9:36 ` Jiri Pirko 2014-12-24 20:35 ` Stephen Hemminger 1 sibling, 0 replies; 12+ messages in thread From: Jiri Pirko @ 2014-12-14 9:36 UTC (permalink / raw) To: Vadim Kochan; +Cc: netdev Sat, Dec 13, 2014 at 06:55:32PM CET, vadim4j@gmail.com wrote: >From: Vadim Kochan <vadim4j@gmail.com> > >Added new '-netns' option to simplify executing following cmd: > > ip netns exec NETNS ip OPTIONS COMMAND OBJECT > > to > > ip -n[etns] NETNS OPTIONS COMMAND OBJECT > >e.g.: > > ip -net vnet0 link add br0 type bridge > ip -n vnet0 link > >Signed-off-by: Vadim Kochan <vadim4j@gmail.com> Signed-off-by: Jiri Pirko <jiri@resnulli.us> ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 2/4] ip: Allow to easy change network namespace 2014-12-13 17:55 ` [PATCH iproute2 2/4] ip: Allow to easy " Vadim Kochan 2014-12-14 9:36 ` Jiri Pirko @ 2014-12-24 20:35 ` Stephen Hemminger 2014-12-24 20:33 ` Vadim Kochan 2014-12-24 21:07 ` Vadim Kochan 1 sibling, 2 replies; 12+ messages in thread From: Stephen Hemminger @ 2014-12-24 20:35 UTC (permalink / raw) To: Vadim Kochan; +Cc: netdev On Sat, 13 Dec 2014 19:55:32 +0200 Vadim Kochan <vadim4j@gmail.com> wrote: > From: Vadim Kochan <vadim4j@gmail.com> > > Added new '-netns' option to simplify executing following cmd: > > ip netns exec NETNS ip OPTIONS COMMAND OBJECT > > to > > ip -n[etns] NETNS OPTIONS COMMAND OBJECT > > e.g.: > > ip -net vnet0 link add br0 type bridge > ip -n vnet0 link > > Signed-off-by: Vadim Kochan <vadim4j@gmail.com> Needs to be rebased against current upstream code. Will not apply clean any more. Please resubmit whole patch series. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 2/4] ip: Allow to easy change network namespace 2014-12-24 20:35 ` Stephen Hemminger @ 2014-12-24 20:33 ` Vadim Kochan 2014-12-24 21:07 ` Vadim Kochan 1 sibling, 0 replies; 12+ messages in thread From: Vadim Kochan @ 2014-12-24 20:33 UTC (permalink / raw) To: Stephen Hemminger; +Cc: Vadim Kochan, netdev On Wed, Dec 24, 2014 at 12:35:22PM -0800, Stephen Hemminger wrote: > On Sat, 13 Dec 2014 19:55:32 +0200 > Vadim Kochan <vadim4j@gmail.com> wrote: > > > From: Vadim Kochan <vadim4j@gmail.com> > > > > Added new '-netns' option to simplify executing following cmd: > > > > ip netns exec NETNS ip OPTIONS COMMAND OBJECT > > > > to > > > > ip -n[etns] NETNS OPTIONS COMMAND OBJECT > > > > e.g.: > > > > ip -net vnet0 link add br0 type bridge > > ip -n vnet0 link > > > > Signed-off-by: Vadim Kochan <vadim4j@gmail.com> > > Needs to be rebased against current upstream code. > Will not apply clean any more. > > Please resubmit whole patch series. And add Signed-off for Jiri as he was add it for each patch ? ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 2/4] ip: Allow to easy change network namespace 2014-12-24 20:35 ` Stephen Hemminger 2014-12-24 20:33 ` Vadim Kochan @ 2014-12-24 21:07 ` Vadim Kochan 1 sibling, 0 replies; 12+ messages in thread From: Vadim Kochan @ 2014-12-24 21:07 UTC (permalink / raw) To: Stephen Hemminger; +Cc: Vadim Kochan, netdev On Wed, Dec 24, 2014 at 12:35:22PM -0800, Stephen Hemminger wrote: > On Sat, 13 Dec 2014 19:55:32 +0200 > Vadim Kochan <vadim4j@gmail.com> wrote: > > > From: Vadim Kochan <vadim4j@gmail.com> > > > > Added new '-netns' option to simplify executing following cmd: > > > > ip netns exec NETNS ip OPTIONS COMMAND OBJECT > > > > to > > > > ip -n[etns] NETNS OPTIONS COMMAND OBJECT > > > > e.g.: > > > > ip -net vnet0 link add br0 type bridge > > ip -n vnet0 link > > > > Signed-off-by: Vadim Kochan <vadim4j@gmail.com> > > Needs to be rebased against current upstream code. > Will not apply clean any more. > > Please resubmit whole patch series. Done, fixed conflicts in ip usage func. Regards, ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH iproute2 3/4] bridge: Allow to easy change network namespace 2014-12-13 17:55 [PATCH iproute2 0/4] Switch network ns w/o execvp for iproute2 tools Vadim Kochan 2014-12-13 17:55 ` [PATCH iproute2 1/4] lib: Add netns_switch func for change network namespace Vadim Kochan 2014-12-13 17:55 ` [PATCH iproute2 2/4] ip: Allow to easy " Vadim Kochan @ 2014-12-13 17:55 ` Vadim Kochan 2014-12-14 9:36 ` Jiri Pirko 2014-12-13 17:55 ` [PATCH iproute2 4/4] tc: " Vadim Kochan 3 siblings, 1 reply; 12+ messages in thread From: Vadim Kochan @ 2014-12-13 17:55 UTC (permalink / raw) To: netdev; +Cc: Vadim Kochan From: Vadim Kochan <vadim4j@gmail.com> Added new '-netns' option to simplify executing following cmd: ip netns exec NETNS bridge OPTIONS COMMAND OBJECT to bridge -n[etns] NETNS OPTIONS COMMAND OBJECT e.g.: bridge -net vnet0 fdb Signed-off-by: Vadim Kochan <vadim4j@gmail.com> --- bridge/Makefile | 4 ++++ bridge/bridge.c | 7 ++++++- man/man8/bridge.8 | 23 ++++++++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/bridge/Makefile b/bridge/Makefile index 1fb8320..9800753 100644 --- a/bridge/Makefile +++ b/bridge/Makefile @@ -2,6 +2,10 @@ BROBJ = bridge.o fdb.o monitor.o link.o mdb.o vlan.o include ../Config +ifeq ($(IP_CONFIG_SETNS),y) + CFLAGS += -DHAVE_SETNS +endif + all: bridge bridge: $(BROBJ) $(LIBNETLINK) diff --git a/bridge/bridge.c b/bridge/bridge.c index ee08f90..5fcc552 100644 --- a/bridge/bridge.c +++ b/bridge/bridge.c @@ -13,6 +13,7 @@ #include "SNAPSHOT.h" #include "utils.h" #include "br_common.h" +#include "namespace.h" struct rtnl_handle rth = { .fd = -1 }; int preferred_family = AF_UNSPEC; @@ -31,7 +32,7 @@ static void usage(void) "Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help }\n" "where OBJECT := { link | fdb | mdb | vlan | monitor }\n" " OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n" -" -o[neline] | -t[imestamp] \n"); +" -o[neline] | -t[imestamp] | -n[etns] name }\n"); exit(-1); } @@ -112,6 +113,10 @@ main(int argc, char **argv) preferred_family = AF_INET; } else if (strcmp(opt, "-6") == 0) { preferred_family = AF_INET6; + } else if (matches(opt, "-netns") == 0) { + NEXT_ARG(); + if (netns_switch(argv[1])) + exit(-1); } else { fprintf(stderr, "Option \"%s\" is unknown, try \"bridge help\".\n", opt); exit(-1); diff --git a/man/man8/bridge.8 b/man/man8/bridge.8 index af31d41..cb3fb46 100644 --- a/man/man8/bridge.8 +++ b/man/man8/bridge.8 @@ -19,7 +19,8 @@ bridge \- show / manipulate bridge addresses and devices .ti -8 .IR OPTIONS " := { " \fB\-V\fR[\fIersion\fR] | -\fB\-s\fR[\fItatistics\fR] } +\fB\-s\fR[\fItatistics\fR] | +\fB\-n\fR[\fIetns\fR] name } .ti -8 .BR "bridge link set" @@ -112,6 +113,26 @@ output more information. If this option is given multiple times, the amount of information increases. As a rule, the information is statistics or some time values. +.TP +.BR "\-n" , " \-net" , " \-netns " <NETNS> +switches +.B bridge +to the specified network namespace +.IR NETNS . +Actually it just simplifies executing of: + +.B ip netns exec +.IR NETNS +.B bridge +.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | " +.BR help " }" + +to + +.B bridge +.RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | " +.BR help " }" + .SH BRIDGE - COMMAND SYNTAX -- 2.1.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 3/4] bridge: Allow to easy change network namespace 2014-12-13 17:55 ` [PATCH iproute2 3/4] bridge: " Vadim Kochan @ 2014-12-14 9:36 ` Jiri Pirko 0 siblings, 0 replies; 12+ messages in thread From: Jiri Pirko @ 2014-12-14 9:36 UTC (permalink / raw) To: Vadim Kochan; +Cc: netdev Sat, Dec 13, 2014 at 06:55:33PM CET, vadim4j@gmail.com wrote: >From: Vadim Kochan <vadim4j@gmail.com> > >Added new '-netns' option to simplify executing following cmd: > > ip netns exec NETNS bridge OPTIONS COMMAND OBJECT > > to > > bridge -n[etns] NETNS OPTIONS COMMAND OBJECT > >e.g.: > > bridge -net vnet0 fdb > >Signed-off-by: Vadim Kochan <vadim4j@gmail.com> Signed-off-by: Jiri Pirko <jiri@resnulli.us> ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH iproute2 4/4] tc: Allow to easy change network namespace 2014-12-13 17:55 [PATCH iproute2 0/4] Switch network ns w/o execvp for iproute2 tools Vadim Kochan ` (2 preceding siblings ...) 2014-12-13 17:55 ` [PATCH iproute2 3/4] bridge: " Vadim Kochan @ 2014-12-13 17:55 ` Vadim Kochan 2014-12-14 9:36 ` Jiri Pirko 3 siblings, 1 reply; 12+ messages in thread From: Vadim Kochan @ 2014-12-13 17:55 UTC (permalink / raw) To: netdev; +Cc: Vadim Kochan From: Vadim Kochan <vadim4j@gmail.com> Added new '-netns' option to simplify executing following cmd: ip netns exec NETNS tc OPTIONS COMMAND OBJECT to tc -n[etns] NETNS OPTIONS COMMAND OBJECT e.g.: tc -net vnet0 qdisc Signed-off-by: Vadim Kochan <vadim4j@gmail.com> --- man/man8/tc.8 | 65 +++++++++++++++++++++++++++++++++++++++++++++-------------- tc/Makefile | 5 +++++ tc/tc.c | 8 +++++++- 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/man/man8/tc.8 b/man/man8/tc.8 index 8d794de..d8f974f 100644 --- a/man/man8/tc.8 +++ b/man/man8/tc.8 @@ -2,7 +2,9 @@ .SH NAME tc \- show / manipulate traffic control settings .SH SYNOPSIS -.B tc qdisc [ add | change | replace | link | delete ] dev +.B tc +.RI "[ " OPTIONS " ]" +.B qdisc [ add | change | replace | link | delete ] dev DEV .B [ parent @@ -13,7 +15,9 @@ qdisc-id ] qdisc [ qdisc specific parameters ] .P -.B tc class [ add | change | replace | delete ] dev +.B tc +.RI "[ " OPTIONS " ]" +.B class [ add | change | replace | delete ] dev DEV .B parent qdisc-id @@ -22,7 +26,9 @@ class-id ] qdisc [ qdisc specific parameters ] .P -.B tc filter [ add | change | replace | delete ] dev +.B tc +.RI "[ " OPTIONS " ]" +.B filter [ add | change | replace | delete ] dev DEV .B [ parent qdisc-id @@ -35,21 +41,28 @@ priority filtertype flow-id .B tc +.RI "[ " OPTIONS " ]" .RI "[ " FORMAT " ]" .B qdisc show [ dev DEV .B ] .P .B tc +.RI "[ " OPTIONS " ]" .RI "[ " FORMAT " ]" .B class show dev DEV .P -.B tc filter show dev +.B tc +.RI "[ " OPTIONS " ]" +.B filter show dev DEV .P -.B tc [ -force ] -b\fR[\fIatch\fR] \fB[ filename ] +.ti 8 +.IR OPTIONS " := {" +\fB[ -force ] -b\fR[\fIatch\fR] \fB[ filename ] \fR| +\fB[ \fB-n\fR[\fIetns\fR] name \fB] \fR} .ti 8 .IR FORMAT " := {" @@ -407,6 +420,38 @@ link Only available for qdiscs and performs a replace where the node must exist already. +.SH OPTIONS + +.TP +.BR "\-b", " \-b filename", " \-batch", " \-batch filename" +read commands from provided file or standard input and invoke them. +First failure will cause termination of tc. + +.TP +.BR "\-force" +don't terminate tc on errors in batch mode. +If there were any errors during execution of the commands, the application return code will be non zero. + +.TP +.BR "\-n" , " \-net" , " \-netns " <NETNS> +switches +.B tc +to the specified network namespace +.IR NETNS . +Actually it just simplifies executing of: + +.B ip netns exec +.IR NETNS +.B tc +.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | " +.BR help " }" + +to + +.B tc +.RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | " +.BR help " }" + .SH FORMAT The show command has additional formatting options: @@ -430,16 +475,6 @@ decode filter offset and mask values to equivalent filter commands based on TCP/ .BR "\-iec" print rates in IEC units (ie. 1K = 1024). -.TP -.BR "\-b", " \-b filename", " \-batch", " \-batch filename" -read commands from provided file or standard input and invoke them. -First failure will cause termination of tc. - -.TP -.BR "\-force" -don't terminate tc on errors in batch mode. -If there were any errors during execution of the commands, the application return code will be non zero. - .SH HISTORY .B tc was written by Alexey N. Kuznetsov and added in Linux 2.2. diff --git a/tc/Makefile b/tc/Makefile index 1ab36c6..536ed88 100644 --- a/tc/Makefile +++ b/tc/Makefile @@ -3,6 +3,11 @@ TCOBJ= tc.o tc_qdisc.o tc_class.o tc_filter.o tc_util.o \ m_ematch.o emp_ematch.yacc.o emp_ematch.lex.o include ../Config + +ifeq ($(IP_CONFIG_SETNS),y) + CFLAGS += -DHAVE_SETNS +endif + SHARED_LIBS ?= y TCMODULES := diff --git a/tc/tc.c b/tc/tc.c index 9b50e74..ea4ba10 100644 --- a/tc/tc.c +++ b/tc/tc.c @@ -29,6 +29,7 @@ #include "utils.h" #include "tc_util.h" #include "tc_common.h" +#include "namespace.h" int show_stats = 0; int show_details = 0; @@ -185,7 +186,8 @@ static void usage(void) fprintf(stderr, "Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }\n" " tc [-force] -batch filename\n" "where OBJECT := { qdisc | class | filter | action | monitor }\n" - " OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | -b[atch] [filename] }\n"); + " OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | -b[atch] [filename] | " + "-n[etns] name }\n"); } static int do_cmd(int argc, char **argv) @@ -293,6 +295,10 @@ int main(int argc, char **argv) if (argc <= 1) usage(); batch_file = argv[1]; + } else if (matches(argv[1], "-netns") == 0) { + NEXT_ARG(); + if (netns_switch(argv[1])) + return -1; } else { fprintf(stderr, "Option \"%s\" is unknown, try \"tc -help\".\n", argv[1]); return -1; -- 2.1.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH iproute2 4/4] tc: Allow to easy change network namespace 2014-12-13 17:55 ` [PATCH iproute2 4/4] tc: " Vadim Kochan @ 2014-12-14 9:36 ` Jiri Pirko 0 siblings, 0 replies; 12+ messages in thread From: Jiri Pirko @ 2014-12-14 9:36 UTC (permalink / raw) To: Vadim Kochan; +Cc: netdev Sat, Dec 13, 2014 at 06:55:34PM CET, vadim4j@gmail.com wrote: >From: Vadim Kochan <vadim4j@gmail.com> > >Added new '-netns' option to simplify executing following cmd: > > ip netns exec NETNS tc OPTIONS COMMAND OBJECT > > to > > tc -n[etns] NETNS OPTIONS COMMAND OBJECT > >e.g.: > > tc -net vnet0 qdisc > >Signed-off-by: Vadim Kochan <vadim4j@gmail.com> Signed-off-by: Jiri Pirko <jiri@resnulli.us> ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2014-12-24 21:17 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-12-13 17:55 [PATCH iproute2 0/4] Switch network ns w/o execvp for iproute2 tools Vadim Kochan 2014-12-13 17:55 ` [PATCH iproute2 1/4] lib: Add netns_switch func for change network namespace Vadim Kochan 2014-12-14 9:35 ` Jiri Pirko 2014-12-13 17:55 ` [PATCH iproute2 2/4] ip: Allow to easy " Vadim Kochan 2014-12-14 9:36 ` Jiri Pirko 2014-12-24 20:35 ` Stephen Hemminger 2014-12-24 20:33 ` Vadim Kochan 2014-12-24 21:07 ` Vadim Kochan 2014-12-13 17:55 ` [PATCH iproute2 3/4] bridge: " Vadim Kochan 2014-12-14 9:36 ` Jiri Pirko 2014-12-13 17:55 ` [PATCH iproute2 4/4] tc: " Vadim Kochan 2014-12-14 9:36 ` Jiri Pirko
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).