SKB结构定义   /usr/src/linux/include/linux/skbuff.h

sk_buff_head:
 struct sk_buff_head {            //SKB的头结点
/* These two members must be first. */
struct sk_buff *next;
struct sk_buff *prev; __u32 qlen; //队列长度
spinlock_t lock; //自旋锁
};
sk_buff:
/**
* struct sk_buff - socket buffer
* @next: Next buffer in list
* @prev: Previous buffer in list
* @sk: Socket we are owned by
* @tstamp: Time we arrived
* @dev: Device we arrived on/are leaving by
* @input_dev: Device we arrived on
* @h: Transport layer header
* @nh: Network layer header
* @mac: Link layer header
* @dst: destination entry
* @sp: the security path, used for xfrm
* @cb: Control buffer. Free for use by every layer. Put private vars here
* @len: Length of actual data
* @data_len: Data length
* @mac_len: Length of link layer header
* @csum: Checksum
* @local_df: allow local fragmentation
* @cloned: Head may be cloned (check refcnt to be sure)
* @nohdr: Payload reference only, must not modify header
* @pkt_type: Packet class
* @fclone: skbuff clone status
* @ip_summed: Driver fed us an IP checksum
* @priority: Packet queueing priority
* @users: User count - see {datagram,tcp}.c
* @protocol: Packet protocol from driver
* @truesize: Buffer size
* @head: Head of buffer
* @data: Data head pointer
* @tail: Tail pointer
* @end: End pointer
* @destructor: Destruct function
* @mark: Generic packet mark
* @nfct: Associated connection, if any
* @ipvs_property: skbuff is owned by ipvs
* @nfctinfo: Relationship of this skb to the connection
* @nfct_reasm: netfilter conntrack re-assembly pointer
* @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
* @tc_index: Traffic control index
* @tc_verd: traffic control verdict
* @dma_cookie: a cookie to one of several possible DMA operations
* done by skb DMA functions
* @secmark: security marking
*/ struct sk_buff {
/* These two members must be first. */
struct sk_buff *next;
struct sk_buff *prev; struct sock *sk; //宿主传输控制块,本地发送或本地接收时有效,转发时为空
struct skb_timeval tstamp; //时间戳
struct net_device *dev; //网络设备指针
struct net_device *input_dev; //接收报文的原始网络设备,包为本地生成时为空,用于流量控制 union { //指向四层协议首部,包含的数据结构表示在这一层上可以解析的协议
struct tcphdr *th;
struct udphdr *uh;
struct icmphdr *icmph;
struct igmphdr *igmph;
struct iphdr *ipiph;
struct ipv6hdr *ipv6h;
unsigned char *raw; // 用于初始化
} h; union { //指向三层协议首部
struct iphdr *iph;
struct ipv6hdr *ipv6h;
struct arphdr *arph;
unsigned char *raw;
} nh; union { //指向二层协议首部
unsigned char *raw;
} mac; struct dst_entry *dst; //目的路由缓存
struct sec_path *sp; //IPSec协议用来跟踪传输的信息 /*
* This is the control buffer. It is free to use for every
* layer. Please put your private variables there. If you
* want to keep them across layers you have to do a skb_clone()
* first. This is owned by whoever has the skb queued ATM.
*/
char cb[]; //信息控制块,存储每层自己的私有信息 unsigned int len, //数据部分长度,包含首部长度
data_len, //SG类型和FRAGLIST类型聚合分散I/O存储区中的数据长度
mac_len; //数据链路层首部长度
union {
__wsum csum; //校验状态为CHECKSUM_NONE时,存放所负载数据报的数据部分校验和
__u32 csum_offset; //校验状态为CHECKSUM_PARTIAL时,记录传输层首部中的校验和字段的偏移
};
__u32 priority; //发送或转发数据包QoS类别,
__u8 local_df:, //表示此SKB在本地允许分片
cloned:, //标记所属SKB是否被克隆
ip_summed:, //标记传输层校验和的状态
nohdr:, //标识payload是否被单独引用
nfctinfo:; //被防火墙使用
__u8 pkt_type:, //帧类型
fclone:, //当前克隆状态
ipvs_property:;
__be16 protocol; //链路层协议类型 void (*destructor)(struct sk_buff *skb); //析构函数指针,释放时调用,没有宿主传输控制块时为空
#ifdef CONFIG_NETFILTER
struct nf_conntrack *nfct; //被防火墙使用
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
struct sk_buff *nfct_reasm;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER
struct nf_bridge_info *nf_bridge; //被防火墙使用
#endif
#endif /* CONFIG_NETFILTER */
#ifdef CONFIG_NET_SCHED
__u16 tc_index; /* traffic control index 流量控制*/
#ifdef CONFIG_NET_CLS_ACT
__u16 tc_verd; /* traffic control verdict */
#endif
#endif
#ifdef CONFIG_NET_DMA
dma_cookie_t dma_cookie;
#endif
#ifdef CONFIG_NETWORK_SECMARK
__u32 secmark;
#endif __u32 mark; /* These elements must be at the end, see alloc_skb() for details. */
unsigned int truesize; //缓存区总长度
atomic_t users; //引用计数,标识有多少实体引用SKB,为零时释放
unsigned char *head, //指向缓存区头
*data, //指向数据头
*tail, //指向数据尾
*end; //指向缓存区尾
};
skb_shared_info:
 struct skb_shared_info {                  //保存数据块的附加信息
atomic_t dataref; //引用计数器
unsigned short nr_frags;
unsigned short gso_size;
/* Warning: this field is not always filled in (UFO)! */
unsigned short gso_segs;
unsigned short gso_type;
__be32 ip6_frag_id;
struct sk_buff *frag_list;
skb_frag_t frags[MAX_SKB_FRAGS];
};

Linux skbuff注释笔记的更多相关文章

  1. Linux实战教学笔记04:Linux命令基础

    第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...

  2. Linux实战教学笔记09:通配符

    第九节 通配符 标签(空格分隔): Linux实战教学笔记 ---更多详细资料请点我查看 第1章 回顾特殊符号 | #管道符,或者(正则) > #输出重定向 >> #输出追加重定向 ...

  3. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  4. Linux实战教学笔记14:用户管理初级(下)

    第十四节 用户管理初级(下) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,用户查询相关命令id,finger,users,w,who,last,lastlog,gr ...

  5. Linux实战教学笔记17:精简shell基础

    第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...

  6. Linux实战教学笔记13:定时任务补充

    第十三节 定时任务补充 标签(空格分隔): Linux实战教学笔记 ---[更多资料点我查看][1] 1,生产环境常用Crontab专业实例 1.1书写crontab定时任务多个基本要领 1.1.1 ...

  7. Linux实战教学笔记22:企业级NFS网络文件共享服务

    目录 第二十二节 企业级NFS网络文件共享服务 第一章 NFS网络文件共享服务 1.1 NFS介绍 1.2 NFS系统原理介绍 1.3 NFS服务端部署环境准备 1.4 NFS server端的设置 ...

  8. Linux实战教学笔记24:SSH连接原理及ssh-key

    目录 第二十四节 SSH连接原理及ssh-key讲解 第1章 SSH服务 1.1 ssh介绍 1.2 知识小结 第2章 ssh结构 2.1 SSH加密技术 第3章 ssh服务认证类型 3.1 基于口令 ...

  9. Linux实战教学笔记14:用户管理初级(上)

    第十四节 用户管理初级(上) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,账号管理 1.1 管理用户命令汇总 命令 注释说明(特殊颜色的必须掌握) useradd增 ...

随机推荐

  1. 集体智慧编程-discovering groups

    这一章讲的是利用聚集算法对blog进行分类. 首先是构造数据,找到一组blog,每个blog包含一组单词.这样就形成了(blog-name, word*)*的数据结构. 在构造该数据结构的过程中,还需 ...

  2. 微软发布TFS 2018!

    也许你还没来得及使用TFS 2017,今天,微软已经发布了TFS 2018的第一个版本(RC1). 与之前所有的候选版本一样,这是一个正式上线(微软成称为go-live)的TFS版本.如果你计划采纳T ...

  3. 记录一下将SqlLocalDb数据迁移到Sql Server Express2017的过程!

    当初为了开发方便,使用了SqlLocalDb,然后再测试期产生了很多有用的数据,客户说不能删除了.麻烦 先将数据库文件下载回来,然后安装SSMS,在连接数据库地址那里,填写“(LocalDB)\MSS ...

  4. max渲染通道元素的范例

    renderElementManager = MaxOps.GetCurRenderElementMgr() renderElementManager.Removeallrenderelements( ...

  5. Regularjs是什么

    本文由作者郑海波授权网易云社区发布. 此文摘自regularjs的指南, 目前指南正在全面更新, 把老文档的[接口/语法部分]统一放到了独立的 Reference页面. Regularjs是基于动态模 ...

  6. InnoDB之锁机制

    前两天听了姜老大关于InnoDB中锁的相关培训,刚好也在看这方面的知识,就顺便利用时间把这部分知识做个整理,方便自己理解.主要分为下面几个部分 1. InnoDB同步机制 InnoDB存储引擎有两种同 ...

  7. day 23 面向对象的命名空间与组合

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 1. 静态属性就是直接在类中定义的变量 2.动态属性就是定义在类中的方法. 其 ...

  8. 纯文本-FileOutputStream的解码方式

    1.通过string.getBytes(charsetNane)获得的字节数组,字节数组的编码方式,决定了FileOutStream写出文件的格式 例1:字节数组采用“GBK”编码,write生成的文 ...

  9. 内置装饰器二:@property

    property 装饰器的作用 property 装饰器将方法包装成属性,将私有属性公有化,此属性只能被读取.相当于实现get方法的对象 class People: def __init__(self ...

  10. Get Requests with Json Data && Get Requests with Url Parameters