1 /* 根据指定设备的ip配置块,判断地址a,b是否在同一子网 */
2 /*
3 --邻居项要求,在同一子网中的两个设备,
4 至少有一个接口有相同的子网配置,
5 --也就是说对端的in_dev->ifa_list中也能找到一个与当前
6 in_dev->ifa_list中相同的ifa_mask
7 --如果有这样一个ifa_mask使得两个地址与其计算后
8 网络部分相同,则在同一子网
9 */
10 int inet_addr_onlink(struct in_device *in_dev, __be32 a, __be32 b)
11 {
12 rcu_read_lock();
13
14 /* 遍历主地址 */
15 for_primary_ifa(in_dev) {
16 /* a与ifa在同一网段 */
17 if (inet_ifa_match(a, ifa)) {
18 /* b不存在,或者b与ifa在同一网段 */
19 if (!b || inet_ifa_match(b, ifa)) {
20 rcu_read_unlock();
21
22 /* ab在同一子网 */
23 return 1;
24 }
25 }
26 } endfor_ifa(in_dev);
27 rcu_read_unlock();
28 return 0;
29 }