NULL); 1193 } (1) int register 您所在的位置:网站首页 struct里面struct NULL); 1193 } (1) int register

NULL); 1193 } (1) int register

#NULL); 1193 } (1) int register| 来源: 网络整理| 查看: 265

当前位置:首页 > Web开发 > 正文 NULL); 1193 } (1) int register_netdevice_notifier(struct no 2020-04-22 Web开发

参考文献:《深入理解linux网络技术内幕》

《精通linux内核网络》

代码内核版本:3.1.68

...............................................................................................

1. 初始化

ip_fib_init()

这个函数看似庞大,其实就主要作两件事:

  1) 把参数struct notifier_block *nb 注册到netdev_chain通知链上去

  2) 系统中所有已经被注册过或激活的网络设备的事件都要被新增的这个通知的回调函数从头挪用一遍,这样让设备更新到一个完整的状态

  在 路由子系统初始化时,系统会挪用ip_fib_init() 函数,ip_fib_init() 中会注册一个回调函数到netdev_chain通知链,这样当另外子系统通知netdev_chain上有特定的事件类型产生时,路由子系统的相应回调 函数就可以作一些反响。

1181 void __init ip_fib_init(void) 1182 { 1183 fib_trie_init(); 1184 1185 register_pernet_subsys(&fib_net_ops); 1186 1187 register_netdevice_notifier(&fib_netdev_notifier); 1188 register_inetaddr_notifier(&fib_inetaddr_notifier); 1189 1190 rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, NULL); 1191 rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, NULL); 1192 rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, NULL); 1193 }  

(1) int register_netdevice_notifier(struct notifier_block *nb)成果: 在内核通知链netdev_chain上注册动静块,用来接收有关网络设备的注册状态等信息nb:动静块,在里面本身添加动静措置惩罚惩罚函数返回值:告成返回0头文件:#include

(2) int unregister_netdevice_notifier(struct notifier_block *nb)成果:与上面register_netdevice_notifier为一对,用于在通知链netdev_chain上删除动静块

(3) int register_inetaddr_notifier(struct notifier_block *nb)成果: 在内核通知链inetaddr_chain上注册动静块,用于接收ip地点的转变等事件nb:动静块,在里面本身添加动静措置惩罚惩罚函数返回值:告成返回0头文件: #include

(4) int unregister_inetaddr_notifier(struct notifier_block *nb)成果:与上面register_inetaddr_notifier为一对,用于在通知链inetaddr_chain上删除动静块

 

 fib_netdev_notifier的界说:

  static struct notifier_block fib_netdev_notifier = {

         .notifier_call =fib_netdev_event,

  };

  fib_netdev_notifier就是一个struct notifier_block,,此中.priority默认初始化为0,.next由注册时设定

 

事件说明  #define NETDEV_UP    0x0001//激活一个网络设备  #define NETDEV_DOWN    0x0002//遏制一个网络设备,所有对该设备的引用都应释放  #define NETDEV_REBOOT    0x0003 //查抄到网络设备接口硬件瓦解,硬件重启  #define NETDEV_CHANGE    0x0004 //网络设备的数据包行列队伍状态产生转变  #define NETDEV_REGISTER 0x0005//一个网络设备事例注册到系统中,但尚未激活  #define NETDEV_UNREGISTER    0x0006//网络设备驱动已卸载  #define NETDEV_CHANGEMTU    0x0007//MTU产生了转变  #define NETDEV_CHANGEADDR    0x0008//硬件地点产生了转变  #define NETDEV_GOING_DOWN    0x0009//网络设备即将注销,有dev->close呈报,通知相关子系统措置惩罚惩罚  #define NETDEV_CHANGENAME    0x000A//网络设备名转变  #define NETDEV_FEAT_CHANGE    0x000B//网络硬件成果转变 

  再来大抵看一下函数fib_netdev_event() :

1046 static int fib_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) 1047 { 1048 struct net_device *dev = netdev_notifier_info_to_dev(ptr); 1049 struct netdev_notifier_info_ext *info_ext = ptr; 1050 struct in_device *in_dev; 1051 struct net *net = dev_net(dev); 1052 1053 if (event == NETDEV_UNREGISTER) { 1054 fib_disable_ip(dev, 2); 1055 rt_flush_dev(dev); 1056 return NOTIFY_DONE; 1057 } 1058 1059 in_dev = __in_dev_get_rtnl(dev); 1060 if (!in_dev) 1061 return NOTIFY_DONE; 1062 1063 switch (event) { 1064 case NETDEV_UP://激活一个网络设备 1065 for_ifa(in_dev) { 1066 fib_add_ifaddr(ifa); 1067 } endfor_ifa(in_dev); 1068 #ifdef CONFIG_IP_ROUTE_MULTIPATH 1069 fib_sync_up(dev); 1070 #endif 1071 atomic_inc(&net->ipv4.dev_addr_genid); 1072 rt_cache_flush(net); 1073 break; 1074 case NETDEV_DOWN://遏制一个网络设备,所有对该设备的引用都应释放 1075 fib_disable_ip(dev, 0); 1076 break; 1077 case NETDEV_CHANGEMTU: 1078 fib_sync_mtu(dev, info_ext->ext.mtu); 1079 rt_cache_flush(net); 1080 break; 1081 case NETDEV_CHANGE: 1082 rt_cache_flush(net); 1083 break; 1084 } 1085 return NOTIFY_DONE; 1086 }

使用举例

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30730.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有