X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fvport-netdev.c;h=c15923b2048515339ea6cac36da56ea4f962d2c2;hb=c5cf10598f8c9f4428291e9df3ecd72a05fb1ccf;hp=2a83f730a01f067744a6788b62a2642c0657c7af;hpb=c1f90e07a6733dd4399bbb47ed6d63c6fa07573f;p=sliver-openvswitch.git diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c index 2a83f730a..c15923b20 100644 --- a/datapath/vport-netdev.c +++ b/datapath/vport-netdev.c @@ -84,36 +84,6 @@ static struct sk_buff *netdev_frame_hook(struct net_bridge_port *p, #error #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) || \ - defined HAVE_RHEL_OVS_HOOK -static int netdev_init(void) { return 0; } -static void netdev_exit(void) { } -#else -static int port_count; - -static void netdev_init(void) -{ - port_count++; - if (port_count > 1) - return; - - /* Hook into callback used by the bridge to intercept packets. - * Parasites we are. */ - br_handle_frame_hook = netdev_frame_hook; - - return; -} - -static void netdev_exit(void) -{ - port_count--; - if (port_count > 0) - return; - - br_handle_frame_hook = NULL; -} -#endif - static struct net_device *get_dpdev(struct datapath *dp) { struct vport *local; @@ -166,7 +136,6 @@ static struct vport *netdev_create(const struct vport_parms *parms) netdev_vport->dev->priv_flags |= IFF_OVS_DATAPATH; rtnl_unlock(); - netdev_init(); return vport; error_master_upper_dev_unlink: @@ -190,16 +159,25 @@ static void free_port_rcu(struct rcu_head *rcu) ovs_vport_free(vport_from_priv(netdev_vport)); } -static void netdev_destroy(struct vport *vport) +void ovs_netdev_detach_dev(struct vport *vport) { struct netdev_vport *netdev_vport = netdev_vport_priv(vport); - netdev_exit(); - rtnl_lock(); + ASSERT_RTNL(); netdev_vport->dev->priv_flags &= ~IFF_OVS_DATAPATH; netdev_rx_handler_unregister(netdev_vport->dev); - netdev_upper_dev_unlink(netdev_vport->dev, get_dpdev(vport->dp)); + netdev_upper_dev_unlink(netdev_vport->dev, + netdev_master_upper_dev_get(netdev_vport->dev)); dev_set_promiscuity(netdev_vport->dev, -1); +} + +static void netdev_destroy(struct vport *vport) +{ + struct netdev_vport *netdev_vport = netdev_vport_priv(vport); + + rtnl_lock(); + if (ovs_netdev_get_vport(netdev_vport->dev)) + ovs_netdev_detach_dev(vport); rtnl_unlock(); call_rcu(&netdev_vport->rcu, free_port_rcu);