diff options
author | Jiri Pirko <jiri@resnulli.us> | 2013-07-30 16:27:31 -0700 |
---|---|---|
committer | Jesse Gross <jesse@nicira.com> | 2013-07-30 16:29:48 -0700 |
commit | 2b51596fdeba7fbf4caff323dd6af375e7f84596 (patch) | |
tree | c49d847053bc9b3da0ae3de4223bd063280e60f4 /datapath/vport-netdev.c | |
parent | 015cf2977473aa16fae4a14cddb6fe3d92694b08 (diff) | |
download | openvswitch-2b51596fdeba7fbf4caff323dd6af375e7f84596.tar.gz |
datapath: link upper device for port devices
Link upper device properly. That will make IFLA_MASTER filled up.
Set the master to port 0 of the datapath under which the port belongs.
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Jesse Gross <jesse@nicira.com>
Diffstat (limited to 'datapath/vport-netdev.c')
-rw-r--r-- | datapath/vport-netdev.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c index 06598fa4e..4bc16175c 100644 --- a/datapath/vport-netdev.c +++ b/datapath/vport-netdev.c @@ -25,6 +25,7 @@ #include <linux/llc.h> #include <linux/rtnetlink.h> #include <linux/skbuff.h> +#include <linux/openvswitch.h> #include <net/llc.h> @@ -136,6 +137,15 @@ static void netdev_exit(void) } #endif +static struct net_device *get_dpdev(struct datapath *dp) +{ + struct vport *local; + + local = ovs_vport_ovsl(dp, OVSP_LOCAL); + BUG_ON(!local); + return netdev_vport_priv(local)->dev; +} + static struct vport *netdev_create(const struct vport_parms *parms) { struct vport *vport; @@ -165,10 +175,15 @@ static struct vport *netdev_create(const struct vport_parms *parms) } rtnl_lock(); + err = netdev_master_upper_dev_link(netdev_vport->dev, + get_dpdev(vport->dp)); + if (err) + goto error_unlock; + err = netdev_rx_handler_register(netdev_vport->dev, netdev_frame_hook, vport); if (err) - goto error_unlock; + goto error_master_upper_dev_unlink; dev_set_promiscuity(netdev_vport->dev, 1); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) @@ -180,6 +195,8 @@ static struct vport *netdev_create(const struct vport_parms *parms) netdev_init(); return vport; +error_master_upper_dev_unlink: + netdev_upper_dev_unlink(netdev_vport->dev, get_dpdev(vport->dp)); error_unlock: rtnl_unlock(); error_put: @@ -207,6 +224,7 @@ static void netdev_destroy(struct vport *vport) rtnl_lock(); 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)); dev_set_promiscuity(netdev_vport->dev, -1); rtnl_unlock(); |