admin管理员组文章数量:1122852
sk
sk_buff是Linux网络协议栈最重要的数据结构之一,该数据结构贯穿于整个数据包处理的流程。由于协议采用分层结构,上层向下层传递数据时需要增加包头,下层向上层数据时又需要去掉包头。sk_buff中保存了L2,L3,L4层的头指针,这样在层传递时只需要对数据缓冲区改变头部信息,并调整sk_buff中的指针,而不需要拷贝数据,这样大大减少了内存拷贝的需要。struct sk_buff {//介绍
struct sk_buff *next *prev;//双向链表指针
ktime_t tstamp ;//时间撮
struct sock *sk; //对应于传输层,标示属于哪个socket ?
struct net_device *dev; //数据来自或者发送自哪个设备
char cb[48];//控制信息buffer,在每个层都可以用,并且目前为止足够大
int len; 实际总长度
int data_len; 数据的长度 //也许是paged的data
__u16 mac_len; 数据链路层头的长度
__u16 hdr_len; writable header length of cloned skb
sk_buff_data_t transport_header; 传输层头指针
sk_buff_data_t network_header; 网络层头指针
sk_buff_data_t mac_header; 数据链路层头
unsigned char *head; //buffer 头
unsigned char *data; 数据头
sk_buff_data_t tail; 数据结尾
sk_buff_data_t end; buffer 结尾
unsigned int truesize; //bufffer 大小
cloned 是不是cloned
mark 数据包mark
destructor 销毁函数指针
pkt_type : 根据二层头确定的包信息
__be16 protocol : 三层协议 IP ARP 等,用于和全局数组qtype_base中的数据对比,该数组可以通过dev_add_pack()注册.
}
由于该结构将用于各个层,内核提供了一系列的sk_buff的操作函数
skb_put() 减小tailroom,buffer下后扩展
skb_push() 减小headroom,buffer向上扩张
skb_trim() cut buffer到一个长度
skb_pull 从数据头cut一定长度的数据
skb_reserve 增大headroom,减少tailroom,只能用于buffer为空时
skb_headroom headroom的大小
skb_tailroom tailroom的太小
alloc_skb() 分配一个sk_buff结构及buffer区域
kfree_slb() reference 减一,并且free skb和buffer如果不再有引用
dev_alloc_skb() 方便接收数据的sk_buff的分配函数
dev_free_skb()
skb_shinfo() 获得和sk_buff 一块分配的struct skb_shared_info
skb_clone() //复制sk_buff ,但是buffer不变
pskb_copy() //拷贝sk_buff和私有的头部,常用于需要修改sk_buff的头部时
skb_copy() //完全拷贝
skb_queue_head_init()
skb_queue_head()
skb_queue_tail()
skb_dequeue_head()
skb_dequeue_tail()
skb_queue_purge() //list 清空
skb_queue_walk() //遍历list用
本文标签: sk
版权声明:本文标题:sk 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1687865185a150884.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论