linux net
时间:2006-08-03 来源:zqy2000zqy
driver recieve 时先 alloc_skb
struct sk_buff *alloc_skb(unsigned int size, int gfp_mask) skb->head = data;
skb->data = data;
skb->tail = data;
skb->end = data + size;
接受数据前 data = skb_put(skb, data_len);
unsigned char *tmp = skb->tail;
SKB_LINEAR_ASSERT(skb);
skb->tail += len;
skb->len += len;
return tmp;
接受到数据包含mac信息,skb->data指向mac头之后应该有什么函数调用了skb_pull , data就指向ip头了 .在eth_type_trans中调用skb_pull
skb->protocol = eth_type_trans(skb, dev);
struct ethhdr *eth;
unsigned char *rawp;
skb->mac.raw=skb->data;
skb_pull(skb,ETH_HLEN);
eth = eth_hdr(skb);
skb->input_dev = dev;
见TCP/IP详解学习-第二章-2 http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=linuxK&Number=440887&page=&view=&sb=&o=
发送后释放 dev_kfree_skb 就是kfree(skb->head)
-------------------<------ head
|---------------|
|--head room---| ^ skb_push
|---------------| |
-------------------<------ data
|---------------| |
|---------------| v skb_pull
|---real data----|
|---------------| ^ skb_trim
|---------------| |
-------------------<------ tail
|---------------| |
|---tail room----| v skb_put
|---------------|
-------------------<------ end