aboutsummaryrefslogtreecommitdiff
path: root/vswitchd
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2011-11-30 12:09:35 -0800
committerBen Pfaff <blp@nicira.com>2011-11-30 13:25:36 -0800
commitf145afdc206064b942c2c0d8d1ab27e07b4b4f1d (patch)
treebf96c68ad796d3910b4e55d01d2160c806a48677 /vswitchd
parent4bee05c217e365bce67878497db6f83f055f0cff (diff)
bridge: Configure datapath ID earlier.
The design intent is for LACP ports to use the datapath ID as the default system ID when none is specifically configured. However, the datapath ID is not available that early. This commit makes it available earlier. This commit does not fix another bug that prevents the LACP system ID from being set properly (nothing sets it at all, in fact, so it always uses 0). Build and unit tested only.
Diffstat (limited to 'vswitchd')
-rw-r--r--vswitchd/bridge.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index d085f47b..51766b9f 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -28,6 +28,7 @@
#include "dynamic-string.h"
#include "hash.h"
#include "hmap.h"
+#include "hmapx.h"
#include "jsonrpc.h"
#include "lacp.h"
#include "list.h"
@@ -444,6 +445,10 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg)
HMAP_FOR_EACH (br, node, &all_bridges) {
struct port *port;
+ /* We need the datapath ID early to allow LACP ports to use it as the
+ * default system ID. */
+ bridge_configure_datapath_id(br);
+
HMAP_FOR_EACH (port, hmap_node, &br->ports) {
struct iface *iface;
@@ -456,7 +461,6 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg)
}
}
bridge_configure_mirrors(br);
- bridge_configure_datapath_id(br);
bridge_configure_flow_eviction_threshold(br);
bridge_configure_forward_bpdu(br);
bridge_configure_remotes(br, managers, n_managers);
@@ -1278,10 +1282,12 @@ static void
bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
struct iface **hw_addr_iface)
{
+ struct hmapx mirror_output_ports;
const char *hwaddr;
struct port *port;
bool found_addr = false;
int error;
+ int i;
*hw_addr_iface = NULL;
@@ -1298,6 +1304,18 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
}
}
+ /* Mirror output ports don't participate in picking the local hardware
+ * address. ofproto can't help us find out whether a given port is a
+ * mirror output because we haven't configured mirrors yet, so we need to
+ * accumulate them ourselves. */
+ hmapx_init(&mirror_output_ports);
+ for (i = 0; i < br->cfg->n_mirrors; i++) {
+ struct ovsrec_mirror *m = br->cfg->mirrors[i];
+ if (m->output_port) {
+ hmapx_add(&mirror_output_ports, m->output_port);
+ }
+ }
+
/* Otherwise choose the minimum non-local MAC address among all of the
* interfaces. */
HMAP_FOR_EACH (port, hmap_node, &br->ports) {
@@ -1306,7 +1324,7 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
struct iface *iface;
/* Mirror output ports don't participate. */
- if (ofproto_is_mirror_output_bundle(br->ofproto, port)) {
+ if (hmapx_contains(&mirror_output_ports, port->cfg)) {
continue;
}
@@ -1369,6 +1387,8 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
VLOG_WARN("bridge %s: using default bridge Ethernet "
"address "ETH_ADDR_FMT, br->name, ETH_ADDR_ARGS(ea));
}
+
+ hmapx_destroy(&mirror_output_ports);
}
/* Choose and returns the datapath ID for bridge 'br' given that the bridge