X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=vswitchd%2Fovs-brcompatd.c;h=f874a4df45d84cbad92e4cf180a869b6550684b3;hb=24045e35021a318316f51d2e075fca07a736b91c;hp=992b8e21be5566d12f741404dd2f67add10c2656;hpb=cceb11f5b12d09cc8afc87ca4fd03e941234d439;p=openvswitch diff --git a/vswitchd/ovs-brcompatd.c b/vswitchd/ovs-brcompatd.c index 992b8e21..f874a4df 100644 --- a/vswitchd/ovs-brcompatd.c +++ b/vswitchd/ovs-brcompatd.c @@ -233,14 +233,11 @@ static void 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) { @@ -256,7 +253,6 @@ do_get_bridge_parts(const struct ovsrec_bridge *br, struct svec *parts, svec_add(parts, port->name); } } - svec_destroy(&ports); } /* Add all the interfaces for 'bridge' to 'ifaces', breaking bonded interfaces @@ -497,14 +493,6 @@ del_port(const struct ovsrec_bridge *br, const struct ovsrec_port *port) } 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 @@ -530,7 +518,6 @@ del_interface(const struct ovsrec_bridge *br, } ovsrec_port_set_interfaces(port, ifaces, n); free(ifaces); - ovsrec_interface_delete(iface); } } @@ -591,24 +578,6 @@ del_bridge(struct ovsdb_idl *idl, 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++) { @@ -619,9 +588,6 @@ del_bridge(struct ovsdb_idl *idl, ovsrec_open_vswitch_set_bridges(ovs, bridges, n); free(bridges); - /* Delete the bridge itself. */ - ovsrec_bridge_delete(br); - return commit_txn(txn, true); } @@ -965,6 +931,7 @@ handle_fdb_query_cmd(const struct ovsrec_open_vswitch *ovs, /* Free memory. */ ofpbuf_uninit(&query_data); + free(local_macs); return 0; } @@ -1080,26 +1047,45 @@ handle_get_ports_cmd(const struct ovsrec_open_vswitch *ovs, 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; } @@ -1413,7 +1399,8 @@ parse_options(int argc, char *argv[]) OPT_PRUNE_TIMEOUT, OPT_APPCTL_COMMAND, VLOG_OPTION_ENUMS, - LEAK_CHECKER_OPTION_ENUMS + LEAK_CHECKER_OPTION_ENUMS, + DAEMON_OPTION_ENUMS }; static struct option long_options[] = { {"help", no_argument, 0, 'h'},