aboutsummaryrefslogtreecommitdiff
path: root/datapath/dp_notify.c
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2010-04-12 15:53:39 -0400
committerJesse Gross <jesse@nicira.com>2010-04-19 09:11:57 -0400
commitf2459fe7d91c4c325dfaa3ed18f56200b63ae27e (patch)
treef1090136b8c9843acbb4c1d987c9480f1d5e7e9c /datapath/dp_notify.c
parent6b8a6c529b2bd8ce03584b132263dca5ac932c1b (diff)
datapath: Add generic virtual port layer.
Currently the datapath directly accesses devices through their Linux functions. Obviously this doesn't work for virtual devices that are not backed by an actual Linux device. This creates a new virtual port layer which handles all interaction with devices. The existing support for Linux devices was then implemented on top of this layer as two device types. It splits out and renames dp_dev to internal_dev. There were several places where datapath devices had to handled in a special manner and this cleans that up by putting all the special casing in a single location.
Diffstat (limited to 'datapath/dp_notify.c')
-rw-r--r--datapath/dp_notify.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/datapath/dp_notify.c b/datapath/dp_notify.c
index 0278988d..4a16a93f 100644
--- a/datapath/dp_notify.c
+++ b/datapath/dp_notify.c
@@ -1,6 +1,6 @@
/*
* Distributed under the terms of the GNU GPL version 2.
- * Copyright (c) 2007, 2008, 2009 Nicira Networks.
+ * Copyright (c) 2007, 2008, 2009, 2010 Nicira Networks.
*
* Significant portions of this file may be copied from parts of the Linux
* kernel, by Linus Torvalds and others.
@@ -11,21 +11,28 @@
#include <linux/netdevice.h>
#include "datapath.h"
-#include "dp_dev.h"
+#include "vport-internal_dev.h"
+#include "vport-netdev.h"
static int dp_device_event(struct notifier_block *unused, unsigned long event,
void *ptr)
{
struct net_device *dev = ptr;
- struct net_bridge_port *p;
+ struct vport *vport;
+ struct dp_port *p;
struct datapath *dp;
- if (is_dp_dev(dev)) {
- struct dp_dev *dp_dev = dp_dev_priv(dev);
- p = dp_dev->dp->ports[dp_dev->port_no];
- } else {
- p = dev->br_port;
+ if (is_internal_dev(dev))
+ vport = internal_dev_get_vport(dev);
+ else {
+ vport = netdev_get_vport(dev);
+
+ if (!vport)
+ return NOTIFY_DONE;
}
+
+ p = vport_get_dp_port(vport);
+
if (!p)
return NOTIFY_DONE;
dp = p->dp;
@@ -33,7 +40,7 @@ static int dp_device_event(struct notifier_block *unused, unsigned long event,
switch (event) {
case NETDEV_UNREGISTER:
mutex_lock(&dp->mutex);
- dp_del_port(p);
+ dp_detach_port(p, 1);
mutex_unlock(&dp->mutex);
break;
@@ -47,9 +54,9 @@ static int dp_device_event(struct notifier_block *unused, unsigned long event,
break;
case NETDEV_CHANGEMTU:
- if (!is_dp_dev(dev)) {
+ if (!is_internal_dev(dev)) {
mutex_lock(&dp->mutex);
- set_dp_devs_mtu(dp, dev);
+ set_internal_devs_mtu(dp);
mutex_unlock(&dp->mutex);
}
break;