static inline int ip_finish_output2(struct sk_buff *skb)
{
struct dst_entry *dst = skb->dst;
struct rtable *rt = (struct rtable *)dst;
struct hh_cache *hh = dst->hh;
struct net_device *dev = dst->dev;
int hh_len = LL_RESERVED_SPACE(dev);
if (rt->rt_type == RTN_MULTICAST)
IP_INC_STATS(IPSTATS_MIB_OUTMCASTPKTS);
else if (rt->rt_type == RTN_BROADCAST)
IP_INC_STATS(IPSTATS_MIB_OUTBCASTPKTS);
/* Be paranoid, rather than too clever. */
if (unlikely(skb_headroom(skb) < hh_len && dev->hard_header)) {
struct sk_buff *skb2;
skb2 = skb_realloc_headroom(skb, LL_RESERVED_SPACE(dev));
if (skb2 == NULL) {
kfree_skb(skb);
return -ENOMEM;
}
if (skb->sk)
skb_set_owner_w(skb2, skb->sk);
kfree_skb(skb);
skb = skb2;
}
if (hh) {
kernel ipv4/ip_output.c
最新推荐文章于 2023-12-31 00:53:17 发布
本文详细介绍了 Linux 内核中处理 IPv4 数据包输出的关键函数 `ip_finish_output2`。该函数负责处理多播、广播数据包的计数统计,并根据目标地址类型决定使用缓存头部还是邻居协议进行输出。当没有缓存头部且无邻居协议时,内核会打印调试信息并释放数据包。
摘要由CSDN通过智能技术生成