sk_buff Structure
The structure has changed many times in the history of the kernel,both to add new options and to reorganize existing fields into a cleaner layout.Its fields can be classified roughly into the following categories:
- Layout
- General
- Feature-specific
- Management functions
Layout Fields
Interesting fields of sk_buff:
- struct sock *sk:This is a pointer to a sock data structure of the socket that owns this buffer.
- unsigned int len:This is the size of the block of data in the buffer.This length include both the data in the main buffer and the data in the fragments.
- unsigned int data_len:Unlike len,data_len accounts only for the size of the data in the fragments.
- unsigned int mac_len:This is the size of the MAC header
- atomic_t users:This is the reference count.
- unsigned int truesize:This field represent the total size of the buffer,including the sk_buff structure itself.
- unsigned char head,end,data,tail:head and end point to the beginning and end of the space allocated to the buffer,and data and tail point to the beginning and end of the actual data.
General Fields
- struct timeval stamp:This is usually meaningful only for a received packet.It is a timestamp that represents when a packet was received or when one is scheduled for transmission.
- struce net_device * dev:describes a network device.
- struct dst_entry dst:This is used by the routing subsystem.
- char cb[40]:This is a "control buffer",or storage for private information,maintained by each layer for internal use
- unsigned char clone:indicates that this structure is a clone of another sk_buff buffer.
- unsigned char pkt_type:This field classifies the type of frame based on its L2 destination address.
- unsigned short protocol:This is the protocol used at the next-higher layer from the perspective of the device driver at L2.
Feature-Specific Fields
The Linux kernel is modular.allowing you to select what to include and waht to leave out.Thus some fields are included in the sk_buff data structure only if the kernel is compiled with support for particular features such as firewalling or QoS
- struct nf_conntrack *nfct
- struct nf_bridge_info *nf_bridge;
- u8 nfctinfo
u8 nf_trace
These parameters are used by Netfilter
- u16 tc_index
u16 tc_verd
These parameters are used by the Traffic Control
struct sec_path *sp
This is used by the IPsec protocol suite to keep track of transformations
Management Functions
Before and After:(a)skb_put,(b)skb_push,(c)skb_pull,(d)skb_reserve
Allocating memory:alloc_skb and dev_alloc_skb
creating a single buffer involves two allocations of memory(one for the buffer and one for the sk_buff struct)
The skb_shared_info structure and the skb_shinfo function
skb_shared_info at the end of the data buffer that keeps additional information about the data block(Fragment).
Note that there is no field inside sk_buff structure pointing at the skb_shared_info data structure.To access that structure,functions need to use the skb_shinfo macro,which simply returns the end pointer.
List management functions
skb_queue_head_init: initializes an sk_buff_head with an empty queue of elements.
skb_queue_head,skb_queue_tail:Adds one buffer to the head or to the tail of a queue,respectively
skb_dequeue,skb_dequeue_tail:Dequeues an element from the head or from the tail.
skb_queue_purge:Empties a queue.
skb_queue_walk:Runs a loop on each element of a queue in turn.
sk_buff Structure的更多相关文章
- the Linux Kernel: Traffic Control, Shaping and QoS
−Table of Contents Journey to the Center of the Linux Kernel: Traffic Control, Shaping and QoS 1 Int ...
- TCP 接收窗口自动调节
https://technet.microsoft.com/zh-cn/magazine/2007.01.cableguy.aspx 欢迎来到 TechNet 杂志“网络专家”的第一部分.TechNe ...
- 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)
原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...
- Linux 网卡驱动sk_buff内核源码随笔
这几天在调试有关网卡驱动的东西,有很多地方不清楚.有关网卡驱动部分主要有两个很重要的结构体:struct net_device 和struct sk_buff. 驱动大部分都是围绕这两个东西进行操作的 ...
- [LeetCode] All O`one Data Structure 全O(1)的数据结构
Implement a data structure supporting the following operations: Inc(Key) - Inserts a new key with va ...
- [LeetCode] Add and Search Word - Data structure design 添加和查找单词-数据结构设计
Design a data structure that supports the following two operations: void addWord(word) bool search(w ...
- [LeetCode] Two Sum III - Data structure design 两数之和之三 - 数据结构设计
Design and implement a TwoSum class. It should support the following operations:add and find. add - ...
- Theano Graph Structure
Graph Structure Graph Definition theano's symbolic mathematical computation, which is composed of: A ...
- sk_buff封装和解封装网络数据包的过程详解
转自:http://www.2cto.com/os/201502/376226.html 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...
随机推荐
- MyBatis 返回主键
1,用于插入语句 2,传入对象 3,使用下面的属性即可 userGengratedKeys="true" keyProperty="orderId" keyCo ...
- Python-Django Win7上使用Apache24和mod_wsgi部署Django1.11应用程序
Win7上使用Apache24和mod_wsgi部署Django1.11应用程序 by:授客 QQ:1033553122 测试环境 win7 64 Django-1.11.4.tar.gz 下载地址: ...
- 开发新手最容易犯的50个 Ruby on Rails 错误(1)
[编者按]本文最早发布与 JETRuby 博客,主要介绍了开发新手最容易犯的 Ruby 错误.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 一年前,我们创立了以 "Rubyboo ...
- 单用户模式启动SQL Server实例总结
在SQL Server的数据库维护过程中,有时候在一些特殊情况下需要在单用户模式下启动SQL Server实例. 下面总结一下单用户模式启动SQL Server的几种方式: 1:命令模式(sqls ...
- javascript中(function($){...})(jQuery)写法是什么意思
这里实际上是匿名函数function(arg){...}这就定义了一个匿名函数,参数为arg 而调用函数 时,是在函数后面写上括号和实参的,由于操作符的优先级,函数本身也需要用括号,即:(functi ...
- Navicat Premium 连接oracle ORA-01017:用户名/口令无效;登陆被拒绝
解决的方法就是将用户名改成system
- Linux: yum 命令说明
yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性 ...
- JavaScript -- 时光流逝(二):js中数组的方法
JavaScript -- 知识点回顾篇(二):js中数组的方法 1. 数组 (1)定义数组,数组赋值 <script type="text/javascript"> ...
- 2802:小游戏利用bfs来实现
之前使用的是递归的方法来解决的问题,后来有点想用bfs(宽度优先搜索来尝试一下的想法,在网上看到有人使用了dfs(深度优先搜索)更加坚定了自己的这种想法. 这个方法首先是以顶点的四组开始,加入那些没有 ...
- 我为什么要写 blog?
从事软件测试工作10余年,也没在网上留下些什么.最近忙着找工作,年龄上又遇到了瓶颈,发现好多工作岗位需要技术博客,正好趁这个机会,梳理一下自己的知识点,记录下来和大家一起学习探讨,共同进步.欢迎加我微 ...