- 3
- 0
- 约1.62千字
- 约 2页
- 2023-08-03 发布于湖北
- 举报
DAD 过程指 IPV6 的重复地址检测过程(duplicate address detection),其协议流程定义于 RFC2462。
LINUX 内核中 IPV6 模块下对 DAD 的实现位于/net/ipv6/addrconf.c。
NDP 协议实现了 IPV6 地址的“即插即用性”,即模块启动后,就能通过 DAD 过程为接口获得一个 link-local 的地址。暂时认定内核中 IPV6 模块的起点是函数inet6_init(void),则此处希望搞明白的是,从该起点到 NDP 协议中 NS 消息的发送间的函数调用关系(由 RFC2462 知,DAD 过程生成一个 IPV6 地址后第一件事就是向链路多播含有该地址的 NS 消息)。
1、 Inet6_init 到 addrconf_dad_start
Inet6_init()调用 addrconf_init(),addrconf_init()中调用register_netdevice_notifier (ipv6_dev_notf)注册 notifier。其中,
Static notifier_block ipv6_dev_notf = {
.notifier_call = addrconf_notify,
.priority = 0 }
函数 addrconf_notify(notifier_block *this, unsigned long event, void* data)在事件 NETDEV_UP 和 NETDEV_CHANGE 下,根据不同的网络设备类型
(dev-type)分别调用下列几个函数:
Default: addrconf_dev_config(dev) ARPHRD_SIT: addrconf_sit_config(dev) ARPHRD_TUNNEL6: addrconf_ip6_tnl_config(dev)
这几个函数最终都会调用函数 addrconf_add_linklocal(idev, addr)生成一个link-local 的 v6 地址,并在该函数中调用 addrconf_dad_start(),开始 DAD 过程。其中,addrconf_add_linklocal 只是按照其参数在相应的网络设备上生成一个 link-local 的地址。具体使用的地址是该函数的调用者生成的。
2、 addrconf_dad_start()到 ndisc_send_ns()
addrconf_dad_start()中调用 addrconf_dad_kick()开始重复地址检测。Addrconf_dad_kick 中调用函数 addrconf_mod_timer(ifp, AC_DAD, rand_num) 来启动一个 timer:将 ifp-timer.function 设为函数 addrconf_dad_timer,再调用 add_timer(ifp-timer)生成 timer。
最后,程序在 timer 触发时调用函数 addrconf_dad_timer(),并在该函数中调用 ndisc_send_ns()发送 NS 消息。
由上可知,在内核中通过 notifier 机制处理 NETDEV 事件的方式,配置各种类型的 netdevice;在 netdevice 生成和被修改时,在相应的 config 函数生成一个link-local 地址,并启动 DAD 过程。
另外,addrconf_dad_start 的调用者还有 ipv6_create_tempaddr 和inet6_addr_add 两个函数。其中,前者的调用者为 addrconf_verify、addrconf_dad_stop、addrconf_prefix_rcv;后者根据注释,是用于手动为网络接口配置地址。
您可能关注的文档
最近下载
- 口腔数字化修复技术30课件.pptx VIP
- 《儿童血压测量规范》解读.pptx
- 中卫焦化厂冷凝鼓风工段初步设计.docx VIP
- 《心理学在管理中的应用》课件.ppt VIP
- 2026年黑龙江民族职业学院单招职业技能考试题库完整答案详解.docx VIP
- 第2课《幸福生活是奋斗出来的》教案-2025-2026学年第二学期三年级道德与法治统编版下册.docx
- 2025广东事业单位真题及答案.docx VIP
- 2026青海省公务员考试常识判断专项练习题有完整答案.docx VIP
- 银行保安服务 投标方案(技术方案).doc
- 2026中国藏语系高级佛学院招聘应届高校毕业生6人备考题库及一套参考答案详解.docx VIP
原创力文档

文档评论(0)