IPv6重复地址检测过程.docxVIP

  • 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;后者根据注释,是用于手动为网络接口配置地址。

文档评论(0)

1亿VIP精品文档

相关文档