do_get_bridge_parts(const struct ovsrec_bridge *br, struct svec *parts,
int vlan, bool break_down_bonds)
{
- struct svec ports;
size_t i, j;
- svec_init(&ports);
for (i = 0; i < br->n_ports; i++) {
const struct ovsrec_port *port = br->ports[i];
- svec_add(&ports, port->name);
if (vlan >= 0) {
int port_vlan = port->n_tag ? *port->tag : 0;
if (vlan != port_vlan) {
svec_add(parts, port->name);
}
}
- svec_destroy(&ports);
}
/* Add all the interfaces for 'bridge' to 'ifaces', breaking bonded interfaces
}
ovsrec_bridge_set_ports(br, ports, n);
free(ports);
-
- /* Delete all of the port's interfaces. */
- for (i = 0; i < port->n_interfaces; i++) {
- ovsrec_interface_delete(port->interfaces[i]);
- }
-
- /* Delete the port itself. */
- ovsrec_port_delete(port);
}
/* Delete 'iface' from 'port' (which must be within 'br'). If 'iface' was
}
ovsrec_port_set_interfaces(port, ifaces, n);
free(ifaces);
- ovsrec_interface_delete(iface);
}
}
ovsdb_idl_txn_add_comment(txn, "ovs-brcompatd: delbr %s", br_name);
- /* Delete everything that the bridge points to, then delete the bridge
- * itself. */
- while (br->n_ports > 0) {
- del_port(br, br->ports[0]);
- }
- for (i = 0; i < br->n_mirrors; i++) {
- ovsrec_mirror_delete(br->mirrors[i]);
- }
- if (br->netflow) {
- ovsrec_netflow_delete(br->netflow);
- }
- if (br->sflow) {
- ovsrec_sflow_delete(br->sflow);
- }
- for (i = 0; i < br->n_controller; i++) {
- ovsrec_controller_delete(br->controller[i]);
- }
-
/* Remove 'br' from the vswitch's list of bridges. */
bridges = xmalloc(sizeof *ovs->bridges * ovs->n_bridges);
for (i = n = 0; i < ovs->n_bridges; i++) {
ovsrec_open_vswitch_set_bridges(ovs, bridges, n);
free(bridges);
- /* Delete the bridge itself. */
- ovsrec_bridge_delete(br);
-
return commit_txn(txn, true);
}
/* Free memory. */
ofpbuf_uninit(&query_data);
+ free(local_macs);
return 0;
}
return 0;
}
+static struct ofpbuf *
+brc_recv_update__(void)
+{
+ for (;;) {
+ struct ofpbuf *buffer;
+ int retval;
+
+ retval = nl_sock_recv(brc_sock, &buffer, false);
+ switch (retval) {
+ case 0:
+ if (nl_msg_nlmsgerr(buffer, NULL)
+ || nl_msg_nlmsghdr(buffer)->nlmsg_type == NLMSG_DONE) {
+ break;
+ }
+ return buffer;
+
+ case ENOBUFS:
+ break;
+
+ case EAGAIN:
+ return NULL;
+
+ default:
+ VLOG_WARN_RL(&rl, "brc_recv_update: %s", strerror(retval));
+ return NULL;
+ }
+ ofpbuf_delete(buffer);
+ }
+}
+
static void
brc_recv_update(struct ovsdb_idl *idl)
{
- int retval;
struct ofpbuf *buffer;
struct genlmsghdr *genlmsghdr;
const struct ovsrec_open_vswitch *ovs;
- buffer = NULL;
- do {
- ofpbuf_delete(buffer);
- retval = nl_sock_recv(brc_sock, &buffer, false);
- } while (retval == ENOBUFS
- || (!retval
- && (nl_msg_nlmsgerr(buffer, NULL)
- || nl_msg_nlmsghdr(buffer)->nlmsg_type == NLMSG_DONE)));
- if (retval) {
- if (retval != EAGAIN) {
- VLOG_WARN_RL(&rl, "brc_recv_update: %s", strerror(retval));
- }
+ buffer = brc_recv_update__();
+ if (!buffer) {
return;
}