确认给定参数范围的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. 第79天:jQuery事件总结(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 一.合成事件 jQuery有两个合成事件——hove ...

  2. Java开发Excel POI getPhysicalNumberOfCells 与 getLastCellNum的区别

    1.getPhysicalNumberOfCells 与 getLastCellNum的区别 用org.apache.poi的包做excel导入,无意间发明若是excel文件中有空列,空列后面的数据全 ...

  3. P2323 [HNOI2006]公路修建问题

    题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 输入输出样例 输入样例#1: 4 2 5 1 2 6 5 1 3 3 1 2 3 9 4 2 4 6 1 输出样例# ...

  4. 洛谷 P3376 【模板】网络最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  5. 【CodeChef PREFIXOR】Prefix XOR

    https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692 网上搜到的题解: http://blog.csdn. ...

  6. 【BZOJ3028】食物(生成函数)

    [BZOJ3028]食物(生成函数) 题面 一个人要带\(n\)个物品,共有\(8\)种物品,每种的限制分别如下: 偶数个;0/1个;0/1/2个;奇数个; 4的倍数个;0/1/2/3个;0/1个;3 ...

  7. Hbase(一)基础知识

    一.Hbase数据库介绍 1.简介 HBase 是 BigTable 的开源 java 版本.是建立在 HDFS 之上,提供高可靠性.高性能.列存储. 可伸缩.实时读写 NoSQL 的数据库系统. N ...

  8. CF1100E

    i207M给的题 省选前-小题解合集 给定一张有向图,每条边有边权.你可以花费边权的代价反转一条边,使得原图中没有环.最小化反转的边权的最大值. 首先二分,然后考虑判定. 转化为有些边可以翻转,有些边 ...

  9. 【bzoj4571】美味

    Portal -->bzoj4571 Solution emmm持续智力康复.. 虽然说因为统计的是加上\(x\)的跟\(b\)异或的最大值所以可持久化trie用不了了 ​ 但是按位贪心的思想还 ...

  10. Contest Record

    Contest 1135 at HZOI Problem A: 优美的棋发现一个可以证明的规律就是了……忘记给<<运算的左边变量转化为long long类型了,结果挂了20分……以后一定记 ...