网络子系统13_邻居子系统状态机

//	参考深入理解linux网络技术内幕
//	头文件net/neighbour.h

//一个solicitation请求已发出,但是还没有收到应答,在这个状态下,不适用任何硬件地址
#define NUD_INCOMPLETE	0x01

//该邻居是可到达的
#define NUD_REACHABLE	0x02

//缓存中包含此邻居项,但是该地址已有一段时间没有被确认了,上一次确认时间由
//neighbour->confirmed成员指出,当下一次有封包要到达这个邻居时,要启动可到达性确认,
//在该状态下,会使用旧的硬件地址
#define NUD_STALE	0x04

//当发送一个封包到一个邻居,且该邻居相关的缓存处于NUD_STALE时,就进入这个状态,
//NUD_DELAY表示一个时间窗口,如果在这个窗口内,没有收到该邻居的确认,就进入NUD_PROBE状态
#define NUD_DELAY	0x08

////当邻居处于NUD_DELAY并且没有收到可到达性确认时,状态转变为NUD_PROBE,同时开始solicitation处理
#define NUD_PROBE	0x10

//由于solicitation请求失败,将邻居标记为不可达
#define NUD_FAILED	0x20

//标记不要任何协议进行l3到l2的地址映射
#define NUD_NOARP	0x40

//邻居项l2地址静态配置
#define NUD_PERMANENT	0x80

//邻居项刚被创建,还没有状态可用
#define NUD_NONE	0x00

//表示当前状态有定时器在运行
#define NUD_IN_TIMER	(NUD_INCOMPLETE|NUD_REACHABLE|NUD_DELAY|NUD_PROBE)

//表示相信该邻居有一个硬件地址
#define NUD_VALID	(NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)

//表示没有未决的处理要确认
#define NUD_CONNECTED	(NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)
时间: 2024-09-07 03:00:48

网络子系统13_邻居子系统状态机的相关文章

网络子系统14_邻居子系统通用接口

//创建一个新的邻居项 //参考 深入理解linux网络技术内幕 // 1.邻居子系统为具体的邻居协议,提供通用的功能接口 // 2.系统中所有的邻居协议被链接在neigh_tables链表中 // 3.neigh_table代表一个具体的邻居协议 // 4.具体邻居协议在运行时的行为,可以通过struct neigh_parms调节, // neigh_params与设备关联,每个邻居协议neigh_table提供一个默认的neigh_params. //注册一个邻居协议到系统中 // 1.与

网络子系统12_邻居子系统垃圾回收

// 邻居子系统垃圾回收机制: // 1.异步回收机制:通过定时器,定期检测邻居缓存使用的内存阈值 // 2.同步回收机制:无法分配新neighbour实例时,同步回收内存. // 同步,异步回收机制的区别: // 1.同步回收比异步回收更加严格: // 1.1 回收的数量:同步回收遍历每一个bucket: // 异步回收接着上次清理的bucket开始,只清理一个bucket // 1.2 回收的条件:同步回收视没有被引用,非静态配置的邻居项均视为可回收项: // 异步回收见下3.1 // 2.

网络子系统74_邻居子系统结构图

// 1.系统所有邻居协议控制块通过neigh_tables链接在一起. // 2.neigh_table->hash_mask 默认初始化为1,表示每个邻居协议有两个bucket. // 3.net_device->ip_ptr->arp_params调整其上运行的arp协议行为.                                                                    //参考 深入理解linux网络技术内幕

网络子系统15_arp邻居项初始化

// 初始化struct neighbour // 当邻居子系统新创一个neighbour时,邻居子系统调用特定协议的初始化函数,初始化邻居项. // 调用路径:neigh_create->arp_constructor // 函数主要任务: // 1.设置邻居项的地址类型,a,b,c,d // 2.使用与此邻居项关联的接口设备的neigh_param作为该邻居项调整邻居协议的参数. // 3.根据与此邻居项关联的接口设备的信息,初始化邻居项的状态,以及ops // 3.1 驱动没有提供填充l2

网络子系统63_路由子系统处理netlink事件

// 路由子系统netlink控制块 // 在ip_rt_init->devinet_init中注册. 1.1 static struct rtnetlink_link inet_rtnetlink_table[RTM_MAX - RTM_BASE + 1] = { [4] = { .doit = inet_rtm_newaddr, }, [5] = { .doit = inet_rtm_deladdr, }, [6] = { .dumpit = inet_dump_ifaddr, }, [8]

网络子系统62_路由子系统处理设备事件

// 监听设备事件 // 在ip_rt_init->devinet_init中注册 1.1 static struct notifier_block ip_netdev_notifier = { .notifier_call =inetdev_event, }; // 路由子系统对网络设备事件的处理 // 与事件相关的设备需要有inet配置信息 // 函数主要任务: // 1.开启设备,加入多播组,为回环设备配置ip地址 // 2.关闭设备,设备退出多播组 // 3.设备注销,删除该设备的配置信

网络子系统27_桥接子系统初始化

//桥接子系统以模块的形式提供 //函数主要任务: // 1.转发数据库slab缓存 // 2.向socket的ioctl添加回调函数 // 3.在netif_receive_skb中路径上添加回调函数 // 4.向netdev_chain注册监听块 1.1 static int __init br_init(void) { //转发数据库初始化 br_fdb_init(); //桥接子系统中有关netfilter的初始化 ... //向socket的ioctl注册回调函数,处理对网桥的io命令

网络子系统61_路由子系统初始化

// 路由缓存内存量指定办法: // 1.通过启动参数rhash_entries指定hash表bucket个数 // 2.根据物理内存页数确定使用的内存量 // 根据物理页数分配缓存内存: // 1.goal目标内存页数=总页数/(2**(26-PAGE_SHIFT)) // 2.最接近goal内存页数的order,用于从伙伴系统中分配 // 3.rt_hash_mask=order页可容纳的bucket数 // 4.对齐rt_hash_mask到2的幂次 // 5.从伙伴系统中分配order页

网络子系统30_桥接子系统通用接口

// 添加网桥设备 // 参数: // name,需要全局唯一 // 调用路径:socket ioctl->br_add_bridge // 函数主要任务: // 1.创建一个新的网络设备 // 2.初始化网络设备的通用字段以及网桥设备的字段 // 3.向系统注册网络设备 1.1 int br_add_bridge(const char *name) { struct net_device *dev;//net_bridge->dev int ret; dev = new_bridge_dev