On Sat, Jun 24, 2017 at 01:43:14PM +0800, JingPiao Chen wrote: > 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.
drivers/connector/connector.c:cn_netlink_send_mult() sends struct cn_msg followed by optional data. drivers/infiniband/core/iwpm_util.c:send_nlmsg_done() sends no data. > 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. Yes, that looks odd. > 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); Yes, besides drivers/connector/connector.c, looks like the current parser handles NLMSG_DONE well. -- ldv
signature.asc
Description: PGP signature
------------------------------------------------------------------------------ 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