Проблема с дампом Netlink, почему бы не отправить ack msg? - PullRequest
0 голосов
/ 21 февраля 2020
  • программное обеспечение Env: linux 4.4 ядро, libnl-tiny, hostapd;

Проблема: когда я читал код ядра netlink, я обнаружил, что приложение использует " libnl-tiny"api nl_send_auto_complete для отправки типа" DUMP" netlink msg с флагом" NLM_F_ACK", например:

/**
 * Send netlink message and check & extend header values as needed.
 * @arg sk      Netlink socket.
 * @arg msg     Netlink message to be sent.
 *
 * Checks the netlink message \c nlh for completness and extends it
 * as required before sending it out. Checked fields include pid,
 * sequence nr, and flags.
 *
 * @see nl_send()
 * @return Number of characters sent or a negative error code.
 */
 int nl_send_auto_complete(struct nl_sock *sk, struct nl_msg *msg)
 {
   struct nlmsghdr *nlh;
   struct nl_cb *cb = sk->s_cb;

nlh = nlmsg_hdr(msg);
if (nlh->nlmsg_pid == 0)
    nlh->nlmsg_pid = sk->s_local.nl_pid;

if (nlh->nlmsg_seq == 0)
    nlh->nlmsg_seq = sk->s_seq_next++;

if (msg->nm_protocol == -1)
    msg->nm_protocol = sk->s_proto;

nlh->nlmsg_flags |= NLM_F_REQUEST;

if (!(sk->s_flags & NL_NO_AUTO_ACK))
    nlh->nlmsg_flags |= NLM_F_ACK;

if (cb->cb_send_ow)
    return cb->cb_send_ow(sk, msg);
 else
 return nl_send(sk, msg);
 }

Затем ядро ​​получает это сообщение и запускает дескриптор дампа вызова. Однако, когда дамп завершен, он возвращает « -EINTR; », поэтому он не будет отправлять подтверждающие сообщения. Почему? Если это так, как приложение перестает получать сообщения?

код ядра:

    memset(cb, 0, sizeof(*cb));
cb->dump = control->dump;
cb->done = control->done;
cb->nlh = nlh;
cb->data = control->data;
cb->module = control->module;
cb->min_dump_alloc = control->min_dump_alloc;
cb->skb = skb;

nlk->cb_running = true;

mutex_unlock(nlk->cb_mutex);

ret = netlink_dump(sk);
sock_put(sk);
if (ret)
    return ret;

/* We successfully started a dump, by returning -EINTR we
 * signal not to send ACK even if it was requested.
 */
return -EINTR;

screenshot

...