Каковы отношения между возвращаемым значением и аргументом msg функции tcp_recvmsg в ядре Linux? - PullRequest
0 голосов
/ 20 мая 2018

Я хочу добавить функцию, которая будет делать что-то, когда данные по TCP будут доставлены в пространство пользователя, поэтому я добавляю код в inet_recvmsg () следующим образом:

int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, int flags)
{
    struct sock *sk = sock->sk;
    int addr_len = 0;
    int err;
    sock_rps_record_flow(sk);
    err = sk->sk_prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
                   flags & ~MSG_DONTWAIT, &addr_len);
    if (err >= 0)
        msg->msg_namelen = addr_len;

    //my code here begin
    if (err > 0 && sk->sk_family == IPPROTO_TCP)
        my_function(sk, msg, err);
    //my code here end

    return err;
}

Я понимаю, что если вызывающая сторонаПолучит некоторые данные успешно, эта функция вернет err> 0, что означает длину данных, скопированных в буфер, предоставленный userpace, и полученные данные уже были скопированы в буфер, указанный msg-> iov_iter.iov.Но когда я отлаживаю my_function (), я встречаю очень странные вещи:

  1. возвращаемая ошибка 8912, это означает, что пользовательское пространство успешно прочитало данные.
  2. msg-> iov_iter.nr_segs равно 0, что означает длину массива (msg-> iov_iter.iov).

Почему так получился результат или что не так в моем понимании?

Дополнительно, мойЯдро Linux - 4.9.100

...