X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vswitchd%2Fovs-brcompatd.c;h=992b8e21be5566d12f741404dd2f67add10c2656;hb=cceb11f5b12d09cc8afc87ca4fd03e941234d439;hp=0b5ebb96c8f38859aeb19507fea967b660c57ee8;hpb=480ce8abca4ae262a4148fe757aebe3e0ddba6f6;p=sliver-openvswitch.git diff --git a/vswitchd/ovs-brcompatd.c b/vswitchd/ovs-brcompatd.c index 0b5ebb96c..992b8e21b 100644 --- a/vswitchd/ovs-brcompatd.c +++ b/vswitchd/ovs-brcompatd.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008, 2009, 2010 Nicira Networks +/* Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ #include "leak-checker.h" #include "netdev.h" #include "netlink.h" +#include "netlink-socket.h" #include "ofpbuf.h" #include "openvswitch/brcompat-netlink.h" #include "ovsdb-idl.h" @@ -57,7 +58,7 @@ #include "vlog.h" #include "vswitchd/vswitch-idl.h" -VLOG_DEFINE_THIS_MODULE(brcompatd) +VLOG_DEFINE_THIS_MODULE(brcompatd); /* xxx Just hangs if datapath is rmmod/insmod. Learn to reconnect? */ @@ -75,7 +76,7 @@ static void usage(void) NO_RETURN; static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 60); -/* Maximum number of milliseconds to wait before pruning port entries that +/* Maximum number of milliseconds to wait before pruning port entries that * no longer exist. If set to zero, ports are never pruned. */ static int prune_timeout = 5000; @@ -110,7 +111,7 @@ lookup_brc_multicast_group(int *multicast_group) 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; } @@ -155,12 +156,17 @@ brc_open(struct nl_sock **sock) 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[] = { @@ -224,7 +230,7 @@ execute_appctl_command(const char *unixctl_command, char **output) } static void -do_get_bridge_parts(const struct ovsrec_bridge *br, struct svec *parts, +do_get_bridge_parts(const struct ovsrec_bridge *br, struct svec *parts, int vlan, bool break_down_bonds) { struct svec ports; @@ -261,7 +267,7 @@ do_get_bridge_parts(const struct ovsrec_bridge *br, struct svec *parts, * reported. If 'vlan' > 0, only interfaces with implicit VLAN 'vlan' are * reported. */ static void -get_bridge_ifaces(const struct ovsrec_bridge *br, struct svec *ifaces, +get_bridge_ifaces(const struct ovsrec_bridge *br, struct svec *ifaces, int vlan) { do_get_bridge_parts(br, ifaces, vlan, true); @@ -274,7 +280,7 @@ get_bridge_ifaces(const struct ovsrec_bridge *br, struct svec *ifaces, * only trunk ports or ports with implicit VLAN 0 are reported. If 'vlan' > 0, * only port with implicit VLAN 'vlan' are reported. */ static void -get_bridge_ports(const struct ovsrec_bridge *br, struct svec *ports, +get_bridge_ports(const struct ovsrec_bridge *br, struct svec *ports, int vlan) { do_get_bridge_parts(br, ports, vlan, false); @@ -299,7 +305,7 @@ ovs_insert_bridge(const struct ovsrec_open_vswitch *ovs, struct ovsrec_bridge *bridge) { struct ovsrec_bridge **bridges; - size_t i; + size_t i; bridges = xmalloc(sizeof *ovs->bridges * (ovs->n_bridges + 1)); for (i = 0; i < ovs->n_bridges; i++) { @@ -308,7 +314,7 @@ ovs_insert_bridge(const struct ovsrec_open_vswitch *ovs, bridges[ovs->n_bridges] = bridge; ovsrec_open_vswitch_set_bridges(ovs, bridges, ovs->n_bridges + 1); free(bridges); -} +} static struct json * where_uuid_equals(const struct uuid *uuid) @@ -437,18 +443,18 @@ add_bridge(struct ovsdb_idl *idl, const struct ovsrec_open_vswitch *ovs, port = ovsrec_port_insert(txn_from_openvswitch(ovs)); ovsrec_port_set_name(port, br_name); ovsrec_port_set_interfaces(port, &iface, 1); - + br = ovsrec_bridge_insert(txn_from_openvswitch(ovs)); ovsrec_bridge_set_name(br, br_name); ovsrec_bridge_set_ports(br, &port, 1); - + ovs_insert_bridge(ovs, br); return commit_txn(txn, true); } static void -add_port(const struct ovsrec_open_vswitch *ovs, +add_port(const struct ovsrec_open_vswitch *ovs, const struct ovsrec_bridge *br, const char *port_name) { struct ovsrec_interface *iface; @@ -692,7 +698,7 @@ send_simple_reply(uint32_t seq, int error) static int handle_bridge_cmd(struct ovsdb_idl *idl, - const struct ovsrec_open_vswitch *ovs, + const struct ovsrec_open_vswitch *ovs, struct ofpbuf *buffer, bool add) { const char *br_name; @@ -859,7 +865,7 @@ handle_fdb_query_cmd(const struct ovsrec_open_vswitch *ovs, } /* Figure out vswitchd bridge and VLAN. */ - error = linux_bridge_to_ovs_bridge(ovs, linux_name, + error = linux_bridge_to_ovs_bridge(ovs, linux_name, &ovs_bridge, &br_vlan); if (error) { send_simple_reply(seq, error); @@ -916,7 +922,7 @@ handle_fdb_query_cmd(const struct ovsrec_open_vswitch *ovs, if (sscanf(line, "%d %d "ETH_ADDR_SCAN_FMT" %d", &port, &vlan, ETH_ADDR_SCAN_ARGS(mac), &age) != 2 + ETH_ADDR_SCAN_COUNT + 1) { - struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); VLOG_INFO_RL(&rl, "fdb/show output has invalid format: %s", line); continue; } @@ -1057,7 +1063,7 @@ handle_get_ports_cmd(const struct ovsrec_open_vswitch *ovs, return error; } - error = linux_bridge_to_ovs_bridge(ovs, linux_name, + error = linux_bridge_to_ovs_bridge(ovs, linux_name, &ovs_bridge, &br_vlan); if (error) { send_simple_reply(seq, error); @@ -1172,7 +1178,7 @@ rtnl_recv_update(struct ovsdb_idl *idl, } else if (error == ENOBUFS) { VLOG_WARN_RL(&rl, "network monitor socket overflowed"); } else if (error) { - VLOG_WARN_RL(&rl, "error on network monitor socket: %s", + VLOG_WARN_RL(&rl, "error on network monitor socket: %s", strerror(error)); } else { struct nlattr *attrs[ARRAY_SIZE(rtnlgrp_link_policy)]; @@ -1185,8 +1191,8 @@ rtnl_recv_update(struct ovsdb_idl *idl, VLOG_WARN_RL(&rl, "received bad rtnl message (no ifinfomsg)"); ofpbuf_delete(buf); return; - } - + } + if (!nl_policy_parse(buf, NLMSG_HDRLEN + sizeof(struct ifinfomsg), rtnlgrp_link_policy, attrs, ARRAY_SIZE(rtnlgrp_link_policy))) { @@ -1216,7 +1222,7 @@ rtnl_recv_update(struct ovsdb_idl *idl, br = find_bridge(ovs, br_name); if (!br) { - VLOG_WARN("no bridge named %s from which to remove %s", + VLOG_WARN("no bridge named %s from which to remove %s", br_name, port_name); ofpbuf_delete(buf); return; @@ -1317,14 +1323,22 @@ main(int argc, char *argv[]) } 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"); } } daemonize_complete(); - idl = ovsdb_idl_create(remote, &ovsrec_idl_class); + idl = ovsdb_idl_create(remote, &ovsrec_idl_class, true); for (;;) { const struct ovsrec_open_vswitch *ovs; @@ -1343,8 +1357,8 @@ main(int argc, char *argv[]) netdev_run(); /* If 'prune_timeout' is non-zero, we actively prune from the - * configuration of port entries that are no longer valid. We - * use two methods: + * configuration of port entries that are no longer valid. We + * use two methods: * * 1) The kernel explicitly notifies us of removed ports * through the RTNL messages. @@ -1413,7 +1427,7 @@ parse_options(int argc, char *argv[]) }; char *short_options = long_options_to_short_options(long_options); - appctl_command = xasprintf("%s/ovs-appctl %%s", ovs_bindir); + appctl_command = xasprintf("%s/ovs-appctl %%s", ovs_bindir()); for (;;) { int c;