还是回到
neigh_resolve_output()
int
neigh_resolve_output(struct sk_buff *skb)
{
struct dst_entry *dst = skb_dst(skb);
struct neighbour *neigh;
int rc = 0;
if (!dst || !(neigh = dst->neighbour)) 异常退出
goto discard;
__skb_pull(skb, skb_network_offset(skb));
if (!neigh_event_send(neigh, skb)) { 判断邻居项是否有可用状态,如果可用,则把数据包发送出去
int err;
struct net_device *dev = neigh->dev;
if (dev->header_ops->cache && !dst->hh) {
write_lock_bh(&neigh->lock);
if (!dst->hh)
neigh_hh_init(neigh, dst, dst->ops->protocol);
err = dev_hard_header(skb, dev, ntohs(skb->protocol),
neigh->ha, NULL, skb->len);
write_unlock_bh(&neigh->lock);
} else {
read_lock_bh(&neigh->lock);
err = dev_hard_header(skb, dev, ntohs(skb->protocol),

本文详细分析了Linux网络协议栈中neigh_resolve_output()函数处理过程,涉及邻居项的状态检查、高速缓存管理和数据包的二层头部构造。重点讲解了hh_cache在提高数据传输效率中的作用,并提供了邻居子系统的主要数据结构组织图。
最低0.47元/天 解锁文章
1212

被折叠的 条评论
为什么被折叠?



