Chinaunix首页 | 论坛 | 博客
  • 博客访问: 795038
  • 博文数量: 264
  • 博客积分: 592
  • 博客等级: 中士
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:02
文章分类

全部博文(264)

文章存档

2019年(2)

2018年(1)

2017年(1)

2016年(4)

2015年(14)

2014年(57)

2013年(88)

2012年(97)

分类: LINUX

2014-02-12 15:18:11

转:http://blog.csdn.net/nerdx/article/details/12223295
  1. //桥接子系统以模块的形式提供  
  2. //函数主要任务:  
  3. //  1.转发数据库slab缓存  
  4. //  2.向socket的ioctl添加回调函数  
  5. //  3.在netif_receive_skb中路径上添加回调函数  
  6. //  4.向netdev_chain注册监听块  
  7. 1.1 static int __init br_init(void)  
  8. {  
  9.     //转发数据库初始化  
  10.     br_fdb_init();  
  11.     //桥接子系统中有关netfilter的初始化  
  12.     ...  
  13.   
  14.     //向socket的ioctl注册回调函数,处理对网桥的io命令  
  15.     brioctl_set(br_ioctl_deviceless_stub);  
  16.     //桥接入口skb处理,在netif_recive_skb中被调用  
  17.     br_handle_frame_hook = br_handle_frame;  
  18.   
  19.     //netdev_chain上注册一个监听器  
  20.     register_netdevice_notifier(&br_device_notifier);  
  21.   
  22.     return 0;  
  23. }  
  24.   
  25.   
  26. //监听器  
  27. 1.2 struct notifier_block br_device_notifier = {  
  28.     .notifier_call = br_device_event  
  29. };  
  30. //  桥接子系统处理的网络配置事件:  
  31. //      前提:与事件相关的dev需要是网桥的端口  
  32. //          1.mtu改变,更新网桥设备的mtu  
  33. //          2.mac地址改变,在转发数据库中更新该端口的mac地址,重新计算网桥id  
  34. //          3.载波状态改变,检测到载波,使能端口;载波消失,disable端口  
  35. //          4.设备关闭,disable端口  
  36. //          5.设备开启,enable端口  
  37. //          6.设备注销,从网桥设备中删除该端口  
  38. //        
  39. 1.3 static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr)  
  40. {  
  41.     struct net_device *dev = ptr;  
  42.     struct net_bridge_port *p = dev->br_port;//一个设备如果为网桥的端口,则br_port指向端口控制块  
  43.     struct net_bridge *br;  
  44.     //有事件产生的接口非网桥的接口  
  45.     if (p == NULL)  
  46.         return NOTIFY_DONE;  
  47.     //此端口所属的网桥  
  48.     br = p->br;  
  49.     //获取网桥的锁,并且关软中断,对网桥上所有端口的事件,串行性执行  
  50.     spin_lock_bh(&br->lock);  
  51.     switch (event) {  
  52.     case NETDEV_CHANGEMTU://端口改变了mtu  
  53.         dev_set_mtu(br->dev, br_min_mtu(br));//br->dev指向网桥设备关联的虚拟  
  54.         break;  
  55.   
  56.     case NETDEV_CHANGEADDR://端口改变了mac地址  
  57.         br_fdb_changeaddr(p, dev->dev_addr);//更新转发数据库  
  58.         br_stp_recalculate_bridge_id(br);//由于网桥端口mac地址的改变,通过stp重新计算网桥的id  
  59.         break;  
  60.   
  61.     case NETDEV_CHANGE: //端口状态的改变  
  62.         if (!(br->dev->flags & IFF_UP))//如果网桥处于关闭状态,则忽略此消息  
  63.             break;  
  64.   
  65.         if (netif_carrier_ok(dev)) {//如果端口有了载波信号  
  66.             if (p->state == BR_STATE_DISABLED)//端口之前为关闭状态  
  67.                 br_stp_enable_port(p);//使能端口  
  68.         } else {  
  69.             if (p->state != BR_STATE_DISABLED)//如果端口没有了载波信号  
  70.                 br_stp_disable_port(p);//不使能端口  
  71.         }  
  72.         break;  
  73.   
  74.     case NETDEV_DOWN://端口关闭  
  75.         if (br->dev->flags & IFF_UP)//只有在网桥处于开启状态才处理端口的关闭  
  76.             br_stp_disable_port(p);//不使能端口  
  77.         break;  
  78.   
  79.     case NETDEV_UP://端口开启  
  80.         if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) //端口存在载波信号,并且网桥处于开启状态  
  81.             br_stp_enable_port(p);//使能端口  
  82.         break;  
  83.   
  84.     case NETDEV_UNREGISTER://端口注销  
  85.         spin_unlock_bh(&br->lock);//释放锁,开启软中断  
  86.         br_del_if(br, dev);//删除接口  
  87.         goto done;  
  88.     }   
  89.     spin_unlock_bh(&br->lock);  
  90.   
  91.  done:  
  92.     return NOTIFY_DONE;  
  93. }  
  94.   
  95. //向socket的ioctl注册回调函数,处理io命令  
  96. 2.1 void brioctl_set(int (*hook)(unsigned intvoid __user *))  
  97. {  
  98.     down(&br_ioctl_mutex);  
  99.     br_ioctl_hook = hook;//钩子函数,此钩子函数会在sock_ioctl中被调用  
  100.     up(&br_ioctl_mutex);  
  101. }  

阅读(759) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~