skb->network_header = skb->data - skb->head;} 这个一般是在skb_pull/skb_push后做的,重新复位sk_buf网络头部地址。
skb协议头指针操作函数: 链路层 skb_mac_header(), skb_reset_mac_header(), skb_set_mac_header(); 网络层 skb_network_header(), skb_reset_network_header(), skb_set_network_header(); 传输层 skb_transport_header(), skb_reset_transport_header(), skb_set_transport_header();。
skb_buff的封装skb结构主要成员struct sk_buff { __u16 transport_header;/* 传输层header相对于skb->head的偏移 */ __u16 network_header;/* 网络层header相对于skb→head的偏移 */ … WirelessHuang sk_buff封装和解封装网络数据包的过程详解 一.概述sk_buff结构体是Linux网络协议栈的核心中的核心,几乎...
2.2 原因 因为此时sk_buff的transport_header并没有指向正确的udp头,而是和network_header一同指向了ip头。 三、正确的获取udp头 3.1 通过ip头计算udp头 struct udphdr *udph; udph = (struct udphdr *) ((u8 *) iph + (iph->ihl << 2)); 3.2 先设置transport_header指向正确的udp头,再用udp_hdr()...
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...
在自己的模块发送函数中,需要对skb进行重新构造和别的一些操作。在网上看到一个写的还可以的,粘过来,就不自己写了,估计这个哥们也是看<Understanding Linux Network Internals>翻译或者总结的。 --- 1. 定义 Packet: 通过网卡收发的报文,包括链路层、网络层、传输层的协议...
skb详细解析【转】摘⾃:http://blog.chinaunix.net/uid-30035229-id-4883992.html 在⾃⼰的模块发送函数中,需要对skb进⾏重新构造和别的⼀些操作。在⽹上看到⼀个写的还可以的,粘过来,就不⾃⼰写了,估计这个哥们也是看<Understanding Linux Network Internals>翻译或者总结的。--- 1. ...
26 sk_buff_data_t network_header ; //网络层头部的偏移量 27 sk_buff_data_t mac_header ; //数据链路层头部的偏移量 28 29 char *data ; //socket buffer中数据的起始位置; 30 sk_buff_data_t tail ; //socket buffer中数据的结束位置; ...
操作函数汇总数名功能函数形成参数描述skbqueueempty检查队列是否intskbqueueemptystructskbuffheadlistlist为队列头如果队列为空返回真否则返回假skbget引用缓structskbuffskbgetstructskb为要引用的对套接字缓冲区再skb缓冲区引用一次返回指向缓冲区的指针kfreeskb释放一skbuffvoidkfreeskbstructskbuffskbsk为要释放的缓删除...
Managementfunctions管理函数 这个结构被不同的网络层(MAC或者其他二层链路协议,三层的IP,四层的TCP或UDP 等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。L4向L3传递前会添加 一个L4的头部,同样,L3向L2传递前,会添加一个L3的头部。添加头部比在不同层之 间拷贝数据的效率更高。由于在缓冲区的头部...