From mboxrd@z Thu Jan 1 00:00:00 1970 From: Phil Sutter Subject: Re: [patch iproute2 v7 1/2] lib/libnetlink: Add functions rtnl_talk_msg and rtnl_talk_iov Date: Tue, 9 Jan 2018 20:24:27 +0100 Message-ID: <20180109192427.GH14358@orbyte.nwl.cc> References: <20180109065908.19754-1-chrism@mellanox.com> <20180109065908.19754-2-chrism@mellanox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: netdev@vger.kernel.org, gerlitz.or@gmail.com, stephen@networkplumber.org, dsahern@gmail.com, marcelo.leitner@gmail.com To: Chris Mi Return-path: Received: from orbyte.nwl.cc ([151.80.46.58]:56322 "EHLO orbyte.nwl.cc" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933847AbeAITY3 (ORCPT ); Tue, 9 Jan 2018 14:24:29 -0500 Content-Disposition: inline In-Reply-To: <20180109065908.19754-2-chrism@mellanox.com> Sender: netdev-owner@vger.kernel.org List-ID: Hi, On Tue, Jan 09, 2018 at 03:59:07PM +0900, Chris Mi wrote: [...] > diff --git a/lib/libnetlink.c b/lib/libnetlink.c > index 00e6ce0c..ae0059f9 100644 > --- a/lib/libnetlink.c > +++ b/lib/libnetlink.c > @@ -581,39 +581,43 @@ static void rtnl_talk_error(struct nlmsghdr *h, struct nlmsgerr *err, > strerror(-err->error)); > } > > -static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, > - struct nlmsghdr **answer, > - bool show_rtnl_err, nl_ext_ack_fn_t errfn) > +static int __rtnl_talk_msg(struct rtnl_handle *rtnl, struct msghdr *m, > + struct nlmsghdr **answer, > + bool show_rtnl_err, nl_ext_ack_fn_t errfn) > { > - int status; > - unsigned int seq; > - struct nlmsghdr *h; > struct sockaddr_nl nladdr = { .nl_family = AF_NETLINK }; > - struct iovec iov = { > - .iov_base = n, > - .iov_len = n->nlmsg_len > - }; > + int i, status, iovlen = m->msg_iovlen; > + struct iovec iov; > struct msghdr msg = { > .msg_name = &nladdr, > .msg_namelen = sizeof(nladdr), > .msg_iov = &iov, > .msg_iovlen = 1, > }; > - char *buf; > - > - n->nlmsg_seq = seq = ++rtnl->seq; > + unsigned int seq = 0; > + struct nlmsghdr *h; > > - if (answer == NULL) > - n->nlmsg_flags |= NLM_F_ACK; > + for (i = 0; i < iovlen; i++) { > + struct iovec *v; > + v = &m->msg_iov[i]; > + h = v->iov_base; > + h->nlmsg_seq = seq = ++rtnl->seq; > + if (answer == NULL) > + h->nlmsg_flags |= NLM_F_ACK; > + } > > - status = sendmsg(rtnl->fd, &msg, 0); > + status = sendmsg(rtnl->fd, m, 0); > if (status < 0) { > perror("Cannot talk to rtnetlink"); > return -1; > } > > + i = 0; > while (1) { for (i = 1; ; i++) ? > + char *buf; Why did you move this declaration? > +next: Drop this and use 'continue' instead of 'goto next' below? > status = rtnl_recvmsg(rtnl->fd, &msg, &buf); > + ++i; > > if (status < 0) > return status; > @@ -642,7 +646,7 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, > > if (nladdr.nl_pid != 0 || > h->nlmsg_pid != rtnl->local.nl_pid || > - h->nlmsg_seq != seq) { > + h->nlmsg_seq > seq || h->nlmsg_seq < seq - iovlen) { > /* Don't forget to skip that message. */ > status -= NLMSG_ALIGN(len); > h = (struct nlmsghdr *)((char *)h + NLMSG_ALIGN(len)); > @@ -662,7 +666,10 @@ static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, > *answer = (struct nlmsghdr *)buf; > else > free(buf); > - return 0; > + if (h->nlmsg_seq == seq) > + return 0; > + else > + goto next; > } > > if (rtnl->proto != NETLINK_SOCK_DIAG && Cheers, Phil