请问结构体struct sk_buff,struct iphdr,struct udphdr,struct net_device分别对应vpp中的什么结构体
时间: 2024-03-30 20:40:22 浏览: 19
在vpp中,对应上述结构体的结构体如下:
- struct sk_buff 对应的是 vlib_buffer_t 结构体
- struct iphdr 对应的是 ip4_header_t 结构体
- struct udphdr 对应的是 udp_header_t 结构体
- struct net_device 对应的是 vnet_interface_main_t 结构体
相关问题
struct sk_buff结构体解析
`struct sk_buff` 是 Linux 内核中用来表示网络数据包的数据结构。它是一个很重要的数据结构,因为 Linux 内核中网络协议栈的所有数据包处理都是基于 sk_buff 进行的。
下面是 `struct sk_buff` 结构体的定义:
```c
struct sk_buff {
struct sk_buff *next;
struct sk_buff *prev;
ktime_t tstamp;
struct sock *sk;
struct net_device *dev;
char cb[48];
unsigned int len;
unsigned int data_len;
__u16 mac_len;
__u16 hdr_len;
union {
__u16 all;
struct {
__u16 nfmark : 16;
} nfctmark;
struct {
__u16 pkt_type : 3;
__u16 ignore_df : 1;
__u16 nf_trace : 1;
__u16 ip_summed : 2;
__u16 ooo_okay : 1;
__u16 l4_rxhash : 1;
__u16 sw_hash : 1;
__u16 sw_hash_valid : 1;
__u16 l5_hash_valid : 1;
__u16 l4_hash_valid : 1;
__u16 fclone : 2;
__u16 frag_list : 2;
__u16 rxhash : 1;
__u16 loopback : 1;
__u16 vlan_present : 1;
__u16 vlan_tci : 16;
__u16 inner_protocol : 16;
__u16 inner_transport_header : 16;
} parsed;
} encapsulation;
unsigned char protocol;
unsigned char pkt_type: 3;
unsigned char fclone: 2;
unsigned char ip_summed: 2;
unsigned char ooo_okay: 1;
__u16 vlan_proto;
__u16 vlan_tci;
union {
struct {
__be16 h_vlan_TCI;
__be16 h_vlan_encapsulated_proto;
};
__be32 ipv4;
struct ipv6hdr *ipv6h;
struct arphdr *arph;
struct tcphdr *hth;
struct udphdr *huh;
struct icmphdr *icmph;
} protocol_headers;
union {
struct tcphdr *th;
struct udphdr *uh;
struct icmphdr *icmph;
struct igmphdr *igmph;
struct iphdr *iph;
struct ipv6hdr *ipv6h;
struct arphdr *arph;
struct pppox_hdr *pppoe;
struct snap_header *llc;
struct cfm_pdu_header *cfm_pdu;
struct batadv_unicast_packet *batman_adv;
struct batadv_bcast_packet *batman_adv_bcast;
struct batadv_icmp_packet *batman_adv_icmp;
struct batadv_tvlv_packet *batman_adv_tvlv;
struct batadv_frag_packet *batman_adv_frag;
struct batadv_purge_packet *batman_adv_purge;
struct batadv_gw_packet *batman_adv_gw;
struct batadv_tt_change_packet *batman_adv_tt_change;
struct batadv_mcast_packet *batman_adv_mcast;
struct batadv_frag_list *batman_adv_frag_list;
struct batadv_unicast_4addr_packet *batman_adv_unicast_4addr;
struct batadv_bla_claim *batman_adv_bla_claim;
struct batadv_bla_backbone_gw *batman_adv_bla_backbone_gw;
struct batadv_bla_claim_reply *batman_adv_bla_claim_reply;
struct batadv_bla_claim_confirm *batman_adv_bla_claim_confirm;
struct batadv_bla_claim_ack *batman_adv_bla_claim_ack;
struct batadv_bla_update *batman_adv_bla_update;
struct batadv_bla_claim_broadcast *batman_adv_bla_claim_broadcast;
struct batadv_bla_claim_broadcast_reply *batman_adv_bla_claim_broadcast_reply;
} encapsulated;
char *head;
char *data;
char *tail;
char *end;
unsigned int truesize;
atomic_t users;
};
```
`struct sk_buff` 结构体中的字段含义如下:
- `next` 和 `prev`:`struct sk_buff` 是一个双向链表,这两个字段用于链表操作;
- `tstamp`:时间戳,用于记录数据包的接收或发送时间;
- `sk`:指向网络套接字的指针;
- `dev`:指向网络设备的指针;
- `cb`:可选的控制块,用于保存一些协议栈内部使用的数据;
- `len`:数据包的总长度;
- `data_len`:数据包实际负载的长度;
- `mac_len`:物理层帧头的长度;
- `hdr_len`:网络层协议头的长度;
- `encapsulation`:封装信息,用于保存协议头的解析结果;
- `protocol`:网络协议号;
- `pkt_type`:数据包类型;
- `fclone`:用于指示是否进行数据包复制;
- `ip_summed`:用于指示是否需要计算 IP 校验和;
- `ooo_okay`:用于指示是否允许乱序到达的数据包;
- `vlan_proto` 和 `vlan_tci`:VLAN 标签的协议号和标识符;
- `protocol_headers`:协议头指针的联合体;
- `encapsulated`:封装协议的联合体;
- `head`:指向数据包缓冲区首地址的指针;
- `data`:指向数据包负载首地址的指针;
- `tail`:指向数据包负载末地址的指针;
- `end`:指向数据包缓冲区末地址的指针;
- `truesize`:数据包缓冲区的实际大小;
- `users`:用于记录当前正在使用该数据包的线程数的原子计数器。
struct sk_buff
struct sk_buff是Linux内核中定义的网络数据包缓冲区的结构体。它包含了各种用于存储和操作网络数据包的信息和属性。
struct sk_buff的定义位于`include/linux/skbuff.h`头文件中,其结构如下:
```c
struct sk_buff {
struct sk_buff *next;
struct sk_buff *prev;
struct sk_buff_head *list;
struct sock *sk;
struct net_device *dev;
struct net_device *real_dev;
unsigned char *head;
unsigned char *data;
unsigned char *tail;
unsigned char *end;
unsigned int len;
unsigned int data_len;
unsigned int truesize;
unsigned int csum;
unsigned int ip_summed;
// ...
};
```
下面是一些常用的struct sk_buff成员变量的解释:
- next和prev:用于将多个sk_buff连接成链表,方便管理和处理。
- list:指向所属链表的头部,用于链表操作。
- sk:指向关联的socket结构,用于与网络套接字相关的操作。
- dev:指向接收/发送该数据包的网络设备。
- head、data、tail和end:指针,用于定位数据包的不同部分,如头部、数据、尾部和缓冲区末尾。
- len:数据包的总长度(包括头部和数据)。
- data_len:数据长度,即实际有效数据的长度。
- truesize:sk_buff实际占用的内存大小。
- csum:数据包的校验和。
- ip_summed:用于指示是否进行IP层校验和计算。
除了上述成员变量外,struct sk_buff还包含其他一些用于网络协议处理的字段,如协议类型、标志位等。
通过使用struct sk_buff,Linux内核可以高效地传递、处理和管理网络数据包。它提供了丰富的属性和方法,使得网络协议栈能够对数据包进行灵活的操作和处理。