diff options
author | Ethan Jackson <ethan@nicira.com> | 2011-08-23 17:20:00 -0700 |
---|---|---|
committer | Ethan Jackson <ethan@nicira.com> | 2011-09-01 17:21:49 -0700 |
commit | f14d80834e73e5e91892e4763e01ccfd3a2d3be2 (patch) | |
tree | edc9ee891bfce5fb0c923939313d38c7ec26648d | |
parent | e408762f5d16370d9308c22f8f9853d911e92a95 (diff) |
datapath: genl_notify() on port disappearances.
Before this patch, if a vport detached itself from the datapath
without interaction from userspace, rtnetlink notifications would
be sent, but genl notifications would not.
Feature #6809.
Signed-off-by: Ethan Jackson <ethan@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
-rw-r--r-- | datapath/datapath.c | 6 | ||||
-rw-r--r-- | datapath/datapath.h | 3 | ||||
-rw-r--r-- | datapath/dp_notify.c | 18 |
3 files changed, 23 insertions, 4 deletions
diff --git a/datapath/datapath.c b/datapath/datapath.c index 0b6e2e53..7c9ec3b2 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -1603,7 +1603,7 @@ static struct genl_family dp_vport_genl_family = { .maxattr = OVS_VPORT_ATTR_MAX }; -static struct genl_multicast_group dp_vport_multicast_group = { +struct genl_multicast_group dp_vport_multicast_group = { .name = OVS_VPORT_MCGROUP }; @@ -1662,8 +1662,8 @@ error: } /* Called with RTNL lock or RCU read lock. */ -static struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 pid, - u32 seq, u8 cmd) +struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 pid, + u32 seq, u8 cmd) { struct sk_buff *skb; int retval; diff --git a/datapath/datapath.h b/datapath/datapath.h index d14f974a..93be155e 100644 --- a/datapath/datapath.h +++ b/datapath/datapath.h @@ -144,6 +144,7 @@ struct dp_upcall_info { }; extern struct notifier_block dp_device_notifier; +extern struct genl_multicast_group dp_vport_multicast_group; extern int (*dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd); void dp_process_received_packet(struct vport *, struct sk_buff *); @@ -154,5 +155,7 @@ void set_internal_devs_mtu(const struct datapath *dp); struct datapath *get_dp(int dp_idx); const char *dp_name(const struct datapath *dp); +struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 pid, u32 seq, + u8 cmd); #endif /* datapath.h */ diff --git a/datapath/dp_notify.c b/datapath/dp_notify.c index 94d671dd..7b3b219a 100644 --- a/datapath/dp_notify.c +++ b/datapath/dp_notify.c @@ -9,6 +9,7 @@ /* Handle changes to managed devices */ #include <linux/netdevice.h> +#include <net/genetlink.h> #include "datapath.h" #include "vport-internal_dev.h" @@ -33,8 +34,23 @@ static int dp_device_event(struct notifier_block *unused, unsigned long event, switch (event) { case NETDEV_UNREGISTER: - if (!is_internal_dev(dev)) + if (!is_internal_dev(dev)) { + struct sk_buff *reply; + dp_detach_port(vport); + reply = ovs_vport_cmd_build_info(vport, 0, 0, + OVS_VPORT_CMD_DEL); + if (IS_ERR(reply)) { + netlink_set_err(INIT_NET_GENL_SOCK, 0, + dp_vport_multicast_group.id, + PTR_ERR(reply)); + break; + } + + genl_notify(reply, dev_net(dev), 0, + dp_vport_multicast_group.id, NULL, + GFP_KERNEL); + } break; case NETDEV_CHANGENAME: |