sk_buff整理笔记(四、克隆与复制)

        在第一篇 sk_buff 整理笔记(一、数据结构)中已经对sk_buff的相关结构的常用成员字段进行了详细的分析,这里就不再赘述了。但前面的sk_buff结构成员字段对这篇sk_buff的克隆与拷贝非常重要,尤其是那几幅图,所以如果看此文时有不明白的地方,可以到第一篇中去查找下相关成员字段分析解释。根据前面已经说过sk_buff结构体是有三大块(其实是有四块结构体连接而成的,只是sk_buff数据区和分片结构体连在一起,可以当做一块来讲)结构体连成的。那复制拷贝的时候,这几块结构体复制的呢?首先来简要的说下几个复制拷贝函数对应的数据块拷贝情况。


skb_clone()函数:

        首先要分析的就是单单克隆下sk_buff结构体,对sk_buff结构的数据区、分片结构体skb_shared_info、分片结构体数据区等结果进行共享。此方法通过skb_clone()函数来实现。

skb_clone()函数实现:

struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask)
{
	struct sk_buff *n;

	n = skb + 1;
	if (skb->fclone == SKB_FCLONE_ORIG &&
	    n->fclone == SKB_FCLONE_UNAVAILABLE) {
		atomic_t *fclone_ref = (atomic_t *) (n + 1);
		n->fclone = SKB_FCLONE_CLONE;
		atomic_inc(fclone_ref);
	} else {
		n = kmem_cache_alloc(skbuff_head_cache, gfp_mask);
		if (!n)
			return NULL;

		kmemcheck_annotate_bitfield(n, flags1);
		kmemcheck_annotate_bitfield(n, flags2);
		n->fclone = SKB_FCLONE_UNAVAILABLE;
	}

	return __skb_clone(n, skb);
}

函数关键代码分析:

        第01行代码:struct sk_buff *skb_clone(struct sk_buff *skb,gfp_t gfp_mask);这个函数的第一个参数是将要被克隆的skb结构体(后面用父skb来称),第二个参数是向内核申请分配内存的方式;返回的是新克隆出来的skb结构体(后面称其为子skb);

        第05行代码:n = skb + 1;这个要连续到sk_buff整理笔记(三、内存申请和释放),因为要被克隆的父skb一般在skbuff_fclone_cache缓存池中申请,若申请成功,则返回一对skb内存空间(即是父子skb),且空间为连续的。所以n = skb + 1;表示的是把事先申请好的skb内存空间给将要返回的克隆结构n;

        第06--07行代码:首先判断父skb是否是在skbuff_fclone_cache缓存池上分配的(确保返回了两个skb),然后判断子skb是否被克隆(如果被克隆了,则不能再用了)。

        第08行代码:如果上面(第06和第07行代码)两个条件皆满足,则开始获取skb的引用计数器变量了。在内存申请和释放那篇讲过,在skbuff_fclone_cache缓存池上申请的skb,不仅会返回两个skb空间,而且还会在子skb后增加一个字节,用来存放skb的引用计数器的。这里正是从子skb后面提取出skb的引用计数器。

        第09--10行代码:接着设置子skb的fclone,表明其是子skb,从父skb中克隆而来的;最后是增加skb的引用计数器的值,因为多了一个克隆的skb。这样做的目的是防止系统不知道还有其他克隆的skb也在共享sk_buff

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值