netfilter hook小程序死机问题

发布于 2022-09-30 18:40:43 字数 4742 浏览 10 评论 0

各位大侠,我最近在做毕业设计,是关于流量控制方面的。现在想对基于滑动窗口的算法和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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蔚蓝源自深海 2022-10-07 18:40:43

再补充一下,假如我在NF_INET_PRE_ROUTING钩子点上挂在该函数,同时源目的地址做相应修改,则程序运行正常。

梓梦 2022-10-07 18:40:43

再补充一下,假如我在NF_INET_PRE_ROUTING钩子点上挂在该函数,同时源目的地址做相应修改,则程序运行正常。有点奇怪,希望高手指点

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文