struct ovsrec_controller ***controllersp);
static void bridge_reconfigure_one(const struct ovsrec_open_vswitch *,
struct bridge *);
-static void bridge_reconfigure_controller(const struct ovsrec_open_vswitch *,
- struct bridge *,
- const struct sockaddr_in *managers,
- size_t n_managers);
+static void bridge_reconfigure_remotes(const struct ovsrec_open_vswitch *,
+ struct bridge *,
+ const struct sockaddr_in *managers,
+ size_t n_managers);
static void bridge_get_all_ifaces(const struct bridge *, struct shash *ifaces);
static void bridge_fetch_dp_ifaces(struct bridge *);
static void bridge_flush(struct bridge *);
}
ofproto_set_sflow(br->ofproto, &oso);
- svec_destroy(&oso.targets);
+ /* Do not destroy oso.targets because it is owned by sflow_cfg. */
} else {
ofproto_set_sflow(br->ofproto, NULL);
}
* yet; when a controller is configured, resetting the datapath ID will
* immediately disconnect from the controller, so it's better to set
* the datapath ID before the controller. */
- bridge_reconfigure_controller(ovs_cfg, br, managers, n_managers);
+ bridge_reconfigure_remotes(ovs_cfg, br, managers, n_managers);
}
LIST_FOR_EACH (br, struct bridge, node, &all_bridges) {
for (i = 0; i < br->n_ports; i++) {
if (!port) {
port = port_create(br, node->name);
}
+
port_reconfigure(port, node->data);
+ if (!port->n_ifaces) {
+ VLOG_WARN("bridge %s: port %s has no interfaces, dropping",
+ br->name, port->name);
+ port_destroy(port);
+ }
}
shash_destroy(&old_ports);
shash_destroy(&new_ports);
}
static void
-bridge_reconfigure_controller(const struct ovsrec_open_vswitch *ovs_cfg,
- struct bridge *br,
- const struct sockaddr_in *managers,
- size_t n_managers)
+bridge_reconfigure_remotes(const struct ovsrec_open_vswitch *ovs_cfg,
+ struct bridge *br,
+ const struct sockaddr_in *managers,
+ size_t n_managers)
{
struct ovsrec_controller **controllers;
size_t n_controllers;
iface->netdev = NULL;
iface->cfg = if_cfg;
+ /* Attempt to create the network interface in case it doesn't exist yet. */
+ if (!iface_is_internal(port->bridge, iface->name)) {
+ error = set_up_iface(if_cfg, iface, true);
+ if (error) {
+ VLOG_WARN("could not create iface %s: %s", iface->name,
+ strerror(error));
+
+ free(iface->name);
+ free(iface);
+ return NULL;
+ }
+ }
+
if (port->n_ifaces >= port->allocated_ifaces) {
port->ifaces = x2nrealloc(port->ifaces, &port->allocated_ifaces,
sizeof *port->ifaces);
port->bridge->has_bonded_ports = true;
}
- /* Attempt to create the network interface in case it
- * doesn't exist yet. */
- if (!iface_is_internal(port->bridge, iface->name)) {
- error = set_up_iface(if_cfg, iface, true);
- if (error) {
- VLOG_WARN("could not create iface %s: %s", iface->name,
- strerror(error));
- }
- }
-
VLOG_DBG("attached network device %s to port %s", iface->name, port->name);
bridge_flush(port->bridge);