netfilter hook小程序死机问题
各位大侠,我最近在做毕业设计,是关于流量控制方面的。现在想对基于滑动窗口的算法和TC进行一下比较,下面是一个修改窗口值的简单测试程序,完成对发送给google的数据包修改一下窗口值,目的是减慢google服务器的返回速度:
unsigned int window(unsigned int hooknum,
struct sk_buff *__skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct sk_buff *skb;
struct iphdr *iph;
struct tcphdr *tcph;
int tot_len;
int iph_len;
int tcph_len;
skb = __skb;
if(skb == NULL)
return NF_ACCEPT;
iph = ip_hdr(skb);
if(iph == NULL)
return NF_ACCEPT;
tot_len = ntohs(iph->tot_len);
if(iph->daddr == in_aton("72.14.203.106") || iph->daddr == in_aton("72.14.203.103") || iph->daddr == in_aton("72.14.203.104") || iph->daddr == in_aton("72.14.203.105") || iph->daddr == in_aton("72.14.203.147"))
{
iph_len = ip_hdrlen(skb);
skb_pull(skb,iph_len);//skb->data指针定位到了传输层
skb_reset_transport_header(skb);
if(iph->protocol == IPPROTO_TCP)
{
tcph = tcp_hdr(skb);
tcph_len = tcp_hdrlen(skb);
if (ntohs(tcph->dest) == 80)
{
printk("\n");
printk("the packet source %d dest %d",ntohs(tcph->source),ntohs(tcph->dest));
tcph->window = htons(ntohs(tcph->window) >> 3);
printk(" ack=%d syn=%d rst=%d seq=%u window=%u\n",tcph->ack,tcph->syn,tcph->rst,ntohl(tcph->seq),ntohs(tcph->window));
tcph->check = 0;
skb->csum = csum_partial((unsigned char *)tcph, tot_len - iph_len,0);
tcph->check = csum_tcpudp_magic(iph->saddr,
iph->daddr,
ntohs(iph->tot_len) - iph_len,iph->protocol,
skb->csum);
iph->check = 0;
iph->check = ip_fast_csum(iph,iph->ihl);
skb_push(skb,iph_len);
skb_reset_network_header(skb);
return NF_ACCEPT;
}
}
skb_push(skb,iph_len);
skb_reset_network_header(skb);
}
return NF_ACCEPT;
}
但该程序在NF_INET_LOCAL_OUT点上,一点击google网页就会直接死机,图形界面也没有了。麻烦大侠帮忙看一下问题,是在没看出来哪错了。谢谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
再补充一下,假如我在NF_INET_PRE_ROUTING钩子点上挂在该函数,同时源目的地址做相应修改,则程序运行正常。
再补充一下,假如我在NF_INET_PRE_ROUTING钩子点上挂在该函数,同时源目的地址做相应修改,则程序运行正常。有点奇怪,希望高手指点