inet_confirm_addr && confirm_addr_indev
确认给定参数范围的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的更多相关文章
- IP编址
IP地址 /include/linux/inetdevice.h,定义IPV4专用的网络设备相关的结构.宏等 /net/ipv4/devinet.c.支持IPV4特性的设备操作接口 数据组织 net_ ...
随机推荐
- bzoj1390 [CEOI2008] Fence
题意 给出n个白点和m个黑点.现在你需要选择一些白点把黑点圈起来.每有一个黑点不能被选出的白点组成的凸包包含就需要付出111的代价,每选出一个白点就需要付出20的代价.要求最小化代价之和 n,m< ...
- C++解析(13):临时对象与const对象
0.目录 1.临时对象 2.const对象 3.类成员 4.小结 1.临时对象 一个有趣的问题--下面的程序输出什么?为什么? #include <stdio.h> class Test ...
- 【刷题】洛谷 P3808 【模板】AC自动机(简单版)
题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...
- windows 10上利用Microsoft RTF文件(CVE-2017-0199)进行攻击
Microsoft Word下的恶意RTF文件容易被收到攻击,在本文中,我们使用python脚本对Microsoft Word 2013进行oday攻击演示,该脚本会生成恶意的.rtf文件,并提供目标 ...
- linux内核分析第3章&第18章读书笔记
linux内核分析第3章&第18章读书笔记 第三章 进程管理 进程:处于执行期的程序(目标码存放在某种存储介质上) 包含资源:可执行程序代码,打开的文件,挂起的信号,内核内部数据,处理器状态, ...
- Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)
这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...
- bzoj3709: [PA2014]Bohater(贪心)
贪心... 可以回血的按d[i]升序防止死掉 不能回血的按a[i]降序,因为只考虑d我们要扣除的血量是一定的,为了不死显然回血多的放前面更好 #include<iostream> #inc ...
- 使图片水平并垂直居中的一个Hack
淘宝的一个前端面试题:使用纯CSS实现未知尺寸的图片(但高宽都小于200px)在200px的正方形容器中水平和垂直居中. 想起了vertical-align:middle;但是不行,后来才知道还要di ...
- 题解【CF277E Binary Tree on Plane】
Description 给你平面上 \(n\) 个点 \((2 \leq n \leq 400)\),要求用这些点组成一个二叉树(每个节点的儿子节点不超过两个),定义每条边的权值为两个点之间的欧几里得 ...
- jdk的keystore生成
使用jdk路径下的keytool.exe生成 生成证书: 导出证书,此时输入生成证书时设置的密码: