从内核模块发送套接字数据包

6
我正在编写一个内核模块,它应该从用户空间接收消息并通过套接字发送响应。当程序和模块在同一台机器上,并且我使用IP 127.0.0.1 时,一切正常。但是当我尝试在不同的机器上使用真实的网络IP,例如192.168.3.146,它只能单向工作。我可以从用户空间接收消息,但无法从内核接收。我使用sock_sendmsg函数从内核发送消息,它没有返回任何错误。另外,我也没有从防火墙收到任何来自内核模块的其他机器的消息。虽然有类似的问题和示例,但它们对我来说不够有用,或者示例使用的内核版本过于陈旧。我使用了UDP套接字的框架代码,链接如下:http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html。需要帮助吗?以下是内核模块发送消息的代码:
void send_data(unsigned char *data)
{
    if(!IS_ERR_OR_NULL(data))
    {
        int ret;
        mm_segment_t oldfs;
        struct msghdr message;
        struct iovec ioVector;
        struct sockaddr_in sendAddr;

        sendAddr.sin_family = AF_INET;
        sendAddr.sin_addr.s_addr = INADDR_ANY;
        //sendAddr.sin_addr.s_addr = in_aton("192.168.1.75");
        //here I get port from sk_buff structure that I received.
        sendAddr.sin_port = *((unsigned short*)skBuffer->data);

        memset(&message, 0, sizeof(message));
        message.msg_name = &sendAddr;
        message.msg_namelen = sizeof(sendAddr);

        /* send the message back */
        ioVector.iov_base = data;
        ioVector.iov_len  = strlen(data);
        message.msg_iov = &ioVector;
        message.msg_iovlen = 1;
        message.msg_control = NULL;
        message.msg_controllen = 0;

        oldfs = get_fs();
        set_fs(KERNEL_DS);
        ret = sock_sendmsg(sendSocket, &message, strlen(data));
        set_fs(oldfs);
    }
}
1个回答

2

我发现了一种替代方案,使用netpoll sockets。它比我之前使用的sockets更容易,并且有效。答案和适当的代码在这里,另一个StackOverflow问题的页面上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接