skb_copy是一个深拷贝,skb_clone只是一个浅拷贝

1、skb_clone()
Skb_clone()函数只是复制sk_buff结构,并不复制skb的数据缓冲区。Clone后的sk_buff结构与原始的sk_buff指向同一数据缓冲区。原始的和clone后的skb描述符的cloned值都会被置1,clone的skb描述符的users值置1,同时数据缓冲区的引用计数dataref增加1。

特别说明,skb_clone()函数复制的只是skb描述符,而复制后的skb与原始skb指向的是同一数据缓冲区,由于数据缓冲区并未加什么同步锁机制,

因此skb_clone()操作的skb结构的数据缓冲区是不能被修改的。

  1. struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask)

  2. {

  3. struct sk_buff_fclones *fclones = container_of(skb,

  4. struct sk_buff_fclones,

  5. skb1);

  6. struct sk_buff *n;

  7. if (skb_orphan_frags(skb, gfp_mask))

  8. return NULL;

  9. if (skb->fclone == SKB_FCLONE_ORIG &&

  10. refcount_read(&fclones->fclone_ref) == 1) {

  11. n = &fclones->skb2;

  12. refcount_set(&fclones->fclone_ref, 2);

  13. } else {

  14. if (skb_pfmemalloc(skb))

  15. gfp_mask |= __GFP_MEMALLOC;

  16. n = kmem_cache_alloc(skbuff_head_cache, gfp_mask);

  17. if (!n)

  18. return NULL;

  19. n->fclone = SKB_FCLONE_UNAVAILABLE;

  20. }

  21. return __skb_clone(n, skb);

  22. }

2. skb_copy

skb_copy是对skb的数据完整复制

  1. struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)

  2. {

  3. int headerlen = skb_headroom(skb);

  4. unsigned int size = skb_end_offset(skb) + skb->data_len;

  5. struct sk_buff *n = __alloc_skb(size, gfp_mask,

  6. skb_alloc_rx_flag(skb), NUMA_NO_NODE);

  7. if (!n)

  8. return NULL;

  9. /* Set the data pointer */

  10. skb_reserve(n, headerlen);

  11. /* Set the tail pointer and length */

  12. skb_put(n, skb->len);

  13. BUG_ON(skb_copy_bits(skb, -headerlen, n->head, headerlen + skb->len));

  14. skb_copy_header(n, skb);

  15. return n;

  16. }

skb_copy和skb_clone对比相关推荐

  1. skb_clone 与skb_copy

    skb_copy是一个深拷贝,skb_clone只是一个浅拷贝 1.skb_clone() Skb_clone()函数只是复制sk_buff结构,并不复制skb的数据缓冲区.Clone后的sk_buf ...

  2. Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)

    Table of Contents 1.传统linux网络协议栈流程和性能分析 协议栈的主要问题 针对单个数据包级别的资源分配和释放 流量的串行访问 从驱动到用户态的数据拷贝 内核到用户空间的上下文切 ...

  3. 不同编程语言之间的具体实现对比

    不同语言之间的具体实现对比 官网地址:https://programming-idioms.org/ 这个网站的核心存储部分代码是开源的,使用 Go 语言实现.源码地址: https://github ...

  4. 正向最大匹配 和逆向最大匹配对比比较

    正向最大匹配法 &逆向最大匹配法 原理对比 下面介绍的分词算法中最简单的正向最大匹配和反向最大匹配. 这种两种方法都是机械分词方法,它是按照一定的策略将待分析的汉字串与一个"充分大的 ...

  5. JDBC与数据库连接工具对比分析

    JDBC 使用步骤: 注册数据库驱动 通过DriverManager获取数据库连接 通过Connection对象获取Statement对象 使用Statement执行SQL语句 操作ResultSet ...

  6. GeforceRTX系列参数对比

    GeforceRTX系列参数对比

  7. YOLO、SSD、FPN、Mask-RCNN检测模型对比

    YOLO.SSD.FPN.Mask-RCNN检测模型对比 一.YOLO(you only look once) YOLO 属于回归系列的目标检测方法,与滑窗和后续区域划分的检测方法不同,他把检测任务当 ...

  8. RCNN系列、Fast-RCNN、Faster-RCNN、R-FCN检测模型对比

    RCNN系列.Fast-RCNN.Faster-RCNN.R-FCN检测模型对比 一.RCNN 问题一:速度 经典的目标检测算法使用滑动窗法依次判断所有可能的区域.本文则预先提取一系列较可能是物体的候 ...

  9. TCP/UDP对比总结

    在计算机网络中,有三种体系结构划分方式,第一种是OSI七层协议体系结构,由上到下分别是:应用层,表示层,会话层,运输层,网络层,数据链路层,物理层:第二种是TCP/IP四层协议,由上到下分别是:应用层 ...

最新文章

  1. Datawhale组队学习周报(第040周)
  2. Python 刷英语六级段落匹配仅需 3 秒?
  3. UML 类图几种关系的总结
  4. nacos配置ap_Nacos 1.0.0 功能预览
  5. 树和二叉树【数据结构】
  6. DCMTK3.6.0(MD支持库)安装说明-无图版
  7. 华罗庚先生教会我如何学习
  8. VB.NET写的简单图片缩放处理组件源代码,支持添加半透明效果小图标(转)
  9. Notepad++ 的使用(插件)
  10. 【Transfer Learning】泛化到未知域:域泛化 (Domain Generalization) 综述论文
  11. 2021年6月23日,我们毕业啦!!!
  12. js实现table中td单元格合拼并求和
  13. 计算机电子贺卡制作圣诞节,圣诞电子贺卡_圣诞节英文电子贺卡怎么制作
  14. 河北农大计算机专业全国排名,2019河北农业大学现代科技学院专业排名
  15. datetime计算天数
  16. Windows环境下安装RabbitMQ(官方文档中文版)
  17. 微信小程序入门7-微信公众号设置IP白名单
  18. 数字藏品系统开发,APP小程序成品源码搭建开发
  19. Exchange 2013接收连接器以及邮件客户端若干问题介绍
  20. git改变用户名和邮箱

热门文章

  1. 怎么样才能学好数学?
  2. Matlab高斯白噪声信道仿真
  3. zed相机拆机_使用TX2+ZED相机运行ORBSLAM2和LearnVIORB
  4. 蓝牙模块 hc06 linux,HC-06蓝牙模块设置和使用方法
  5. 10步成为一个优秀的Java开发!
  6. 视频直播质量的评测和实现分享---很好视频评测知识
  7. 今年今日==我的生日
  8. JavaEE 企业级分布式高级架构师(六)MySQL学习笔记(6)
  9. 微信小程序 手写签名_小程序手写签名(wepy)
  10. 谷歌浏览器打开index.html原型页面axure_chrome_V0.6.3