簡體   English   中英

從內核模塊發送帶有套接字的數據包

[英]Send packet with sockets from kernel module

我正在編寫一個內核模塊,該模塊應該從用戶空間接收消息並通過套接字發送回響應。

當程序和模塊位於同一台計算機上並且使用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);
    }
}

我找到了使用netpoll套接字的替代解決方案。 它比我以前使用的套接字更容易,並且可以工作。 答案和正確的代碼在這里 ,關於另一個StackOverflow問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM