【Linux4.1.12源码分析】二层报文发送之报文GSO分段(MAC层)

本文深入探讨Linux4.1.12中二层报文发送的GSO(Generic Segmentation Offload)技术,主要关注报文在MAC层的分段处理。通过对skb_gso_segment函数的分析,揭示了报文在传输过程中的分段逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报文GSO分段的入口函数是skb_gso_segment函数,是在validate_xmit_skb函数中被调用。

1、skb_gso_segment函数

static inline
struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features)
{
	return __skb_gso_segment(skb, features, true);
}
2、__skb_gso_segment函数

struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
				  netdev_features_t features, bool tx_path)
{
	if (unlikely(skb_needs_check(skb, tx_path))) {	// 判断等于 skb->ip_summed != CHECKSUM_PARTIAL
		int err;

		skb_warn_bad_offload(skb);		//打印告警信息,说明GSO报文skb->ip_summed == CHECKSUM_PARTIAL

		err = skb_cow_head(skb, 0);		//如果skb是克隆,则需要重新分配线性区
		if (err < 0)
			return ERR_PTR(err);
	}

	SKB_GSO_CB(skb)->mac_offset = skb_headroom(skb);	//设置mac_offset, 用于skb_segment分段拷贝外层报文
	SKB_GSO_CB(skb)->encap_level = 0;			//encap_level为零,说明是最外层的报文

	skb_reset_mac_header
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值