作者puph (真冷...)
看板C_and_CPP
标题[问题] linux核心封包处理的程式码
时间Sun May 3 21:46:45 2009
以下是ipq的一段程式码
大致的意思是想要在封包资料区块後端多一些空间来使用
第一个if先检查缓冲区尾端的大小够不够
若不够就做用的
之後 用skb_put函式 将指向尾端的指标後移
=========================================
if (diff > skb_tailroom(e->skb)) {
struct sk_buff *newskb;
newskb = skb_copy_expand(e->skb,skb_headroom(e->skb),
diff,GFP_ATOMIC);
if (newskb == NULL) {
printk(KERN_WARNING "ip_queue: OOM in mangle, dropping packet\n");
return -ENOMEM;
}
if (e->skb->sk)
skb_set_owner_w(newskb, e->skb->sk);
kfree_skb(e->skb);
e->skb = newskb;
}
skb_put(e->skb, diff);
==========================================
我目前刚好也想要做这样的动作
我是在封包要离开ip层前 在尾巴新增资料
稍微修改上面的程式码
--------------
if (len > skb_tailroom(skb)) {
struct sk_buff *newskb;
newskb = skb_copy_expand(skb,skb_headroom(skb),
len,GFP_ATOMIC);
if (newskb == NULL) {
printk(KERN_WARNING "ERROR!!!\n");
return -ENOMEM;
}
if (skb->sk)
skb_set_owner_w(newskb, skb->sk);
kfree_skb(skb);
skb = newskb;
}
skb_put(skb, len);
---------------
不过总是在 skb_put(skb, len) 出错 不知道有谁能解答
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.123.110.178