- 论坛徽章:
- 1
|
本帖最后由 jiufei19 于 2017-03-09 21:52 编辑
内核版本V2.6.23~V4.x
当本机收到一个ARP REQUEST后,将调用arp_process函数进行处理,因此有如下代码片段:
833 if (arp->ar_op == htons(ARPOP_REQUEST) &&
834 ip_route_input(skb, tip, sip, 0, dev) == 0) {
835
836 rt = (struct rtable*)skb->dst;
837 addr_type = rt->rt_type;
838
839 if (addr_type == RTN_LOCAL) {
840 n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
而neigh_event_ns函数定义如下:
1074 struct neighbour *neigh_event_ns(struct neigh_table *tbl,
1075 u8 *lladdr, void *saddr,
1076 struct net_device *dev)
1077 {
1078 struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev,
1079 lladdr || !dev->addr_len);
1080 if (neigh)
1081 neigh_update(neigh, lladdr, NUD_STALE,
1082 NEIGH_UPDATE_F_OVERRIDE);
1083 return neigh;
1084 }
接着再来看看__neigh_lookup函数的实现代码:
323 __neigh_lookup(struct neigh_table *tbl, const void *pkey, struct net_device *dev, int creat)
324 {
325 struct neighbour *n = neigh_lookup(tbl, pkey, dev);
326
327 if (n || !creat)
328 return n;
329
330 n = neigh_create(tbl, pkey, dev);
331 return IS_ERR(n) ? NULL : n;
332 }
假定neigh_lookup始终查找失败,则:
(1)假设lladdr为空,dev->addr_len=0,那么lladdr || !dev->addr_len就为真,于是creat为真,则!creat为假,于是就需要调用neigh_create创建一个邻居对象
(2)假设lladdr为空,dev->addr_len=真,那么lladdr || !dev->addr_len就为假,于是creat为假,则!creat为真,于是就不调用neigh_create创建一个邻居对象
我的疑问就是(1)和(2)这到底是啥逻辑?其中(2)还似乎能理解下,但是(1)就不太好明白了,请大家解惑,谢谢!
|
|