
IPv6
redwingz
这个作者很懒,什么都没留下…
-
原创 IPv6转发开关
conf/all/forwarding配置全局的接口间IPv6报文转发,默认值为0,此值的修改将同时修改每个接口的forwarding配置项。接口目录下forwarding配置项对于接口的Host/Router行为,默认值为0,遵循以下主机行为:1)在邻居发现协议的Neighbour Advertisements报文中不设置IsRouter标志;2)如果accept_ra为真(默认值),可发送Router Solicitations报文;3)如果accept_ra为真(默认值),可接收Router2021-03-30 22:37:1430
0
-
原创 optimistic-dad
配置项optimistic_dad用于控制是否执行优化的DAD检查;配置项use_optimistic控制在源地址选择时,可使用optimistic地址,但是其优先级低于Preferred地址。如下函数ipv6_allow_optimistic_dad,命名空间和设备的optimistic_dad配置项有一个为真,就启用此功能。static bool ipv6_allow_optimistic_dad(struct net *net, struct inet6_dev *idev)2021-03-23 22:28:4441
0
-
原创 ipv6设备的删除标记dead
在创建inet6_dev设备结构函数中,在分配了inet6_dev结构内存之后,如果出现邻居参数结构neigh_parms分配失败,或者snmp相关结构分配失败的情况,需要释放inet6_dev结构,直接返回错误。static struct inet6_dev *ipv6_add_dev(struct net_device *dev){ struct inet6_dev *ndev; ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL2021-03-16 23:21:4319
0
-
原创 IPv6地址DAD检测
DAD冲突检测和IPv6地址失效检测使用的都是addrconf_wq队列,其在addrconf_init函数中创建。int __init addrconf_init(void){ struct inet6_dev *idev; ... addrconf_wq = create_workqueue("ipv6_addrconf"); if (!addrconf_wq) { err = -ENOMEM; goto out_nowq;2021-03-13 22:13:2085
0
-
原创 IPv6源地址选择
源地址的选择依据出接口、目的地址、label、参数prefs和地址类型scope等参数来确定,在函数ipv6_dev_get_saddr开始,先行将这些判断参数组织到结构ipv6_saddr_dst中。scores记录每个可选地址的得分,最终分数高的地址选为要使用的源地址。int ipv6_dev_get_saddr(struct net *net, const struct net_device *dst_dev, const struct in6_addr *daddr2021-03-06 21:28:3673
0
-
原创 RS请求报文控制
默认情况下router_solicitations值为-1,不限制RS的发送次数。如果其为正值,表示当发送到此数量的RS报文之后,还未收到响应,则认为当前链路不存在路由器。$ cat /proc/sys/net/ipv6/conf/all/router_solicitations-1$ cat /proc/sys/net/ipv6/conf/default/router_solicitations-1router_solicitation_interval规定RS报文的发送间隔,默认为4秒钟。r2021-03-05 21:19:4198
0
-
原创 接口token设置
如下ip命令所示,可设置接口的token值。# ip token set ::0102:0304 dev ens33 # # ip token list token ::1.2.3.4 dev ens33token :: dev ens34token :: dev ens35内核处理TOKEN添加如下inet6_set_iftoken函数,先检查合法性:对于环回loopback接口,或者不需要邻居地址的接口(设置了IFF_NOA2021-03-04 21:33:3594
0
-
原创 IPv6隐私地址
RFC4941定义了IPv6的Privacy地址扩展,默认情况下,内核没有开启隐私地址,如下PROC文件use_tempaddr值为0。当use_tempaddr值大于0时,开启隐私地址功能。use_tempaddr值为1时,优先使用公开地址。而当use_tempaddr值大于1时,优先使用隐私地址。$ cat /proc/sys/net/ipv6/conf/all/use_tempaddr0$ cat /proc/sys/net/ipv6/conf/default/use_tempaddr0创2021-03-02 21:20:5677
0
-
原创 IPv6地址有效性检测
IPv6地址检测和DAD冲突检测使用的都是addrconf_wq队列,其在addrconf_init函数中创建。int __init addrconf_init(void){ struct inet6_dev *idev; ... addrconf_wq = create_workqueue("ipv6_addrconf"); if (!addrconf_wq) { err = -ENOMEM; goto out_nowq; }2021-02-26 23:23:19207
0
-
原创 IPv6地址自动配置
默认情况下,配置项autoconf都是1,即开启地址自动配置。$ cat /proc/sys/net/ipv6/conf/all/autoconf 1$ cat /proc/sys/net/ipv6/conf/default/autoconf 1$ cat /proc/sys/net/ipv6/conf/ens33/autoconf 1$ cat /proc/sys/net/ipv6/conf/all/accept_ra_pinfo1$ cat /proc/s2021-02-24 23:41:48148
0
-
原创 IPv6使能开关
默认情况下,IPv6是开启状态,即PROC文件disable_ipv6的值为零。$ cat /proc/sys/net/ipv6/conf/all/disable_ipv60$ cat /proc/sys/net/ipv6/conf/default/disable_ipv60$ cat /proc/sys/net/ipv6/conf/ens33/disable_ipv60如下代码所示,默认情况下all和default中的disable_ipv6配置值都为0。static struct ip2021-02-23 22:05:0184
0
-
原创 IPv6地址stable private
对于链路本地地址和自动配置地址,内核支持4种生成方式,默认情况下使用EUI64方式,可通过PROC文件:/proc/sys/net/ipv6/conf/ens33/addr_gen_mode进行修改。enum in6_addr_gen_mode { IN6_ADDR_GEN_MODE_EUI64, IN6_ADDR_GEN_MODE_NONE, IN6_ADDR_GEN_MODE_STABLE_PRIVACY, IN6_ADDR_GEN_MODE_RANDOM,}2021-02-19 22:07:0967
0
-
原创 DAD报文控制
PROC文件accept_dad控制DAD(Duplicate Address Detection)报文的接收,内核中根据目录all和接口(ens33)名称目录下的accept_dad的两个值中的最大值来决定最终的值。accept_dad的取值有以下三个:0 - 关闭DAD1 - 开启DAD2 - 开启DAD,并且,在基于MAC地址的本地链路地址检测到冲突时,关闭IPv6功能。$ cat /proc/sys/net/ipv6/conf/all/accept_dad0$ cat /proc/sys2021-02-09 22:18:24185
0
-
原创 IPv6接口自动配置的地址数量
默认情况下,每个接口最大可自动配置16个地址。如下PROC文件max_addresses中的值,如果设置为0,将不限制地址数量。$ cat /proc/sys/net/ipv6/conf/all/max_addresses 16$ cat /proc/sys/net/ipv6/conf/default/max_addresses16$ cat /proc/sys/net/ipv6/conf/ens33/max_addresses 16ipv6_devconf和ipv6_devconf2021-02-07 22:58:4778
0
-
原创 IPv6设备配置选项
IPv6子系统中的三个全局配置:ipv6_devconf、ipv6_devconf_dflt和ipv6_defaults:static struct ipv6_devconf ipv6_devconf __read_mostly = { .forwarding = 0, .hop_limit = IPV6_DEFAULT_HOPLIMIT, ...}static struct ipv6_devconf ipv6_devconf_dflt __read_mostly2021-02-06 21:49:5270
0
-
原创 命名空间设备地址标识dev_addr_genid
对于IPv4,在初始化时,为命名空间的设备地址标识赋于一个随机值。static __net_init int rt_genid_init(struct net *net){ atomic_set(&net->ipv4.rt_genid, 0); atomic_set(&net->fnhe_genid, 0); atomic_set(&net->ipv4.dev_addr_genid, get_random_int()); retu2021-01-28 22:07:0361
0