2009-07-08 13:19:16 -07:00
|
|
|
/*
|
|
|
|
* Distributed under the terms of the GNU GPL version 2.
|
2010-04-12 15:53:39 -04:00
|
|
|
* Copyright (c) 2007, 2008, 2009, 2010 Nicira Networks.
|
2009-06-15 15:11:30 -07:00
|
|
|
*
|
|
|
|
* Significant portions of this file may be copied from parts of the Linux
|
|
|
|
* kernel, by Linus Torvalds and others.
|
2009-07-08 13:19:16 -07:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* Handle changes to managed devices */
|
|
|
|
|
|
|
|
#include <linux/netdevice.h>
|
|
|
|
|
|
|
|
#include "datapath.h"
|
2010-04-12 15:53:39 -04:00
|
|
|
#include "vport-internal_dev.h"
|
|
|
|
#include "vport-netdev.h"
|
2009-07-08 13:19:16 -07:00
|
|
|
|
|
|
|
static int dp_device_event(struct notifier_block *unused, unsigned long event,
|
|
|
|
void *ptr)
|
|
|
|
{
|
|
|
|
struct net_device *dev = ptr;
|
2010-04-12 15:53:39 -04:00
|
|
|
struct vport *vport;
|
|
|
|
struct dp_port *p;
|
2009-08-05 14:36:21 -07:00
|
|
|
struct datapath *dp;
|
|
|
|
|
2010-04-12 15:53:39 -04:00
|
|
|
if (is_internal_dev(dev))
|
|
|
|
vport = internal_dev_get_vport(dev);
|
2010-07-29 15:59:36 -07:00
|
|
|
else
|
2010-04-12 15:53:39 -04:00
|
|
|
vport = netdev_get_vport(dev);
|
|
|
|
|
2010-07-29 15:59:36 -07:00
|
|
|
if (!vport)
|
|
|
|
return NOTIFY_DONE;
|
2010-04-12 15:53:39 -04:00
|
|
|
|
|
|
|
p = vport_get_dp_port(vport);
|
|
|
|
|
2009-08-05 14:36:21 -07:00
|
|
|
if (!p)
|
|
|
|
return NOTIFY_DONE;
|
|
|
|
dp = p->dp;
|
|
|
|
|
|
|
|
switch (event) {
|
|
|
|
case NETDEV_UNREGISTER:
|
2009-07-08 13:19:16 -07:00
|
|
|
mutex_lock(&dp->mutex);
|
2010-04-12 15:53:39 -04:00
|
|
|
dp_detach_port(p, 1);
|
2009-07-08 13:19:16 -07:00
|
|
|
mutex_unlock(&dp->mutex);
|
2009-08-05 14:36:21 -07:00
|
|
|
break;
|
|
|
|
|
|
|
|
case NETDEV_CHANGENAME:
|
|
|
|
if (p->port_no != ODPP_LOCAL) {
|
|
|
|
mutex_lock(&dp->mutex);
|
|
|
|
dp_sysfs_del_if(p);
|
|
|
|
dp_sysfs_add_if(p);
|
|
|
|
mutex_unlock(&dp->mutex);
|
|
|
|
}
|
|
|
|
break;
|
2010-02-01 16:43:44 -05:00
|
|
|
|
|
|
|
case NETDEV_CHANGEMTU:
|
2010-04-26 18:08:54 -07:00
|
|
|
if (!is_internal_dev(dev))
|
2010-04-12 15:53:39 -04:00
|
|
|
set_internal_devs_mtu(dp);
|
2010-02-01 16:43:44 -05:00
|
|
|
break;
|
2009-07-08 13:19:16 -07:00
|
|
|
}
|
|
|
|
return NOTIFY_DONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct notifier_block dp_device_notifier = {
|
|
|
|
.notifier_call = dp_device_event
|
|
|
|
};
|