summaryrefslogtreecommitdiff
path: root/datapath/vport-netdev.c
diff options
context:
space:
mode:
authorJiri Pirko <jiri@resnulli.us>2013-07-30 16:27:31 -0700
committerJesse Gross <jesse@nicira.com>2013-07-30 16:29:48 -0700
commit2b51596fdeba7fbf4caff323dd6af375e7f84596 (patch)
treec49d847053bc9b3da0ae3de4223bd063280e60f4 /datapath/vport-netdev.c
parent015cf2977473aa16fae4a14cddb6fe3d92694b08 (diff)
downloadopenvswitch-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.c20
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();