#include "leak-checker.h"
#include "netdev.h"
#include "netlink.h"
+#include "netlink-notifier.h"
#include "netlink-socket.h"
#include "ofpbuf.h"
#include "openvswitch/brcompat-netlink.h"
#include "packets.h"
#include "poll-loop.h"
#include "process.h"
-#include "rtnetlink.h"
#include "rtnetlink-link.h"
#include "signals.h"
#include "sset.h"
}
static char *
-linux_bridge_to_ovs_bridge(const char *linux_name)
+linux_bridge_to_ovs_bridge(const char *linux_name, int *br_vlanp)
{
char *save_ptr = NULL;
- const char *br_name;
+ const char *br_name, *br_vlan;
char *br_name_copy;
char *output;
- output = capture_vsctl(vsctl_program, VSCTL_OPTIONS, "br-to-parent",
- linux_name, (char *) NULL);
+ output = capture_vsctl(vsctl_program, VSCTL_OPTIONS,
+ "--", "br-to-parent", linux_name,
+ "--", "br-to-vlan", linux_name,
+ (char *) NULL);
if (!output) {
return NULL;
}
br_name = strtok_r(output, " \t\r\n", &save_ptr);
- if (!br_name) {
+ br_vlan = strtok_r(NULL, " \t\r\n", &save_ptr);
+ if (!br_name || !br_vlan) {
free(output);
return NULL;
}
br_name_copy = xstrdup(br_name);
+ *br_vlanp = atoi(br_vlan);
free(output);
}
/* Figure out vswitchd bridge and VLAN. */
- br_name = linux_bridge_to_ovs_bridge(linux_name);
+ br_name = linux_bridge_to_ovs_bridge(linux_name, &br_vlan);
if (!br_name) {
error = EINVAL;
send_simple_reply(seq, error);
struct mac *mac = &local_macs[n_local_macs];
struct netdev *netdev;
- error = netdev_open_default(iface_name, &netdev);
+ error = netdev_open(iface_name, "system", &netdev);
if (!error) {
if (!netdev_get_etheraddr(netdev, mac->addr)) {
n_local_macs++;
* (XenServer Tools 5.5.0 does not exhibit this behavior, and neither does
* a VM without Tools installed at all.)
*/
- rtnetlink_link_notifier_run();
+ rtnetlink_link_run();
switch (genlmsghdr->cmd) {
case BRC_GENL_C_DP_ADD:
port_name, br_name);
run_vsctl(vsctl_program, VSCTL_OPTIONS,
- "--", "--if-exists", "del-port", br_name, port_name,
+ "--", "--if-exists", "del-port", port_name,
"--", "comment", "ovs-brcompatd:", port_name, "disappeared",
(char *) NULL);
}
main(int argc, char *argv[])
{
extern struct vlog_module VLM_reconnect;
- struct rtnetlink_notifier link_notifier;
+ struct nln_notifier *link_notifier;
struct unixctl_server *unixctl;
int retval;
"\"brcompat\" kernel module.");
}
-
- rtnetlink_link_notifier_register(&link_notifier, netdev_changed_cb, NULL);
+ link_notifier = rtnetlink_link_notifier_create(netdev_changed_cb, NULL);
daemonize_complete();
for (;;) {
unixctl_server_run(unixctl);
- rtnetlink_link_notifier_run();
+ rtnetlink_link_run();
brc_recv_update();
netdev_run();
nl_sock_wait(brc_sock, POLLIN);
unixctl_server_wait(unixctl);
- rtnetlink_link_notifier_wait();
+ rtnetlink_link_wait();
netdev_wait();
poll_block();
}
- rtnetlink_link_notifier_unregister(&link_notifier);
+ rtnetlink_link_notifier_destroy(link_notifier);
return 0;
}
}
switch (c) {
- case 'H':
case 'h':
usage();
case 'V':
- OVS_PRINT_VERSION(0, 0);
+ ovs_print_version(0, 0);
exit(EXIT_SUCCESS);
case OPT_APPCTL: