当前位置: 技术问答>linux和unix
linux 内核模块编程,对IP包增加option域空间,只分配20个字节,但是包却发不出了
来源: 互联网 发布时间:2016-06-08
本文导语: option域分配20个字节的话,ping就发不出包了,用wireshark截不到包 但是假如分配20个字节以下,就可以哦 但是我就需要20个字节啊,怎么办呢~? unsigned int op_send(unsigned int hooknum,struct sk_buff **skb,const struct net_device ...
option域分配20个字节的话,ping就发不出包了,用wireshark截不到包
但是假如分配20个字节以下,就可以哦
但是我就需要20个字节啊,怎么办呢~?
unsigned int op_send(unsigned int hooknum,struct sk_buff **skb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))
{
struct iphdr *iph_n=ip_hdr(*skb);
int iph_len=(iph_n->ihl)*4;//ip首部长度,单位字节
if(iph_n->protocol!=0)
{
unsigned char *oph_addr=skb_push((*skb),20);//返回值为待写入数据的区域的指针
if(oph_addr==NULL){printk("the headroom is not enoughn");return NF_DROP;}
(*skb)->network_header=memmove(oph_addr,iph_n,iph_len);//前移ip头部
iph_n=(*skb)->network_header;
oph_addr+=iph_len;//确定添加选项的地址
iph_n->ihl+=5;
iph_n->tot_len=htons((*skb)->len);
ip_send_check(iph_n);
printk("发送:添加选项域成功!n");
return NF_ACCEPT;
}
else{return NF_DROP;}
}
但是假如分配20个字节以下,就可以哦
但是我就需要20个字节啊,怎么办呢~?
unsigned int op_send(unsigned int hooknum,struct sk_buff **skb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))
{
struct iphdr *iph_n=ip_hdr(*skb);
int iph_len=(iph_n->ihl)*4;//ip首部长度,单位字节
if(iph_n->protocol!=0)
{
unsigned char *oph_addr=skb_push((*skb),20);//返回值为待写入数据的区域的指针
if(oph_addr==NULL){printk("the headroom is not enoughn");return NF_DROP;}
(*skb)->network_header=memmove(oph_addr,iph_n,iph_len);//前移ip头部
iph_n=(*skb)->network_header;
oph_addr+=iph_len;//确定添加选项的地址
iph_n->ihl+=5;
iph_n->tot_len=htons((*skb)->len);
ip_send_check(iph_n);
printk("发送:添加选项域成功!n");
return NF_ACCEPT;
}
else{return NF_DROP;}
}
|
奇怪~~
可以试用new和delete的,个人觉得
可以试用new和delete的,个人觉得