On Sat, Jun 24, 2017 at 04:36:34AM +0300, Dmitry V. Levin wrote:
> On Sat, Jun 24, 2017 at 09:06:06AM +0800, JingPiao Chen wrote:
> > static int
> > print_nlmsghdr(struct tcb *tcp,
> >       const int fd,
> >       int family,
> >       const struct nlmsghdr *const nlmsghdr)
> > {
> > ...
> > const int hdr_family = (nlmsghdr->nlmsg_type < NLMSG_MIN_TYPE)
> >       ? NL_FAMILY_DEFAULT
> >       : (family != NL_FAMILY_DEFAULT
> >  ? family : get_fd_nl_family(tcp, fd));
> 
> Feel free to change this if NLMSG_DONE needs a family specific decoding.

I have send a patch. I've also thought about rewriting NLMSG_DONE,
because only three family send useful data: drivers/connector/connector.c,
drivers/infiniband/core/iwpm_util.c and net/netfilter/nfnetlink_log.c.
In the end, I think it's good enough, but I want to ask your opinion.

$ git grep "NLMSG_DONE"

drivers/connector/connector.c:  nlh = nlmsg_put(skb, 0, msg->seq, NLMSG_DONE, 
size, 0);
drivers/infiniband/core/iwpm_util.c:    nlh->nlmsg_type = NLMSG_DONE;

These two family I do not understand what they send.

net/netfilter/nfnetlink_log.c:
static void
__nfulnl_send(struct nfulnl_instance *inst)
{
        if (inst->qlen > 1) {
                struct nlmsghdr *nlh = nlmsg_put(inst->skb, 0, 0,
                                                 NLMSG_DONE,
                                                 sizeof(struct nfgenmsg),
                                                 0);
                if (WARN_ONCE(!nlh, "bad nlskb size: %u, tailroom %d\n",
                              inst->skb->len, skb_tailroom(inst->skb))) {
                        kfree_skb(inst->skb);
                        goto out;
                }
        }
        nfnetlink_unicast(inst->skb, inst->net, inst->peer_portid,
                          MSG_DONTWAIT);
out:
        inst->qlen = 0;
        inst->skb = NULL;
}

It allocate struct nfgenmsg, but do not initialize it.

Following family data length is zero. Default decoder can handle them.

drivers/net/team/team.c: nlh = nlmsg_put(skb, portid, seq, NLMSG_DONE, 0, flags 
| NLM_F_MULTI);

drivers/scsi/scsi_transport_iscsi.c:    int t = done ? NLMSG_DONE : type;
static void
iscsi_if_rx(struct sk_buff *skb)
{
        ...
                        err = iscsi_if_send_reply(group, nlh->nlmsg_seq,
                                nlh->nlmsg_type, 0, 0, ev, sizeof(*ev));
        ...
}

kernel/audit.c: int             t     = done  ? NLMSG_DONE  : type;
kernel/auditfilter.c:
static void audit_list_rules(int seq, struct sk_buff_head *q)
{
        ...
        skb = audit_make_reply(seq, AUDIT_LIST_RULES, 1, 1, NULL, 0);
        ...
}

net/core/devlink.c:                     NLMSG_DONE, 0, flags | NLM_F_MULTI);
net/core/devlink.c:                     NLMSG_DONE, 0, flags | NLM_F_MULTI);
net/core/devlink.c:                     NLMSG_DONE, 0, flags | NLM_F_MULTI);

--
JingPiao Chen

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to