第二章 关键数据结构
来源:互联网 发布:郑州 java 编辑:程序博客网 时间:2024/06/06 02:18
一、网络代码常见数据结构
struct sk_buffstruct net_device
struct sock(本文不涉及)
二、 套接字缓冲区:sk_buff结构
涉及文件:src/net/core/dev.c、src/include/linux/skbuff.h
任何一个网络封包都会存储在这里。各个网络分层都会使用这个结构来储存其报头、有关用户数据的信息等。这个是linux网络代码中最重要的数据结构,代表已经接收或者正在传输的数据结构。结构体数据字段大致分为:
Layout(布局字段,主要是维护链表和维护skb_buff数据)General(通用字段)
Feature-specific(功能专用字段)
Management functions(管理函数)
sk_buff结构体具体内容(linux3.0.8)如下:
struct sk_buff {
/* These two members must be first. */
struct sk_buff *next;
struct sk_buff *prev;
ktime_t tstamp;
struct sock *sk;
struct net_device *dev;
/*
* 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[48] __aligned(8);
unsigned long _skb_refdst;
#ifdef CONFIG_XFRM
struct sec_path *sp;
#endif
unsigned int len,
data_len;
__u16 mac_len,
hdr_len;
union {
__wsum csum;
struct {
__u16 csum_start;
__u16 csum_offset;
};
};
__u32 priority;
kmemcheck_bitfield_begin(flags1);
__u8 local_df:1,
cloned:1,
ip_summed:2,
nohdr:1,
nfctinfo:3;
__u8 pkt_type:3,
fclone:2,
ipvs_property:1,
peeked:1,
nf_trace:1;
kmemcheck_bitfield_end(flags1);
__be16 protocol;
void (*destructor)(struct sk_buff *skb);
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
struct nf_conntrack *nfct;
#endif
#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
struct sk_buff *nfct_reasm;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER
struct nf_bridge_info *nf_bridge;
#endif
int skb_iif;
#ifdef CONFIG_NET_SCHED
__u16 tc_index; /* traffic control index */
#ifdef CONFIG_NET_CLS_ACT
__u16 tc_verd; /* traffic control verdict */
#endif
#endif
__u32 rxhash;
__u16 queue_mapping;
kmemcheck_bitfield_begin(flags2);
#ifdef CONFIG_IPV6_NDISC_NODETYPE
__u8 ndisc_nodetype:2;
#endif
__u8 ooo_okay:1;
kmemcheck_bitfield_end(flags2);
/* 0/13 bit hole */
#ifdef CONFIG_NET_DMA
dma_cookie_t dma_cookie;
#endif
#ifdef CONFIG_NETWORK_SECMARK
__u32 secmark;
#endif
union {
__u32 mark;
__u32 dropcount;
};
__u16 vlan_tci;
sk_buff_data_t transport_header;
sk_buff_data_t network_header;
sk_buff_data_t mac_header;
/* These elements must be at the end, see alloc_skb() for details. */
sk_buff_data_t tail;
sk_buff_data_t end;
unsigned char *head,
*data;
unsigned int truesize;
atomic_t users;
};
2.1 layout字段
该字段主要是为了方便搜寻以及组织sk_buff数据结构本身。通过一个双向链表来维护sk_buff数据结构,为了迅速找出整个链表头,额外增加了一个sk_buff_head结构(src/include/linux/skbuff.h)。sk_buff与sk_buff_head的关系图如下(摘自深入理解linux网络技术):
1、sk_buff_head结构初始化
(1)网络设备驱动(以stmmac为例)
在stmmac_dvr_probe()函数里初始化一个回收sk_buff队列:skb_queue_head_init(&priv->rx_recycle),priv为网卡私有数据结构:struct stmmac_priv。
(2)网络设备处理(公共)
在net_dev_init函数里进行了两个初始化处理:skb_queue_head_init(&sd->input_pkt_queue)和skb_queue_head_init(&sd->process_queue),sd为每个CPU的网络数据结构softnet_data,因此每个CPU都有sk_buff处理的相应队列。
(3)其他一些字段
struct sock *sk:指向拥有此缓冲区的套接字的sock数据结构。当数据在本地产生或者正由本地进程接受时,就需要这个指针。
unsigned int len:指缓冲区中数据区块的大小,包括主要缓冲区(由head指)的数据以及一些片段的数据。
unsigned int data_len:只计算片段中的数据大小
__u16 mac_len:MAC报头的大小
__u16 hdr_len:head头的大小
2.2 general字段
(1)ktime_t tstamp
时间戳记,通常只对一个已经接收的封包才有意义,表示封包何时被接收,或者有时用于表示封包预定传输的时间。在接受函数netif_rx or netif_receive_skb对该字段进行设置。
(2)struct net_device *dev
此字段描述一个网络设备,其类型net_device。当接收到一个封包时,该字段填充接收该封包的设备;当发送一个封包时,该字段填发送该封包的设备。
(3)unsigned long _skb_refdst
由路由子系统使用,目的地入口
(4)char cb[48] __aligned(8)
这是一个控制缓冲区或者私有数据存储空间,保存每层的控制信息,各个层通过宏来进行访问。
(5)校验和及关联标志
union {
__wsum csum;
struct {
__u16 csum_start;
__u16 csum_offset;
};
};
和ip_summed:2,
(6)位段
kmemcheck_bitfield_begin(flags1);
__u8 local_df:1, //本地可切片标志
cloned:1, //表示该缓冲区为另外一个sk_buff的克隆
ip_summed:2, //驱动程序是否进行校验表示
nohdr:1, //
nfctinfo:3; //netfilter使用
__u8 pkt_type:3, //根据帧的L2目的地址进行类型划分,表示主要数据包的类型:多播,单薄,回环等
fclone:2,
ipvs_property:1,
peeked:1,
nf_trace:1;
kmemcheck_bitfield_end(flags1);
(7)__u32 priority
表示正被传输或转发的封包QOS(服务质量)优先级
(8) __be16 protocol
驱动程序通过该字段识别L3层的协议,通知上层使用哪个处理例程,典型的有IP、IPV6、ARP等。
2.3 功能专用字段
struct nf_conntrack *nfct;
#endif
#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
struct sk_buff *nfct_reasm;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER
struct nf_bridge_info *nf_bridge;
#endif
__u16 tc_index; /* traffic control index */
#ifdef CONFIG_NET_CLS_ACT
__u16 tc_verd; /* traffic control verdict */
#endif
#endif
2.4 相关操作函数
data = kmalloc_node_track_caller(size + sizeof(struct skb_shared_info)
atomic_set(&skb->users, 1);
skb->head = data;
skb->data = data;
skb_reset_tail_pointer(skb);
skb->end = skb->tail + size;
{
skb->data += len;
skb->tail += len;
}
{
unsigned char *tmp = skb_tail_pointer(skb);
SKB_LINEAR_ASSERT(skb);
skb->tail += len;
skb->len += len;
if (unlikely(skb->tail > skb->end))
skb_over_panic(skb, len, __builtin_return_address(0));
return tmp;
}
{
skb->data -= len;
skb->len += len;
if (unlikely(skb->data<skb->head))
skb_under_panic(skb, len, __builtin_return_address(0));
return skb->data;
}
{
skb->len -= len;
BUG_ON(skb->len < skb->data_len);
return skb->data += len;
}
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;
__u8 tx_flags;
struct sk_buff *frag_list;
struct skb_shared_hwtstamps hwtstamps;
/*
* Warning : all fields before dataref are cleared in __alloc_skb()
*/
atomic_t dataref;
/* Intermediate layers must ensure that destructor_arg
* remains valid until skb destructor */
void * destructor_arg;
/* must be last field, see pskb_expand_head() */
skb_frag_t frags[MAX_SKB_FRAGS];
};
三、 网络设kfree_skb备:net_device结构
每种网络设备都用这个数据结构表示,包括软硬件信息。- 第二章 关键数据结构
- 数据结构第二章 算法
- 数据结构第二章理解
- 第二章 简单数据结构
- 数据结构第二章总结
- 数据结构第二章习题
- 《数据结构》 第二章 笔记
- 数据结构第二章
- 数据结构第二章
- 数据结构概述 第二章
- 数据结构:第二章总结
- <<数据结构第二章>>总结
- 数据结构第二章总结
- [数据结构]第二章-表
- 数据结构第二章内容
- 数据结构-----第二章 线性表
- 第二章 数据结构和表达式
- 高级数据结构书籍 第二章
- Jenkins+Ansible+Gitlab自动化部署三剑客
- js学习笔记
- Git常用命令
- QT qwebengineview 崩溃
- ACM-ICPC国际大学生程序设计竞赛亚洲区大连赛区(2016)地区赛——花开花落终有时
- 第二章 关键数据结构
- PHP接口和抽象类
- SQL Server2000数据库错误"置疑"9003(LSN无效)的处理方法
- Spring in action--Part3-Spring in the back end
- 关于jq的360度图片循转插件UIMIX的一些问题
- Android获取Manifest中<meta-data>元素的值
- 解决android开发中设备offline的问题
- java中面向接口编程的好处
- c#数组的交集,差集,并集