1.什么是邻居子系统?
同属一个子网的主机,及三层概念上的下一跳。
2.邻居子系统框架
2.1 neigh_tables结构
struct neigh_table *next:该链表中除了ARP的arp_tbl,还有IPV6T的nd_tbl。
int family 邻居协议所属的地址族,ARP是AF_INET。
int entry_size arp_tbl初始化为sizeof(neighbour+4)
char *id neighbour结构实例的缓冲池名称。arp为arp_cache。
int gc_interval 垃圾回收时钟
atomic_t entries 邻居项数目
struct neigh_statistics *stats 各类统计数据
struct neighbour **hash_buckets存储邻居项的散列表,可扩容。
2.2 neighbour结构
一个邻居并不代表一个主机,而是一个ip地址。
2.3 neigh_ops结构
solicit用于发送arp请求,neigh_alloc中注册了一个定时器。定时发送
那么问一个问题 neigh_ops中德output与neighbor中的output有什么区别?neighbor中的output会被设置为neigh_ops的output。例如链路可达时就设置为connected_output。
3 邻居项状态机
状态机是邻居子系统的核心。
4 相关函数
4.1 邻居项的创建及初始化
neigh_alloc()
根据邻居项表目判断是否需要垃圾回收
缓冲池中分配邻居项
协议无关的初始化
neigh_create()
neigh_alloc()
三层协议地址和输出设备的赋值
协议相关的初始化。ARP中为constructor()
检查散列表容量,如果不足,扩容。添加到散列表。
4.2 邻居项的查找
便历桶,检验输出设备,比较三层地址。
4.3 发送
慢速发送:
快速发送:
目的路由缓存项缓存了链路层首部。调用neigh_hh_output()。
需要添加硬件首部。
5. ARP
5.1 ARP报文格式
arp是一个三层协议,封装在MAC帧中,协议号0x0806
5.2初始化
arp_init()在inet_init()中调用,初始化邻居表,注册协议,创建proc文件。
5.3邻居项指针表
5.4ARP报文的发送
发送函数是arp_solicit()目的MAC地址缺省为ffffffff
5.5 ARP的处理
图18-2截图

121

被折叠的 条评论
为什么被折叠?



