br_notify.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Device event handling
  3.  * Linux ethernet bridge
  4.  *
  5.  * Authors:
  6.  * Lennert Buytenhek <buytenh@gnu.org>
  7.  *
  8.  * $Id: br_notify.c,v 1.2 2000/02/21 15:51:34 davem Exp $
  9.  *
  10.  * This program is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU General Public License
  12.  * as published by the Free Software Foundation; either version
  13.  * 2 of the License, or (at your option) any later version.
  14.  */
  15. #include <linux/kernel.h>
  16. #include <linux/if_bridge.h>
  17. #include "br_private.h"
  18. static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr);
  19. struct notifier_block br_device_notifier =
  20. {
  21. br_device_event,
  22. NULL,
  23. 0
  24. };
  25. static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr)
  26. {
  27. struct net_device *dev;
  28. struct net_bridge_port *p;
  29. dev = ptr;
  30. p = dev->br_port;
  31. if (p == NULL)
  32. return NOTIFY_DONE;
  33. switch (event)
  34. {
  35. case NETDEV_CHANGEADDR:
  36. read_lock(&p->br->lock);
  37. br_fdb_changeaddr(p, dev->dev_addr);
  38. br_stp_recalculate_bridge_id(p->br);
  39. read_unlock(&p->br->lock);
  40. break;
  41. case NETDEV_GOING_DOWN:
  42. /* extend the protocol to send some kind of notification? */
  43. break;
  44. case NETDEV_DOWN:
  45. if (p->br->dev.flags & IFF_UP) {
  46. read_lock(&p->br->lock);
  47. br_stp_disable_port(dev->br_port);
  48. read_unlock(&p->br->lock);
  49. }
  50. break;
  51. case NETDEV_UP:
  52. if (p->br->dev.flags & IFF_UP) {
  53. read_lock(&p->br->lock);
  54. br_stp_enable_port(dev->br_port);
  55. read_unlock(&p->br->lock);
  56. }
  57. break;
  58. case NETDEV_UNREGISTER:
  59. br_del_if(dev->br_port->br, dev);
  60. break;
  61. }
  62. return NOTIFY_DONE;
  63. }