|
|
a4b897 |
commit 2a9f06affaf089608a8137decaa17c5aee71ed6f
|
|
|
a4b897 |
Author: Pavel Šimerda <psimerda@redhat.com>
|
|
|
a4b897 |
Date: Thu May 28 12:17:38 2015 +0200
|
|
|
a4b897 |
|
|
|
a4b897 |
backport selected bridge features and documentation
|
|
|
a4b897 |
|
|
|
a4b897 |
diff --git a/bridge/Makefile b/bridge/Makefile
|
|
|
a4b897 |
index 1fb8320..9800753 100644
|
|
|
a4b897 |
--- a/bridge/Makefile
|
|
|
a4b897 |
+++ b/bridge/Makefile
|
|
|
a4b897 |
@@ -2,6 +2,10 @@ BROBJ = bridge.o fdb.o monitor.o link.o mdb.o vlan.o
|
|
|
a4b897 |
|
|
|
a4b897 |
include ../Config
|
|
|
a4b897 |
|
|
|
a4b897 |
+ifeq ($(IP_CONFIG_SETNS),y)
|
|
|
a4b897 |
+ CFLAGS += -DHAVE_SETNS
|
|
|
a4b897 |
+endif
|
|
|
a4b897 |
+
|
|
|
a4b897 |
all: bridge
|
|
|
a4b897 |
|
|
|
a4b897 |
bridge: $(BROBJ) $(LIBNETLINK)
|
|
|
a4b897 |
diff --git a/bridge/bridge.c b/bridge/bridge.c
|
|
|
a4b897 |
index ee08f90..5fcc552 100644
|
|
|
a4b897 |
--- a/bridge/bridge.c
|
|
|
a4b897 |
+++ b/bridge/bridge.c
|
|
|
a4b897 |
@@ -13,6 +13,7 @@
|
|
|
a4b897 |
#include "SNAPSHOT.h"
|
|
|
a4b897 |
#include "utils.h"
|
|
|
a4b897 |
#include "br_common.h"
|
|
|
a4b897 |
+#include "namespace.h"
|
|
|
a4b897 |
|
|
|
a4b897 |
struct rtnl_handle rth = { .fd = -1 };
|
|
|
a4b897 |
int preferred_family = AF_UNSPEC;
|
|
|
a4b897 |
@@ -31,7 +32,7 @@ static void usage(void)
|
|
|
a4b897 |
"Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help }\n"
|
|
|
a4b897 |
"where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
|
|
|
a4b897 |
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
|
|
|
a4b897 |
-" -o[neline] | -t[imestamp] \n");
|
|
|
a4b897 |
+" -o[neline] | -t[imestamp] | -n[etns] name }\n");
|
|
|
a4b897 |
exit(-1);
|
|
|
a4b897 |
}
|
|
|
a4b897 |
|
|
|
a4b897 |
@@ -112,6 +113,10 @@ main(int argc, char **argv)
|
|
|
a4b897 |
preferred_family = AF_INET;
|
|
|
a4b897 |
} else if (strcmp(opt, "-6") == 0) {
|
|
|
a4b897 |
preferred_family = AF_INET6;
|
|
|
a4b897 |
+ } else if (matches(opt, "-netns") == 0) {
|
|
|
a4b897 |
+ NEXT_ARG();
|
|
|
a4b897 |
+ if (netns_switch(argv[1]))
|
|
|
a4b897 |
+ exit(-1);
|
|
|
a4b897 |
} else {
|
|
|
a4b897 |
fprintf(stderr, "Option \"%s\" is unknown, try \"bridge help\".\n", opt);
|
|
|
a4b897 |
exit(-1);
|
|
|
a4b897 |
diff --git a/bridge/fdb.c b/bridge/fdb.c
|
|
|
a4b897 |
index 591fbbe..f725012 100644
|
|
|
a4b897 |
--- a/bridge/fdb.c
|
|
|
a4b897 |
+++ b/bridge/fdb.c
|
|
|
a4b897 |
@@ -30,7 +30,7 @@ int filter_index;
|
|
|
a4b897 |
|
|
|
a4b897 |
static void usage(void)
|
|
|
a4b897 |
{
|
|
|
a4b897 |
- fprintf(stderr, "Usage: bridge fdb { add | append | del } ADDR dev DEV {self|master} [ temp ]\n"
|
|
|
a4b897 |
+ fprintf(stderr, "Usage: bridge fdb { add | append | del | replace } ADDR dev DEV {self|master} [ temp ]\n"
|
|
|
a4b897 |
" [router] [ dst IPADDR] [ vlan VID ]\n"
|
|
|
a4b897 |
" [ port PORT] [ vni VNI ] [via DEV]\n");
|
|
|
a4b897 |
fprintf(stderr, " bridge fdb {show} [ dev DEV ]\n");
|
|
|
a4b897 |
@@ -125,12 +125,16 @@ int print_fdb(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
|
|
|
a4b897 |
if (ifindex) {
|
|
|
a4b897 |
char ifname[IF_NAMESIZE];
|
|
|
a4b897 |
|
|
|
a4b897 |
- if (if_indextoname(ifindex, ifname))
|
|
|
a4b897 |
+ if (!tb[NDA_LINK_NETNSID] &&
|
|
|
a4b897 |
+ if_indextoname(ifindex, ifname))
|
|
|
a4b897 |
fprintf(fp, "via %s ", ifname);
|
|
|
a4b897 |
else
|
|
|
a4b897 |
fprintf(fp, "via ifindex %u ", ifindex);
|
|
|
a4b897 |
}
|
|
|
a4b897 |
}
|
|
|
a4b897 |
+ if (tb[NDA_LINK_NETNSID])
|
|
|
a4b897 |
+ fprintf(fp, "link-netnsid %d ",
|
|
|
a4b897 |
+ rta_getattr_u32(tb[NDA_LINK_NETNSID]));
|
|
|
a4b897 |
|
|
|
a4b897 |
if (show_stats && tb[NDA_CACHEINFO]) {
|
|
|
a4b897 |
struct nda_cacheinfo *ci = RTA_DATA(tb[NDA_CACHEINFO]);
|
|
|
a4b897 |
@@ -334,6 +338,8 @@ int do_fdb(int argc, char **argv)
|
|
|
a4b897 |
return fdb_modify(RTM_NEWNEIGH, NLM_F_CREATE|NLM_F_EXCL, argc-1, argv+1);
|
|
|
a4b897 |
if (matches(*argv, "append") == 0)
|
|
|
a4b897 |
return fdb_modify(RTM_NEWNEIGH, NLM_F_CREATE|NLM_F_APPEND, argc-1, argv+1);
|
|
|
a4b897 |
+ if (matches(*argv, "replace") == 0)
|
|
|
a4b897 |
+ return fdb_modify(RTM_NEWNEIGH, NLM_F_CREATE|NLM_F_REPLACE, argc-1, argv+1);
|
|
|
a4b897 |
if (matches(*argv, "delete") == 0)
|
|
|
a4b897 |
return fdb_modify(RTM_DELNEIGH, 0, argc-1, argv+1);
|
|
|
a4b897 |
if (matches(*argv, "show") == 0 ||
|
|
|
a4b897 |
diff --git a/bridge/monitor.c b/bridge/monitor.c
|
|
|
a4b897 |
index e96fcaf..76e7d47 100644
|
|
|
a4b897 |
--- a/bridge/monitor.c
|
|
|
a4b897 |
+++ b/bridge/monitor.c
|
|
|
a4b897 |
@@ -132,12 +132,15 @@ int do_monitor(int argc, char **argv)
|
|
|
a4b897 |
|
|
|
a4b897 |
if (file) {
|
|
|
a4b897 |
FILE *fp;
|
|
|
a4b897 |
+ int err;
|
|
|
a4b897 |
fp = fopen(file, "r");
|
|
|
a4b897 |
if (fp == NULL) {
|
|
|
a4b897 |
perror("Cannot fopen");
|
|
|
a4b897 |
exit(-1);
|
|
|
a4b897 |
}
|
|
|
a4b897 |
- return rtnl_from_file(fp, accept_msg, stdout);
|
|
|
a4b897 |
+ err = rtnl_from_file(fp, accept_msg, stdout);
|
|
|
a4b897 |
+ fclose(fp);
|
|
|
a4b897 |
+ return err;
|
|
|
a4b897 |
}
|
|
|
a4b897 |
|
|
|
a4b897 |
if (rtnl_open(&rth, groups) < 0)
|
|
|
a4b897 |
diff --git a/man/man8/bridge.8 b/man/man8/bridge.8
|
|
|
a4b897 |
index 66678b5..9db2aec 100644
|
|
|
a4b897 |
--- a/man/man8/bridge.8
|
|
|
a4b897 |
+++ b/man/man8/bridge.8
|
|
|
a4b897 |
@@ -13,13 +13,14 @@ bridge \- show / manipulate bridge addresses and devices
|
|
|
a4b897 |
|
|
|
a4b897 |
.ti -8
|
|
|
a4b897 |
.IR OBJECT " := { "
|
|
|
a4b897 |
-.BR link " | " fdb " | " vlan " | " monitor " }"
|
|
|
a4b897 |
+.BR link " | " fdb " | " mdb " | " vlan " | " monitor " }"
|
|
|
a4b897 |
.sp
|
|
|
a4b897 |
|
|
|
a4b897 |
.ti -8
|
|
|
a4b897 |
.IR OPTIONS " := { "
|
|
|
a4b897 |
\fB\-V\fR[\fIersion\fR] |
|
|
|
a4b897 |
-\fB\-s\fR[\fItatistics\fR] }
|
|
|
a4b897 |
+\fB\-s\fR[\fItatistics\fR] |
|
|
|
a4b897 |
+\fB\-n\fR[\fIetns\fR] name }
|
|
|
a4b897 |
|
|
|
a4b897 |
.ti -8
|
|
|
a4b897 |
.BR "bridge link set"
|
|
|
a4b897 |
@@ -44,12 +45,12 @@ bridge \- show / manipulate bridge addresses and devices
|
|
|
a4b897 |
.IR DEV " ]"
|
|
|
a4b897 |
|
|
|
a4b897 |
.ti -8
|
|
|
a4b897 |
-.BR "bridge fdb" " { " add " | " append " | " del " } "
|
|
|
a4b897 |
+.BR "bridge fdb" " { " add " | " append " | " del " | " replace " } "
|
|
|
a4b897 |
.I LLADDR
|
|
|
a4b897 |
.B dev
|
|
|
a4b897 |
.IR DEV " { "
|
|
|
a4b897 |
.BR local " | " temp " } { "
|
|
|
a4b897 |
-.BR self " } { " embedded " } { " router " } [ "
|
|
|
a4b897 |
+.BR self " } { " router " } [ "
|
|
|
a4b897 |
.B dst
|
|
|
a4b897 |
.IR IPADDR " ] [ "
|
|
|
a4b897 |
.B vni
|
|
|
a4b897 |
@@ -65,6 +66,21 @@ bridge \- show / manipulate bridge addresses and devices
|
|
|
a4b897 |
.IR DEV " ]"
|
|
|
a4b897 |
|
|
|
a4b897 |
.ti -8
|
|
|
a4b897 |
+.BR "bridge mdb" " { " add " | " del " } "
|
|
|
a4b897 |
+.B dev
|
|
|
a4b897 |
+.IR DEV
|
|
|
a4b897 |
+.B port
|
|
|
a4b897 |
+.IR PORT
|
|
|
a4b897 |
+.B grp
|
|
|
a4b897 |
+.IR GROUP " [ "
|
|
|
a4b897 |
+.BR permanent " | " temp " ]"
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.ti -8
|
|
|
a4b897 |
+.BR "bridge mdb show " [ "
|
|
|
a4b897 |
+.B dev
|
|
|
a4b897 |
+.IR DEV " ]"
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.ti -8
|
|
|
a4b897 |
.BR "bridge vlan" " { " add " | " del " } "
|
|
|
a4b897 |
.B dev
|
|
|
a4b897 |
.IR DEV
|
|
|
a4b897 |
@@ -79,7 +95,7 @@ bridge \- show / manipulate bridge addresses and devices
|
|
|
a4b897 |
.IR DEV " ]"
|
|
|
a4b897 |
|
|
|
a4b897 |
.ti -8
|
|
|
a4b897 |
-.BR "bridge monitor" " [ " all " | " neigh " | " link " ]"
|
|
|
a4b897 |
+.BR "bridge monitor" " [ " all " | " neigh " | " link " | " mdb " ]"
|
|
|
a4b897 |
|
|
|
a4b897 |
.SH OPTIONS
|
|
|
a4b897 |
|
|
|
a4b897 |
@@ -95,6 +111,26 @@ output more information. If this option
|
|
|
a4b897 |
is given multiple times, the amount of information increases.
|
|
|
a4b897 |
As a rule, the information is statistics or some time values.
|
|
|
a4b897 |
|
|
|
a4b897 |
+.TP
|
|
|
a4b897 |
+.BR "\-n" , " \-net" , " \-netns " <NETNS>
|
|
|
a4b897 |
+switches
|
|
|
a4b897 |
+.B bridge
|
|
|
a4b897 |
+to the specified network namespace
|
|
|
a4b897 |
+.IR NETNS .
|
|
|
a4b897 |
+Actually it just simplifies executing of:
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.B ip netns exec
|
|
|
a4b897 |
+.IR NETNS
|
|
|
a4b897 |
+.B bridge
|
|
|
a4b897 |
+.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | "
|
|
|
a4b897 |
+.BR help " }"
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+to
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.B bridge
|
|
|
a4b897 |
+.RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | "
|
|
|
a4b897 |
+.BR help " }"
|
|
|
a4b897 |
+
|
|
|
a4b897 |
|
|
|
a4b897 |
.SH BRIDGE - COMMAND SYNTAX
|
|
|
a4b897 |
|
|
|
a4b897 |
@@ -110,6 +146,10 @@ As a rule, the information is statistics or some time values.
|
|
|
a4b897 |
- Forwarding Database entry.
|
|
|
a4b897 |
|
|
|
a4b897 |
.TP
|
|
|
a4b897 |
+.B mdb
|
|
|
a4b897 |
+- Multicast group database entry.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.TP
|
|
|
a4b897 |
.B vlan
|
|
|
a4b897 |
- VLAN filter list.
|
|
|
a4b897 |
|
|
|
a4b897 |
@@ -256,10 +296,6 @@ the interface to which this address is associated.
|
|
|
a4b897 |
- the address is associated with a software fdb (default)
|
|
|
a4b897 |
.sp
|
|
|
a4b897 |
|
|
|
a4b897 |
-.B embedded
|
|
|
a4b897 |
-- the address is associated with an offloaded fdb
|
|
|
a4b897 |
-.sp
|
|
|
a4b897 |
-
|
|
|
a4b897 |
.B router
|
|
|
a4b897 |
- the destination address is associated with a router.
|
|
|
a4b897 |
Valid if the referenced device is a VXLAN type device and has
|
|
|
a4b897 |
@@ -314,6 +350,13 @@ This command removes an existing fdb entry.
|
|
|
a4b897 |
|
|
|
a4b897 |
.PP
|
|
|
a4b897 |
The arguments are the same as with
|
|
|
a4b897 |
+.BR "bridge fdb add" .
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.SS bridge fdb replace - replace a forwarding database entry
|
|
|
a4b897 |
+This command replaces an already present fdb entry.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.PP
|
|
|
a4b897 |
+The arguments are the same as with
|
|
|
a4b897 |
.BR "bridge fdb add" ,
|
|
|
a4b897 |
|
|
|
a4b897 |
.SS bridge fdb show - list forwarding entries.
|
|
|
a4b897 |
@@ -326,6 +369,69 @@ With the
|
|
|
a4b897 |
option, the command becomes verbose. It prints out the last updated
|
|
|
a4b897 |
and last used time for each entry.
|
|
|
a4b897 |
|
|
|
a4b897 |
+.SH bridge mdb - multicast group database management
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.B mdb
|
|
|
a4b897 |
+objects contain known IP multicast group addresses on a link.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.P
|
|
|
a4b897 |
+The corresponding commands display mdb entries, add new entries,
|
|
|
a4b897 |
+and delete old ones.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.SS bridge mdb add - add a new multicast group database entry
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+This command creates a new mdb entry.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.TP
|
|
|
a4b897 |
+.BI dev " DEV"
|
|
|
a4b897 |
+the interface where this group address is associated.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.TP
|
|
|
a4b897 |
+.BI port " PORT"
|
|
|
a4b897 |
+the port whose link is known to have members of this multicast group.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.TP
|
|
|
a4b897 |
+.BI grp " GROUP"
|
|
|
a4b897 |
+the IP multicast group address whose members reside on the link connected to
|
|
|
a4b897 |
+the port.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.B permanent
|
|
|
a4b897 |
+- the mdb entry is permanent
|
|
|
a4b897 |
+.sp
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.B temp
|
|
|
a4b897 |
+- the mdb entry is temporary (default)
|
|
|
a4b897 |
+.sp
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.in -8
|
|
|
a4b897 |
+.SS bridge mdb delete - delete a multicast group database entry
|
|
|
a4b897 |
+This command removes an existing mdb entry.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.PP
|
|
|
a4b897 |
+The arguments are the same as with
|
|
|
a4b897 |
+.BR "bridge mdb add" .
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.SS bridge mdb show - list multicast group database entries
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+This command displays the current multicast group membership table. The table
|
|
|
a4b897 |
+is populated by IGMP and MLD snooping in the bridge driver automatically. It
|
|
|
a4b897 |
+can be altered by
|
|
|
a4b897 |
+.B bridge mdb add
|
|
|
a4b897 |
+and
|
|
|
a4b897 |
+.B bridge mdb del
|
|
|
a4b897 |
+commands manually too.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.TP
|
|
|
a4b897 |
+.BI dev " DEV"
|
|
|
a4b897 |
+the interface only whose entries should be listed. Default is to list all
|
|
|
a4b897 |
+bridge interfaces.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
+.PP
|
|
|
a4b897 |
+With the
|
|
|
a4b897 |
+.B -details
|
|
|
a4b897 |
+option, the command becomes verbose. It prints out the ports known to have
|
|
|
a4b897 |
+a connected router.
|
|
|
a4b897 |
+
|
|
|
a4b897 |
.SH bridge vlan - VLAN filter list
|
|
|
a4b897 |
|
|
|
a4b897 |
.B vlan
|
|
|
a4b897 |
@@ -395,7 +501,7 @@ command is the first in the command line and then the object list follows:
|
|
|
a4b897 |
.I OBJECT-LIST
|
|
|
a4b897 |
is the list of object types that we want to monitor.
|
|
|
a4b897 |
It may contain
|
|
|
a4b897 |
-.BR link ", and " fdb "."
|
|
|
a4b897 |
+.BR link ", " fdb ", and " mdb "."
|
|
|
a4b897 |
If no
|
|
|
a4b897 |
.B file
|
|
|
a4b897 |
argument is given,
|