Обнаружить закрытый сокет в модуле ядра - PullRequest
0 голосов
/ 24 мая 2019

Как обнаружить, что клиент закрыл сокет в tcp-сервере ядра?Чтобы обработать часть чтения, я жду с wait_queue на sock->sk->sk_receive_queue.Если в файле receive_queue есть skb, то вызывается kernel_recv().

По-видимому, close(sock) на стороне клиента не обнаруживается на сервере ядра и непрерывно ожидает в очереди.kernel_recvmsg() не вызывается, иначе он вернет 0 и сервер освободит сокет.

Есть идеи, как обработать этот случай в пространстве ядра?Это просто в пользовательском пространстве, так как close(socket) просыпается select().

Основной цикл потока, который обрабатывает соединение:

while(1)
{
    add_wait_queue(&accept_socket->sk->sk_wq->wait, &recv_wait);  
    while(skb_queue_empty(&accept_socket->sk->sk_receive_queue))
    {
        __set_current_state(TASK_INTERRUPTIBLE);
        schedule_timeout(HZ);

        if(kthread_should_stop())
        {
            LOG_INFO("thread stopped");

            __set_current_state(TASK_RUNNING);
            remove_wait_queue(&accept_socket->sk->sk_wq->wait,\
                                      &recv_wait);
            goto out;
        }

        if(signal_pending(current))
        {
            __set_current_state(TASK_RUNNING);
            remove_wait_queue(&accept_socket->sk->sk_wq->wait,\
                                      &recv_wait);
            goto out;
        }
    }
    __set_current_state(TASK_RUNNING);
    remove_wait_queue(&accept_socket->sk->sk_wq->wait, &recv_wait);

    memset(in_buf, 0, len+1);
    ret = read_from_tcp(accept_socket, flowPtr, p_id, address, in_buf, len,\
                               MSG_DONTWAIT);
    if(ret > 0)
    {
        LOG_INFO("Forwarding packet...\n");

        if(memcmp(in_buf, "ADIOS", 5) == 0)
            break;
    }
}
...