diff options
author | Jesse Gross <jesse@nicira.com> | 2010-04-12 15:53:39 -0400 |
---|---|---|
committer | Jesse Gross <jesse@nicira.com> | 2010-04-19 09:11:57 -0400 |
commit | f2459fe7d91c4c325dfaa3ed18f56200b63ae27e (patch) | |
tree | f1090136b8c9843acbb4c1d987c9480f1d5e7e9c /datapath/dp_notify.c | |
parent | 6b8a6c529b2bd8ce03584b132263dca5ac932c1b (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.c | 29 |
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; |