当网卡驱动程序收到一个UDP数据报后,它创建一个结构体struct sk_buff,确保sk_buff->data成员指向的空间足够存放收到的数据(对于数据报分片的情况,因为比较复杂,我们暂时忽略,我们假设 一次收到的是一个完整的UDP数据报)。把收到的数据全部拷贝到sk_buff->data指向的空间,然后,把skb->mac.raw指 向data,此时,...
1. 分配skb 分配sk_buff空间一般是由alloc_skb()函数来完成的,alloc_skb()会分配一个套接字缓区和一个数据缓冲区,其中参数len为数据缓冲区的大小。除此之外还有个dev_alloc_skb()也可以用于skb空间的分配。 分配时:*head, *data, *tail同时指向分配的数据空间的起始地址 *end 指向分配的数据空间的结束地址 ...
sk_buff->cloned一个布尔标记,当被设置时,表示这个结构是另一个sk_buff的克隆 sk_buff->pkt_type这个变量表示帧的类型,分类是由L2的目的地址来决定的。这个值在网卡驱动程序中由函数eth_type_trans通过判断目的以太网地址来确定。如果 目的地址是FF:FF:FF:FF:FF:FF,则为广播地址,pkt_type = PACKET_BROADCAST...
有些sk_buff成员变量的作用是方便查找或者是连接数据结构本身。内核可以把sk_buff组织成一个双向链表。当然,这个链表的结构要比常见的双向链表的结构复杂一点。就像任何一个双向链表一样,sk_buff 中有两个指针next和prev,其中,next指向下一个节点,而prev指向上一个节点。在第一个节点前面会插入另一个结构sk_...
在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。 而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是paged-data ...
struct sk_buff结构体中的pkt_type字段的取值为: 通过struct sk_buff中的pkt_type字段中的值,可以判断出接收到的数据包是不是发送给本机的数据包。 如果pkt_type == PACKET_HOST,说明收到的数据包是发送给本机的单播数据包 如果pkt_type == PACKET_BROADCAST,说明收到的数据包是发送给本机的广播数据包 ...
*sk_buff->h :传输层头 :udp头和tcp头 *sk_buff->nh :网络层头 :ip头 *sk_buff->mac :数据链路层头 :mac头 * * *sk_buff->head :指向数据缓冲区头部 *sk_buff->data :指向实际数据的头部 *sk_buff->tail :指向实际数据的尾部 *sk_buff->end :指向数据缓冲区尾部 ...
struct sk_buff结构体中的pkt_type字段的取值为: 通过struct sk_buff中的pkt_type字段中的值,可以判断出接收到的数据包是不是发送给本机的数据包。 如果pkt_type == PACKET_HOST,说明收到的数据包是发送给本机的单播数据包 如果pkt_type == PACKET_BROADCAST,说明收到的数据包是发送给本机的广播数据包 ...
sk_buff结构详解 struct sk_buff可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息,并包含很多成员变量供网络代码中的各子系统使用。 这个结构被网络的不同层(MAC或者其他二层链路协议,三层的IP,四层的TCP或UDP等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。 L4向L3传递前...
//网络层ip多播地址链接 /* IP multicast filter chain *//* For load balancing driver pair support */unsigned long pkt_queue;//该设备缓存的待发送的数据包个数 /* Packets queued */struct device*slave;//从设备 /* Slave device *//* Pointer to the interface buffers. */struct sk_buff_head ...