struct nlattr *attrs[ARRAY_SIZE(brc_multicast_policy)];
int retval;
- retval = nl_sock_create(NETLINK_GENERIC, 0, 0, 0, &sock);
+ retval = nl_sock_create(NETLINK_GENERIC, &sock);
if (retval) {
return retval;
}
return retval;
}
- retval = nl_sock_create(NETLINK_GENERIC, multicast_group, 0, 0, sock);
+ retval = nl_sock_create(NETLINK_GENERIC, sock);
if (retval) {
return retval;
}
- return 0;
+ retval = nl_sock_join_mcgroup(*sock, multicast_group);
+ if (retval) {
+ nl_sock_destroy(*sock);
+ *sock = NULL;
+ }
+ return retval;
}
static const struct nl_policy brc_dp_policy[] = {
}
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;
}
}
if (prune_timeout) {
- if (nl_sock_create(NETLINK_ROUTE, RTNLGRP_LINK, 0, 0, &rtnl_sock)) {
- ovs_fatal(0, "could not create rtnetlink socket");
+ int error;
+
+ error = nl_sock_create(NETLINK_ROUTE, &rtnl_sock);
+ if (error) {
+ ovs_fatal(error, "could not create rtnetlink socket");
+ }
+
+ error = nl_sock_join_mcgroup(rtnl_sock, RTNLGRP_LINK);
+ if (error) {
+ ovs_fatal(error, "could not join RTNLGRP_LINK multicast group");
}
}
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'},