- 論壇徽章:
- 0
|
最近要做二個(gè)內(nèi)核模塊,功能是對(duì)發(fā)出的普通ipv6數(shù)據(jù)包加一個(gè)擴(kuò)展頭,然后在接收端解析出這個(gè)擴(kuò)展頭。由于對(duì)sk_buff的操作不熟悉,老是出現(xiàn)問題,希望高人給與指點(diǎn),內(nèi)核版本是2.6.25,
加擴(kuò)展頭的函數(shù)程序如下,利用netfilter機(jī)制,掛載到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;//保存下一個(gè)頭
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;
}
編譯沒錯(cuò)誤,可是加載模塊發(fā)送數(shù)據(jù)時(shí),機(jī)器不是死機(jī)就是抓到的包是malformal(畸形)包。ipv6地址格式很亂,而且接受數(shù)據(jù)時(shí)機(jī)器就死機(jī)了。謝謝幫忙。 |
|