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 ...
__u16 network_header;//网络层头部 __u16 mac_header;//链路层头部 /* private: */ __u32 headers_end[0]; /* public: */ /* These elements must be at the end, see alloc_skb() for details. sk_buff_data_t就是unsigned char * */ sk_buff_data_t tail;//指向报文尾巴 sk_buff_data...
{skb->mac_header=skb->data-skb->head;}staticinlinevoidskb_set_mac_header(struct sk_buff*skb,constint offset){skb_reset_mac_header(skb);skb->mac_header+=offset;}#else/* NET_SKBUFF_DATA_USES_OFFSET */不使用相对偏移的情况staticinline unsigned char*skb_transport_header(conststruct sk_buff*...
}staticinlinevoidskb_set_mac_header(structsk_buff *skb,constintoffset) { skb_reset_mac_header(skb); skb->mac_header +=offset; }#else/* NET_SKBUFF_DATA_USES_OFFSET */不使用相对偏移的情况staticinline unsignedchar*skb_transport_header(conststructsk_buff *skb) {returnskb->transport_header; }...
Solutions By company size Enterprises Small and medium teams Startups Nonprofits By use case DevSecOps DevOps CI/CD View all use cases By industry Healthcare Financial services Manufacturing Government View all industries View all solutions Resources Topics AI DevOps Security Software...
*sk_buff的组织形式 *sk_buff对header的处理 *sk_buff对payload的处理 *sk_buff的clone *sk_buff的内存限额机制 当然,由于本人才疏学浅,还有其它一些尚未接触到的地方,以后再做补充吧。 这里遵循内核的习惯叫法:struct sk_buff<=>skb, struct sock<=>sk,struct skb_share_info<=>shinfo ...
sk_buff的操作要想形成一个最终的数据包,即以太帧(不考虑其它的链路层)。要进行以下的操作: 1.分配一个skb结构体 可以看出基本的模式,即“定位/设置”两步骤操作,有点区别的是应用层操作,这是因为应用层的操作一般都是在socket接口之上完成的。但是既然本文讲述的是skb的通用操作,就不再区分这个了。
sk_buff_data_t network_header; //L3 sk_buff_data_t mac_header; //L2 这些指针分别指向报文头部,和2.4版本比较有了变化,不再是联合体,使用更加方便了,Linux给出了很方便的函数直接定位到各层的头部。下图是2.4版本的,只是说明一下。 struct dst_entry dst ...
skb_reset_mac_header(skb); /* 发射 */ dev_queue_xmit(skb); 解封装的过程和封装的过程相反,解封装的过程是协议栈栈帧逐层pop的过程,但是Linux协议栈并没有用栈的术语来定义接口名字,而是使用了push的反义词,即pull来定义的,skb_pull就是核心接口,和skb_push严格相对。我就不再一一画图了。
prev:sk_buff链表中的前一个缓冲区。以上两个变量将sk_buff链接到一个双向链表中。sk:本网络报文所属的sock结构,此值仅在本机发出的报文中有效,从网络收到的报文此值为空。tstamp:报文收到的时间戳。dev:收到此报文的网络设备。transport_header:传输层头部。network_header:网络层头部。mac_header:链接...