aboutsummaryrefslogtreecommitdiff
path: root/utilities
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2012-03-16 13:12:54 -0700
committerBen Pfaff <blp@nicira.com>2012-03-20 16:02:20 -0700
commit9f9120615d9dc3bf030d965e21852a59167e0441 (patch)
tree067892606955e2671358fa4754e823ea49645aa4 /utilities
parente608ee3073446c2bba8aaca0c6c31789b0533a0a (diff)
ovs-vsctl: Allow "fake bridges" to be created for VLAN 0.
A fake bridge for VLAN 0 is useful, because it provides a way to create access ports for VLAN 0. There is no good reason to prevent it. NIC-464. Reported-by: Rob Hoes <Rob.Hoes@citrix.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'utilities')
-rw-r--r--utilities/ovs-vsctl.8.in5
-rw-r--r--utilities/ovs-vsctl.c21
2 files changed, 16 insertions, 10 deletions
diff --git a/utilities/ovs-vsctl.8.in b/utilities/ovs-vsctl.8.in
index 64255b57..9bb7223d 100644
--- a/utilities/ovs-vsctl.8.in
+++ b/utilities/ovs-vsctl.8.in
@@ -69,7 +69,8 @@ When such a ``fake bridge'' is active, \fBovs\-vsctl\fR will treat it
much like a bridge separate from its ``parent bridge,'' but the actual
implementation in Open vSwitch uses only a single bridge, with ports on
the fake bridge assigned the implicit VLAN of the fake bridge of which
-they are members.
+they are members. (A fake bridge for VLAN 0 receives packets that
+have no 802.1Q tag or a tag with VLAN 0.)
.
.SH OPTIONS
.
@@ -179,7 +180,7 @@ nothing if \fIbridge\fR already exists as a real bridge.
Creates a ``fake bridge'' named \fIbridge\fR within the existing Open
vSwitch bridge \fIparent\fR, which must already exist and must not
itself be a fake bridge. The new fake bridge will be on 802.1Q VLAN
-\fIvlan\fR, which must be an integer between 1 and 4095. Initially
+\fIvlan\fR, which must be an integer between 0 and 4095. Initially
\fIbridge\fR will have no ports (other than \fIbridge\fR itself).
.IP
Without \fB\-\-may\-exist\fR, attempting to create a bridge that
diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c
index 1f0f485e..7ab1907a 100644
--- a/utilities/ovs-vsctl.c
+++ b/utilities/ovs-vsctl.c
@@ -612,8 +612,13 @@ struct vsctl_bridge {
struct ovsrec_controller **ctrl;
char *fail_mode;
size_t n_ctrl;
- struct vsctl_bridge *parent;
- int vlan;
+
+ /* VLAN ("fake") bridge support.
+ *
+ * Use 'parent != NULL' to detect a fake bridge, because 'vlan' can be 0
+ * in either case. */
+ struct vsctl_bridge *parent; /* Real bridge, or NULL. */
+ int vlan; /* VLAN VID (0...4095), or 0. */
};
struct vsctl_port {
@@ -704,7 +709,7 @@ port_is_fake_bridge(const struct ovsrec_port *port_cfg)
{
return (port_cfg->fake_bridge
&& port_cfg->tag
- && *port_cfg->tag >= 1 && *port_cfg->tag <= 4095);
+ && *port_cfg->tag >= 0 && *port_cfg->tag <= 4095);
}
static struct vsctl_bridge *
@@ -841,7 +846,7 @@ get_info(struct vsctl_context *ctx, struct vsctl_info *info)
port = xmalloc(sizeof *port);
port->port_cfg = port_cfg;
if (port_cfg->tag
- && *port_cfg->tag >= 1 && *port_cfg->tag <= 4095) {
+ && *port_cfg->tag >= 0 && *port_cfg->tag <= 4095) {
port->bridge = find_vlan_bridge(info, br, *port_cfg->tag);
if (!port->bridge) {
port->bridge = br;
@@ -1329,8 +1334,8 @@ cmd_add_br(struct vsctl_context *ctx)
} else if (ctx->argc == 4) {
parent_name = ctx->argv[2];
vlan = atoi(ctx->argv[3]);
- if (vlan < 1 || vlan > 4095) {
- vsctl_fatal("%s: vlan must be between 1 and 4095", ctx->argv[0]);
+ if (vlan < 0 || vlan > 4095) {
+ vsctl_fatal("%s: vlan must be between 0 and 4095", ctx->argv[0]);
}
} else {
vsctl_fatal("'%s' command takes exactly 1 or 3 arguments",
@@ -1397,7 +1402,7 @@ cmd_add_br(struct vsctl_context *ctx)
int64_t tag = vlan;
parent = find_bridge(&info, parent_name, false);
- if (parent && parent->vlan) {
+ if (parent && parent->parent) {
vsctl_fatal("cannot create bridge with fake bridge as parent");
}
if (!parent) {
@@ -1750,7 +1755,7 @@ add_port(struct vsctl_context *ctx,
ovsrec_port_set_bond_fake_iface(port, fake_iface);
free(ifaces);
- if (bridge->vlan) {
+ if (bridge->parent) {
int64_t tag = bridge->vlan;
ovsrec_port_set_tag(port, &tag, 1);
}