- 论坛徽章:
- 0
|
原帖由 kevert 于 2009-3-29 10:38 发表
大概应该是这样子:
如果没有学习到ARP,那么就会将路由层发过来的报文先存储在该邻居节点的一个缓存队列上,当ARP尝试几次之后没有学到之后,就会认为该邻居不可达,从而设置该邻居的状态为NUD_FAILED,然后邻 ...
谢谢kevert的讲解。
我想最后arp reply没有与arp request对应起来的根本原因在这段代码:
- arp_rcv()-->arp_process()-->__neigh_lookup()-->neigh_lookup()
- struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,
- struct net_device *dev)
- {
- struct neighbour *n;
- int key_len = tbl->key_len;
- u32 hash_val = tbl->hash(pkey, dev) & tbl->hash_mask; /*¼ÆËã³öhashÖµ*/
-
- NEIGH_CACHE_STAT_INC(tbl, lookups);
- read_lock_bh(&tbl->lock);
- for (n = tbl->hash_buckets[hash_val]; n; n = n->next)
- {
- /*从这里可以看出,要匹配到tbl->hash_buckets里的元素,需要pkey和dev同时满足。
- 但由于对arp的处理在bridge之后(可以参看netif_receive_skb()),在tbl->hash_buckets的n->dev
- 是eth0,但接受进来的arp reply的dev却是br0,所以这里无法做到匹配,导致arp_process()中没有运行到
- neigh_update()这个函数里*/
- if (dev == n->dev && !memcmp(n->primary_key, pkey, key_len))
- {
- neigh_hold(n);
- NEIGH_CACHE_STAT_INC(tbl, hits);
- break;
- }
- }
- read_unlock_bh(&tbl->lock);
- return n;
- }
复制代码 |
|