通知链netdev_chain和inetaddr_chain区别以及使用
2021-04-21 10:26
标签:next 硬件 amp atom ase style jpg 相关 文献 参考文献:《深入理解linux网络技术内幕》 《精通linux内核网络》 代码内核版本:3.1.68 ............................................................................................... 1. 初始化 ip_fib_init() (1) int register_netdevice_notifier(struct notifier_block *nb) (2) int unregister_netdevice_notifier(struct notifier_block *nb) (3) int register_inetaddr_notifier(struct notifier_block *nb) (4) int unregister_inetaddr_notifier(struct notifier_block *nb) 事件说明 使用举例 通知链netdev_chain和inetaddr_chain区别以及使用 标签:next 硬件 amp atom ase style jpg 相关 文献 原文地址:https://www.cnblogs.com/mysky007/p/12251382.html1181 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 }
功能: 在内核通知链netdev_chain上注册消息块,用来接收有关网络设备的注册状态等信息
nb:消息块,在里面自己添加消息处理函数
返回值:成功返回0
头文件:#include
功能:与上面register_netdevice_notifier为一对,用于在通知链netdev_chain上删除消息块
功能: 在内核通知链inetaddr_chain上注册消息块,用于接收ip地址的改变等事件
nb:消息块,在里面自己添加消息处理函数
返回值:成功返回0
头文件: #include
功能:与上面register_inetaddr_notifier为一对,用于在通知链inetaddr_chain上删除消息块
#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//网络硬件功能改变 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 }
1 #include
文章标题:通知链netdev_chain和inetaddr_chain区别以及使用
文章链接:http://soscw.com/index.php/essay/77558.html