免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1196 | 回复: 0
打印 上一主题 下一主题

LINUX协议栈之(1):SKB分配 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-14 17:04 |只看该作者 |倒序浏览

1. 关于SKB的分配细节.
LINUX中SKB的分配最终是由函数 : struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,int fclone) 来完成.
SKB可以分为SKB描述符与SKB数据区两个部分,其中描述符必须从CACHE中来分配 : 或者从skbuff_fclone_cache中分配,或者从skbuff_head_cache 中来分配.
如果从分配描述符失败,则直接反悔NULL,表示SKB分配失败.
SKB描述符分配成功后,即可分配数据区.
在具体分配数据区之前首先要对数据区的长度进行ALIGN操作, 通过宏SKB_DATA_ALIGN来重新确定size大小. 然后戏台调用kmalloc函数分配数据区 :
data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
需要注意的是数据区的大小是SIZE的大小加上skb_shared_info结构的大小.
数据区分配成功后,便对SKB描述符进行与此数据区相关的赋值操作 :
    memset(skb, 0, offsetof(struct sk_buff, truesize));
    skb->truesize = size + sizeof(struct sk_buff);
    atomic_set(&skb->users, 1);
    skb->head = data;
    skb->data = data;
    skb->tail = data;
    skb->end  = data + size;
需要主意的是, SKB的truesize的大小并不包含skb_shared_info结构的大小. 另外,skb的end成员指针也就事skb_shared_info结构的起始指针,系统用
一个宏 : skb_shinfo 来完成寻找skb_shared_info结构指针的操作.
最后,系统初始化skb_shared_info结构的成员变量 :
    atomic_set(&(skb_shinfo(skb)->dataref), 1);
    skb_shinfo(skb)->nr_frags  = 0;
    skb_shinfo(skb)->tso_size = 0;
    skb_shinfo(skb)->tso_segs = 0;
    skb_shinfo(skb)->frag_list = NULL;
    skb_shinfo(skb)->ufo_size = 0;
    skb_shinfo(skb)->ip6_frag_id = 0;
最后,返回SKB的指针.
2. SKB的分配时机
SKB的分配时机主要有两种,最常见的一种是在网卡的中断中,有数据包到达的时,系统分配SKB包进行包处理; 第二种情况是主动分配SKB包勇于各种调试或者其他处理环境.
3. SKB的reserve操作
SKB在分配的过程中使用了一个小技巧 : 即在数据区中预留了128个字节大小的空间作为协议头使用, 通过移动SKB的data与tail指针的位置来实现这个功能.
4. SKB的put操作
put操作是SKB中一个非常频繁也是非常重要的操作, 胆识, skb_put()函数其实什么也没做!
它只是根据数据的长度移动了tail指针并改写了skb->len的值,其他的什么都没做,然后就返回了skb->data指针(就是
tail指针在移动之前的位置).
看上去此函数仿佛要拷贝数据到skb的数据区中,其实这事儿是insl这个函数干的,跟skb_put()函数毫不相关,不过它仍然很重要.
5. 中断环境下SKB的分配流程
当数据到达网卡后,会触发网卡的中断,从而进入ISR中,系统会在ISR中计算出此次接收到的数据的字节数 : pkt_len, 然后调用SKB分配函数来分配SKB :
skb = dev_alloc_skb(pkt_len+5);
我们可以看到, 实际上传入的数据区的长度还要比实际接收到的字节数多,这实际上是一种保护机制.
实际上,在dev_alloc_skb函数调用__dev_alloc_skb函数,而__dev_alloc_skb函数又调用alloc_skb函数
时,其数据区的大小又增加了128字节, 这128字节就事前面我们所说的reserve机制预留的header空间.
好了,SKB的分配基本上结束了,但这只是冰山的一角,好戏还在后面呢......
   


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26397/showart_442458.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP