skb_copy和skb_clone对比
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结构的数据缓冲区是不能被修改的。
struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask)
{
struct sk_buff_fclones *fclones = container_of(skb,
struct sk_buff_fclones,
skb1);
struct sk_buff *n;
if (skb_orphan_frags(skb, gfp_mask))
return NULL;
if (skb->fclone == SKB_FCLONE_ORIG &&
refcount_read(&fclones->fclone_ref) == 1) {
n = &fclones->skb2;
refcount_set(&fclones->fclone_ref, 2);
} else {
if (skb_pfmemalloc(skb))
gfp_mask |= __GFP_MEMALLOC;
n = kmem_cache_alloc(skbuff_head_cache, gfp_mask);
if (!n)
return NULL;
n->fclone = SKB_FCLONE_UNAVAILABLE;
}
return __skb_clone(n, skb);
}
2. skb_copy
skb_copy是对skb的数据完整复制
struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)
{
int headerlen = skb_headroom(skb);
unsigned int size = skb_end_offset(skb) + skb->data_len;
struct sk_buff *n = __alloc_skb(size, gfp_mask,
skb_alloc_rx_flag(skb), NUMA_NO_NODE);
if (!n)
return NULL;
/* Set the data pointer */
skb_reserve(n, headerlen);
/* Set the tail pointer and length */
skb_put(n, skb->len);
BUG_ON(skb_copy_bits(skb, -headerlen, n->head, headerlen + skb->len));
skb_copy_header(n, skb);
return n;
}
skb_copy和skb_clone对比相关推荐
- skb_clone 与skb_copy
skb_copy是一个深拷贝,skb_clone只是一个浅拷贝 1.skb_clone() Skb_clone()函数只是复制sk_buff结构,并不复制skb的数据缓冲区.Clone后的sk_buf ...
- Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)
Table of Contents 1.传统linux网络协议栈流程和性能分析 协议栈的主要问题 针对单个数据包级别的资源分配和释放 流量的串行访问 从驱动到用户态的数据拷贝 内核到用户空间的上下文切 ...
- 不同编程语言之间的具体实现对比
不同语言之间的具体实现对比 官网地址:https://programming-idioms.org/ 这个网站的核心存储部分代码是开源的,使用 Go 语言实现.源码地址: https://github ...
- 正向最大匹配 和逆向最大匹配对比比较
正向最大匹配法 &逆向最大匹配法 原理对比 下面介绍的分词算法中最简单的正向最大匹配和反向最大匹配. 这种两种方法都是机械分词方法,它是按照一定的策略将待分析的汉字串与一个"充分大的 ...
- JDBC与数据库连接工具对比分析
JDBC 使用步骤: 注册数据库驱动 通过DriverManager获取数据库连接 通过Connection对象获取Statement对象 使用Statement执行SQL语句 操作ResultSet ...
- GeforceRTX系列参数对比
GeforceRTX系列参数对比
- YOLO、SSD、FPN、Mask-RCNN检测模型对比
YOLO.SSD.FPN.Mask-RCNN检测模型对比 一.YOLO(you only look once) YOLO 属于回归系列的目标检测方法,与滑窗和后续区域划分的检测方法不同,他把检测任务当 ...
- RCNN系列、Fast-RCNN、Faster-RCNN、R-FCN检测模型对比
RCNN系列.Fast-RCNN.Faster-RCNN.R-FCN检测模型对比 一.RCNN 问题一:速度 经典的目标检测算法使用滑动窗法依次判断所有可能的区域.本文则预先提取一系列较可能是物体的候 ...
- TCP/UDP对比总结
在计算机网络中,有三种体系结构划分方式,第一种是OSI七层协议体系结构,由上到下分别是:应用层,表示层,会话层,运输层,网络层,数据链路层,物理层:第二种是TCP/IP四层协议,由上到下分别是:应用层 ...
最新文章
- Datawhale组队学习周报(第040周)
- Python 刷英语六级段落匹配仅需 3 秒?
- UML 类图几种关系的总结
- nacos配置ap_Nacos 1.0.0 功能预览
- 树和二叉树【数据结构】
- DCMTK3.6.0(MD支持库)安装说明-无图版
- 华罗庚先生教会我如何学习
- VB.NET写的简单图片缩放处理组件源代码,支持添加半透明效果小图标(转)
- Notepad++ 的使用(插件)
- 【Transfer Learning】泛化到未知域:域泛化 (Domain Generalization) 综述论文
- 2021年6月23日,我们毕业啦!!!
- js实现table中td单元格合拼并求和
- 计算机电子贺卡制作圣诞节,圣诞电子贺卡_圣诞节英文电子贺卡怎么制作
- 河北农大计算机专业全国排名,2019河北农业大学现代科技学院专业排名
- datetime计算天数
- Windows环境下安装RabbitMQ(官方文档中文版)
- 微信小程序入门7-微信公众号设置IP白名单
- 数字藏品系统开发,APP小程序成品源码搭建开发
- Exchange 2013接收连接器以及邮件客户端若干问题介绍
- git改变用户名和邮箱
热门文章
- 怎么样才能学好数学?
- Matlab高斯白噪声信道仿真
- zed相机拆机_使用TX2+ZED相机运行ORBSLAM2和LearnVIORB
- 蓝牙模块 hc06 linux,HC-06蓝牙模块设置和使用方法
- 10步成为一个优秀的Java开发!
- 视频直播质量的评测和实现分享---很好视频评测知识
- 今年今日==我的生日
- JavaEE 企业级分布式高级架构师(六)MySQL学习笔记(6)
- 微信小程序 手写签名_小程序手写签名(wepy)
- 谷歌浏览器打开index.html原型页面axure_chrome_V0.6.3