C- SKB校验和计算功能可能导致系统悬挂



在询问Linux论坛上相同的问题和一些错误测试之后,我的以下信息似乎与我的问题有关:

我正在构建一个应用程序,该应用程序将传入的数据包转移到了用户空间代理的内核网络挂钩,该应用程序从TCP插座读取数据,然后将其发送到其原始目的地。当数据包进入时,我将SKB目标地址更改为代理TCP服务器的地址,当它离开时,我更改了源地址,以便通信将透明地通过。

我遇到以下问题:

当大量数据输入时,它们会毫无问题地到达代理。

但是,如果将数据发送到其原始目的地时,如果我发送了系统悬挂的足够数量的数据。穴居人调试表明,skb仅在离开代理时才是非线性的,并且不致电skb_linearize校验和未成功计算。

我不会在数据退出时自己在内核中分配任何数据,并且似乎在我自己的代码中没有内存错误,因此我得出结论,概率很高,问题是我的用法skb_linearize函数或如何使用我一般计算校验和:

void fixChecksum(struct sk_buff *skb)
{
    if(skb_is_nonlinear(skb))
    {
        skb_linearize(skb);
    }
    struct iphdr *ip_header = ip_hdr(skb);
    struct tcphdr *tcp_header = (struct tcphdr*)(skb_network_header(skb) + ip_hdrlen(skb));
    int tcplen = (skb->len - ((ip_header->ihl )<< 2));
    tcp_header->check=0;
    tcp_header->check = tcp_v4_check(tcplen, ip_header->saddr, ip_header->daddr,csum_partial((char*)tcp_header, tcplen,0));
    skb->ip_summed = CHECKSUM_NONE; //stop offloading
    ip_header->check = 0;
    ip_header->check = ip_fast_csum((u8 *)ip_header, ip_header->ihl);
}

我的怀疑是,我传输的数据以某种方式停留在内核中,并且在大量大量之后,内核耗尽并悬挂了系统。但是,我看不到这里有什么问题。我还尝试将skb_linearize更改为skb_linearize_cow,这无济于事。

我在LOCAL_OUT钩上处理的SKB是否有可能在我处理它们后不会被释放?

我的内核版本是3.2

因此,在我的程序运行时进行了更多调试和检查内核内存使用情况之后,事实证明它并没有随着每个数据包的增长。在我添加的一个功能中,我删除了一个功能之一,因为我想在系统调用之间保持模块功能安全,因此它停止了锁定。显然,我不知道自己在做什么,沉重的负荷可能造成了僵局之类的东西,这很奇怪,因为我只有一个锁。感谢有人试图提供帮助,并为浪费时间而感到抱歉。

最新更新