亚洲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