确认给定参数范围的ip地址是否存在;

 /*
* Confirm that local IP address exists using wildcards:
* - net: netns to check, cannot be NULL
* - in_dev: only on this interface, NULL=any interface
* - dst: only in the same subnet as dst, 0=any dst
* - local: address, 0=autoselect the local address
* - scope: maximum allowed scope value for the local address
*/ /*
确认参数中给定的本地地址是否存在
net: net命名空间,不能为空
in_dev: 在此ip控制块上,空表示任何设备上的控制块
dst: 与dst在同一子网,0表示不限制
local: 本地地址,0表示自动选择本地地址
scope: 本地地址最大允许的地址范围
*/ __be32 inet_confirm_addr(struct net *net, struct in_device *in_dev,
__be32 dst, __be32 local, int scope)
{
__be32 addr = ;
struct net_device *dev; /* ip控制块存在,则从该控制块中选择地址 */
if (in_dev)
return confirm_addr_indev(in_dev, dst, local, scope); rcu_read_lock();
/* ip控制块不存在,则遍历所有设备 */
for_each_netdev_rcu(net, dev) {
/* 找到设备中的ip控制块 */
in_dev = __in_dev_get_rcu(dev); /* 如果ip控制块存在 */
if (in_dev) {
/* 从该控制块选择地址 */
addr = confirm_addr_indev(in_dev, dst, local, scope);
/* 找到则结束 */
if (addr)
break;
}
}
rcu_read_unlock(); return addr;
}
 /*
从指定ip控制块中获取参数允许范围内的地址
1. local dst都不在,找一个满足范围的ip
2. local存在,dst不存在,找与local相等的满足范围的ip
3. local不存在,dst存在,找满足范围的与dst在同一子网的ip
4. local dst都存在,找与local相等,并且与dst在同一子网的ip
*/
static __be32 confirm_addr_indev(struct in_device *in_dev, __be32 dst,
__be32 local, int scope)
{
int same = ;
__be32 addr = ; /* 遍历地址列表 */
for_ifa(in_dev) { if (!addr && /* 目标地址为空 */
(local == ifa->ifa_local || !local) && /* 本地地址相等或者参数地址为空 */
ifa->ifa_scope <= scope) { /* 当前地址满足<= 参数地址范围 */
/* 找到目标地址 */
addr = ifa->ifa_local; /* 满足子网要求 */
if (same)
break;
} /* 未判断子网是否相同 */
if (!same) {
/* local dst不要求,或者在同一子网 */
same = (!local || inet_ifa_match(local, ifa)) &&
(!dst || inet_ifa_match(dst, ifa)); /* 满足子网要求且地址存在,则具体判断是哪种情况 */
if (same && addr) { /* local存在或者local和dst都不存在 */
if (local || !dst)
break; /* local不存在,dst存在 */ /* Is the selected addr into dst subnet? */
/* 目标地址与dst在同一子网 */
if (inet_ifa_match(addr, ifa))
break; /* 目标地址与dst不在同一子网 */ /* No, then can we use new local src? */
/* 如果ifa满足范围,则使用这个ifa的地址 */
if (ifa->ifa_scope <= scope) {
addr = ifa->ifa_local;
break;
} /* 查找失败,继续查找 */ /* search for large dst subnet for addr */
same = ;
}
}
} endfor_ifa(in_dev); return same ? addr : ;
}

inet_confirm_addr && confirm_addr_indev的更多相关文章

  1. IP编址

    IP地址 /include/linux/inetdevice.h,定义IPV4专用的网络设备相关的结构.宏等 /net/ipv4/devinet.c.支持IPV4特性的设备操作接口 数据组织 net_ ...

随机推荐

  1. 第97天:CSS3渐变和过渡详解

    一.渐变 渐变是CSS3当中比较丰富多彩的一个特性,通过渐变我们可以实现许多炫丽的效果,有效的减少图片的使用数量,并且具有很强的适应性和可扩展性. 可分为线性渐变.径向渐变 1. 线性渐变 (grad ...

  2. ZOJ3084_S-Nim

    题目的意思是这样的,给定你若干堆石子,每次你可以从任一堆取出某些固定数量的石子,每次取完后必须保证没堆石子的数量不为0,谁无法操作了就算fail. 刚刚开始看题目的时候有点也没有思路,甚至连Sg函数也 ...

  3. elasticsearch 第三篇(安装篇)

    *nux下安装 在*nux下,es官方已提供编译的deb和rpm包,但是需要保证已安装安装Java虚拟环境(目前es1.6和1.7版本均可选择1.8版本java),安装步骤如下:1.下载ES deb/ ...

  4. 【CF700E】Cool Slogans(后缀自动机)

    [CF700E]Cool Slogans(后缀自动机) 题面 洛谷 CodeForces 题解 构建后缀自动机,求出后缀树 现在有个比较明显的\(dp\) 设\(f[i]\)表示从上而下到达当前点能够 ...

  5. 【BZOJ4754】独特的树叶(哈希)

    [BZOJ4754]独特的树叶(哈希) 题面 BZOJ 给定一个\(n\)个节点的树A和一个\(n+1\)个节点的树\(B\) 求\(B\)的一个编号最小的节点,使得删去这个节点后\(A,B\)同构 ...

  6. MSF下ms17_010_psexec模块使用技巧

    0x01 前言 MS17-010 的psexec是针对Microsoft Windows的两款最受欢迎的漏洞进行攻击. CVE-2017-0146(EternalChampion / EternalS ...

  7. 使用expect实现自动登录的脚本

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ######## ...

  8. 解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed

    1. 在Oracle官网(http://www.oracle.com/technetwork/topics/winsoft-085727.html)下载文件: instantclient-basic- ...

  9. Hadoop1.2.1异常No route to host

    Hadoop1.2.1异常Bad connect ack with firstBadLink (No route to host ) 0.说明 Hadoop集群之前运行正常,增加了新节点之后,需要执行 ...

  10. day2-python基础