- 论坛徽章:
- 0
|
本帖最后由 napoleaon 于 2015-10-23 14:09 编辑
是的,skb_put源码版本是对应的。
执行以下代码
printk(KERN_EMERG "skb_over_panic111: len:%d head:%p " "data:%p tail:%p end:%p dev:%s skb_shinfo(skb):%p \n", skb->len, skb->head, skb->data, skb->tail, skb->end, skb->dev ? skb->dev->name : "<NULL>", skb_shinfo(skb));
unsigned char *append_str = skb_put(skb, append_len);
printk(KERN_EMERG "skb_over_panic222: len:%d head:%p " "data:%p tail:%p end:%p dev:%s skb_shinfo(skb):%p \n", skb->len, skb->head, skb->data, skb->tail, skb->end, skb->dev ? skb->dev->name : "<NULL>", skb_shinfo(skb));
skb->tail指针不变,skb->end 指针会发生变化,然后用memcpy拷贝增加的字符串,能够发送出去。
printk(KERN_EMERG "skb_over_panic111: len:%d head:%p " "data:%p tail:%p end:%p dev:%s skb_shinfo(skb):%p \n", skb->len, skb->head, skb->data, skb->tail, skb->end, skb->dev ? skb->dev->name : "<NULL>", skb_shinfo(skb));
unsigned char *append_str = skb_tail_pointer(skb);
SKB_LINEAR_ASSERT(skb);
skb->tail += append_len ;
skb->len += append_len ;
printk(KERN_EMERG "skb_over_panic222: len:%d head:%p " "data:%p tail:%p end:%p dev:%s skb_shinfo(skb):%p \n", skb->len, skb->head, skb->data, skb->tail, skb->end, skb->dev ? skb->dev->name : "<NULL>", skb_shinfo(skb));
skb->tail指针移动,skb->end 指针不发生变化,然后用memcpy拷贝增加的字符串,数据包没有发生变化,没起到作用。
其实在skb_put操作前已经通过skb_tailroom(skb)判断空间是足够的,但skb_put有时候还是会崩溃。
|
|