From f14d80834e73e5e91892e4763e01ccfd3a2d3be2 Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Tue, 23 Aug 2011 17:20:00 -0700 Subject: [PATCH] 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 Acked-by: Jesse Gross --- datapath/datapath.c | 6 +++--- datapath/datapath.h | 3 +++ 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 +#include #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: -- 2.30.2