linux 内核协议栈 邻居协议之 ARP 协议处理初始化
前言
上面分析完了通用邻居层的架构以及代码处理,下面分析 ipv4 的邻居协议 arp。对于 linux 邻居协议层,我认为通用邻居层是最重要的实现,arp 协议层的处理,主要是涉及三个方面:
处理 arp 请求、应答,并创建相应的邻居项
发送 arp 请求,并创建相应的邻居项
处理应用层通过 ioctl 创建或者删除邻居项的请求。它们最终都好调用通用邻居层的函数。
1 arp 协议相关数据结构
1.1 arp 协议格式
1.2 arp 数据结构
1.3 arp 操作码
2 arp 协议初始化 arp_init()
使用 neigh_table_init() 初始化 arp 协议对应的邻居表 arp_tbl
为 arp 协议注册协议处理函数 arp_rcv() 对于网络设备驱动处理完的数据,会由函数 netif_receive_skb 继续二、三层协议的处理。对于进入 netif_receive_skb 的数据包,如果桥接数据没有进行处理,则会遍历 ptype_basehash 数组中的每一个 hash 表中的所有已注册的协议处理函数,查找与 skb 数据包相同的协议处理函数,对于 arp 数据包来说,就会通过 deliver_skb,调用到函数 arp_rcv 进行 arp 数据包的处理
向 proc 文件系统中注册 arp 相关的 proc 文件
向 netdev_chain 通知链中注册 arp 的事件通知函数,主要是处理二层地址改变的事件
2.1 邻居表初始化 neigh_table_init()
调用 neigh_table_init_no_netlink() 初始化邻居表项的成员值
将该邻居表添加到邻居表链表 neigh_tables 中
2.1.1 初始化邻居表项成员 neigh_table_init_no_netlink()
设置邻居表的 reachable_time
为该邻居表申请 slab 缓存,用于创建邻居项
为邻居表的邻居项 hash 数组申请缓存
创建一个带有延迟功能的工作队列,用于进行邻居项的垃圾回收
2.2 arp 表初始值 struct neigh_table arp_tbl
这个邻居表项设置了 arp 邻居表项的初始化处理函数的设置函数 arp_constructor;邻居项异步垃圾回收启动相关的阀值设置 gc_thresh1、gc_thresh2、gc_thresh3;一个邻居项发送 arp request 数据包的最大值;重传时间;邻居项状态转换相关的时间间隔值 base_reachable_time、reachable_time、delay_probe_time;arp 协议相关的 hash 函数。
3 arp 协议邻居项的初始化函数 arp_constructor()
该函数用于 arp 协议中,初始化 neighbour 项中与 arp 协议相关的项
设置邻居项的状态
设置邻居项的 ops 指针
设置邻居项的 output 函数指针
Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、大厂面试题、技术教学视频资料共享在里面(包括 C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK 等等.),有需要的可以自行添加哦!~
评论