原因在于,系统设置skb的network_header字段的方式有两种,通过一个宏来识别:NET_SKBUFF_DATA_USES_OFFSET。也就是说,可以通过相对于skb的head指针的偏移来定位协议头的位置,也可以通过绝对地址来定位,具体使用哪一种取决于系统有没有定义NET_SKBUFF_DATA_USES_OFFSET宏,以上的skb->network_header = p明显是通过绝对...
static inline void skb_set_network_header(struct sk_buff *skb, const int offset) { skb->network_header = skb->data + offset; } static inline unsigned char *skb_mac_header(const struct sk_buff *skb) { return skb->mac_header; } static inline int skb_mac_header_was_set(const struct ...
sk_buff_data_t inner_transport_header;// 指向四层帧头结构体指针 sk_buff_data_t inner_network_header;// 指向三层IP头结构体指针 sk_buff_data_t inner_mac_header;// 指向二层mac头的头 sk_buff_data_t transport_header; sk_buff_data_t network_header; sk_buff_data_t mac_header; /* Thes...
原因在于,系统设置skb的network_header字段的方式有两种,通过一个宏来识别:NET_SKBUFF_DATA_USES_OFFSET。也就是说,可以通过相对于skb的head指针的偏移来定位协议头的位置,也可以通过绝对地址来定位,具体使用哪一种取决于系统有没有定义NET_SKBUFF_DATA_USES_OFFSET宏,以上的 skb->network_header = p明显是通过绝对...
2.sk_buff对header的处理 sk_buff结构体中不包含任何的数据(header和payload的集合),数据则放在一片独立的内存中。header和payload都放在这片内存中,所以组织的当然要严谨一些,也就相对复杂一些。对于这个结构,当然以一幅图来描述更好:(下图着重于header部分) ...
* @network_header: Network layer header * @mac_header: Link layer header * @tail: Tail pointer * @end: End pointer * @head: Head of buffer * @data: Data head pointer * @truesize: Buffer size * @users: User count - see {datagram,tcp}.c*/structsk_buff { ...
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; unsignedchar*head, ...
skb_reset_network_header(skb); /* 构造以太头 */ p = skb_push(skb, sizeof(struct ethhdr)); ethhdr = (struct ethhdr*)p; // 填充ethhdr字段,略 skb_reset_mac_header(skb); /* 发射 */ dev_queue_xmit(skb); 解封装的过程和封装的过程相反,解封装的过程是协议栈栈帧逐层pop的过程,但是Linux...
sk_buff_data_t network_header; sk_buff_data_t mac_header; 。。。 }; 上面分别是运输层/网络层/链路层头变量,看看sk_buff_data_t定义: #ifdef NET_SKBUFF_DATA_USES_OFFSET typedef unsigned int sk_buff_data_t; //使用偏移来表示数据头位置 #else...
在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。 而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是paged-data ...