From 45c580a3486b246c8e7032d95c58eefdf6d3b3fc Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 3 Jan 2012 13:34:47 -0800 Subject: [PATCH] vswitchd: Also consider access port VLANs as "in use" for VLAN splinters. It's natural to add an access port to a bridge and expect that trunk ports will then immediately start to work properly with that VLAN without additional configuration. This change makes that happen. Signed-off-by: Ben Pfaff --- vswitchd/bridge.c | 18 ++++++++++-------- vswitchd/vswitch.xml | 5 +++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 265410fc..b45b9727 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks +/* Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3412,8 +3412,9 @@ collect_splinter_vlans(const struct ovsrec_open_vswitch *ovs_cfg) * in the process of reconstructing all of them. */ free_registered_blocks(); - splinter_vlans = NULL; + splinter_vlans = bitmap_allocate(4096); sset_init(&splinter_ifaces); + vlan_splinters_enabled_anywhere = false; for (i = 0; i < ovs_cfg->n_bridges; i++) { struct ovsrec_bridge *br_cfg = ovs_cfg->bridges[i]; size_t j; @@ -3426,21 +3427,22 @@ collect_splinter_vlans(const struct ovsrec_open_vswitch *ovs_cfg) struct ovsrec_interface *iface_cfg = port_cfg->interfaces[k]; if (vlan_splinters_is_enabled(iface_cfg)) { + vlan_splinters_enabled_anywhere = true; sset_add(&splinter_ifaces, iface_cfg->name); - - if (!splinter_vlans) { - splinter_vlans = bitmap_allocate(4096); - } vlan_bitmap_from_array__(port_cfg->trunks, port_cfg->n_trunks, splinter_vlans); } } + + if (port_cfg->tag && *port_cfg->tag > 0 && *port_cfg->tag < 4095) { + bitmap_set1(splinter_vlans, *port_cfg->tag); + } } } - vlan_splinters_enabled_anywhere = splinter_vlans != NULL; - if (!splinter_vlans) { + if (!vlan_splinters_enabled_anywhere) { + free(splinter_vlans); sset_destroy(&splinter_ifaces); return NULL; } diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index 2f9a534d..7d02e503 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -1807,6 +1807,11 @@