日期:2014-05-16  浏览次数:22448 次

skb_copy和skb_clone
我看资料上讲skb_copy会把skb结构和数据都拷贝一份,skb_clone则只是拷贝skb结构。然后又说,只有要修改数据部分的时候,才用skb_copy。

  但我觉得很奇怪,在什么情况下要修改数据呢?我理解的数据部分是skb->data,这一块毫无结构可言。而且每个包都不一样,有什么可修改的?

  除非skb->data一开始指的不是真正的数据部分,而是包含了一部分包头结构。比如刚收到包时,外面是Ethernet层,而此时skb->data指向IP层。

  这个想法对否?请各路大神指教。

------解决方案--------------------
除非skb->data一开始指的不是真正的数据部分,而是包含了一部分包头结构。比如刚收到包时,外面是Ethernet层,而此时skb->data指向IP层。
-------------------------------
你这样更不需要copy了,修改一下头指针就可以了。



skb_copy 就是把data也拷一遍的了,比如你要做vlan支持,要在 ethernet header后面 ip头前面插入一点数据,原有的skb空间又不够了,那你能怎么做呢? 

不过一般也是clone 比较多点,我们之前有一个虚拟网卡,每个包都copy一下数据,很影响性能。一般考虑是不是可以考虑预留头部空间,使用分散-聚集dma来避免吧。



------解决方案--------------------
嗯,你的理解是对的,很多时候的都有需要改数据的,不又不希望保留以前skb,就用copy函数。