亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 求助:對sk_buff的操作(加擴展頭) [打印本頁]

作者: ljy162829    時間: 2008-05-29 17:25
標題: 求助:對sk_buff的操作(加擴展頭)
最近要做二個內(nèi)核模塊,功能是對發(fā)出的普通ipv6數(shù)據(jù)包加一個擴展頭,然后在接收端解析出這個擴展頭。由于對sk_buff的操作不熟悉,老是出現(xiàn)問題,希望高人給與指點,內(nèi)核版本是2.6.25,
加擴展頭的函數(shù)程序如下,利用netfilter機制,掛載到nf_ip6_pre_routing鉤子上。
unsigned int extfilter(unsigned int hooknum,
struct sk_buff * skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn) (struct sk_buff *))
{
        int extlen=sizeof(struct ip6_cga_hdr);
        struct ipv6hdr *top_iph,tmp_ip6;
        struct ip6_cga_hdr *cga_tmp,*tmp_ext=NULL;
        unsigned char *cga;

top_iph=kmalloc(sizeof(*top_iph), GFP_ATOMIC);
top_iph = ipv6_hdr(skb);//保存原頭部
cga_tmp=kmalloc(extlen, GFP_ATOMIC);
cga_tmp->nexthdr=top_iph->nexthdr;//保存下一個頭
top_iph->nexthdr=IPPROTO_CGA;
top_iph->payload_len= htons(skb->len - sizeof(*top_iph)+extlen);
memcpy(&tmp_ip6, top_iph, sizeof(tmp_ip6));
if(skb_headroom(skb)>=extlen)
skb_push(skb, extlen);//分配空間
else
{
printk("no headroom");
goto error_free_iph;
}      

cga_tmp->hdrlen=1;
cga_tmp->reserved=0;
cga_tmp->cgap=&tmp_cga;

        tmp_ext = NULL;
        if (extlen)
        {
                tmp_ext = kmalloc(extlen, GFP_ATOMIC);
                if (!tmp_ext) {
                 printk("no hearroom");
                goto error_free_iph;
                }
                memcpy(tmp_ext, cga_tmp, extlen);

        }
        memcpy(skb->data, &tmp_ip6, sizeof(tmp_ip6));
        cga=skb->data+sizeof(*top_iph);
        if (tmp_ext)
                memcpy(cga, tmp_ext, extlen);

                kfree(tmp_ext);
error_free_iph:
                kfree(top_iph);
                kfree(cga_tmp);
return NF_ACCEPT;

}
編譯沒錯誤,可是加載模塊發(fā)送數(shù)據(jù)時,機器不是死機就是抓到的包是malformal(畸形)包。ipv6地址格式很亂,而且接受數(shù)據(jù)時機器就死機了。謝謝幫忙。
作者: chengwei1985    時間: 2008-05-29 18:03
ding ,關(guān)注
作者: ljy162829    時間: 2008-05-30 08:38
怎么沒人回答呢,




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2