inet_confirm_addr && confirm_addr_indev

时间:2022-09-30 18:03:42

确认给定参数范围的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. c&num; long转 datetime

    ; DateTime start = , , , , , , DateTimeKind.Utc); DateTime date = start.AddMilliseconds(time).ToLoca ...

  2. jQuery Wookmark Load 瀑布流布局实例演示

    瀑布流布局非常适合大量图片的展示,一改过去裁剪图片尺寸统一的排版,每张图片都能完全展示,并错落有致,让人眼前一亮. 版本: jQuery v1.4.3+ jQuery Wookmark Load v1 ...

  3. JavaScript基础——添加错误处理

    JavaScript编程的一个重要组成部分,是添加错误处理来应对可能会出现的问题.默认情况下,如果因为你的JavaScript中的问题二产生了一个代码异常,那么脚本就会失败并且无法完成加载.这通常不是 ...

  4. js 模块开发之一(模块开发价值)

    首先引用我们的今天的主角 ----<前端模块化开发的价值> 1,前端开发最常见的两个问题 ---命名冲突和文件依赖 2,对于命名冲突的基本解决办法就是学习其他语言的习惯,添加命名空间 va ...

  5. margin&colon;0 auto&semi;不能居中的原因

    原因: 1.没有设置本身元素和父元素的宽度 2.本身元素使用了绝对定位和浮动 2.没声明DOCTYPE

  6. Xamarin&period;Android开发实践(六)

    Xamarin.Android通知详解 一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android ...

  7. 使用Ninject&plus;Moq在单元测试中抽象数据访问层

    一.测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑     二.步骤如下 ...

  8. WIN7建立网络映射磁盘

    建立网络映射磁盘 如果需要经常访问网络中的同一个共享文件夹,则可以将这个共享文件夹直接映射为本地计算机中的一个虚拟驱动器.其具体操作如下. (1)双击桌面上"计算机"图标,打开&q ...

  9. GridView 无数据时,绑定提示

    private void BindData() { DataTable dt = DAO.RunSQLReturnDt(this.getsql()); int dtcount = dt.Rows.Co ...

  10. scrapy常用命令(持续) &vert; Commonly used Scrapy command list &lpar;con&&num;39&semi;t&rpar;

    以下命令都是在CMD中运行,首先把路径定位到项目文件夹 ------------------------------------------------------------------------ ...