From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37987) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUyGr-0005Zb-5h for qemu-devel@nongnu.org; Thu, 27 Aug 2015 10:35:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZUyGn-00027n-53 for qemu-devel@nongnu.org; Thu, 27 Aug 2015 10:35:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45165) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUyGm-00027a-Ud for qemu-devel@nongnu.org; Thu, 27 Aug 2015 10:35:13 -0400 Message-ID: <55DF201A.5070308@redhat.com> Date: Thu, 27 Aug 2015 16:35:06 +0200 From: Thomas Huth MIME-Version: 1.0 References: <1440583182-5828-1-git-send-email-yanghy@cn.fujitsu.com> <1440583182-5828-5-git-send-email-yanghy@cn.fujitsu.com> In-Reply-To: <1440583182-5828-5-git-send-email-yanghy@cn.fujitsu.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v8 04/11] netfilter: hook packets before net queue send List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Yang Hongyang , qemu-devel@nongnu.org Cc: zhang.zhanghailiang@huawei.com, lizhijian@cn.fujitsu.com, jasowang@redhat.com, mrhines@linux.vnet.ibm.com, stefanha@redhat.com On 26/08/15 11:59, Yang Hongyang wrote: > Capture packets that will be sent. > > Signed-off-by: Yang Hongyang > --- > v5: do not check ret against iov_size > pass sent_cb to filters > --- > net/net.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 66 insertions(+) > > diff --git a/net/net.c b/net/net.c > index 74f3592..00cca83 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -562,6 +562,44 @@ int qemu_can_send_packet(NetClientState *sender) > return 1; > } > > +static ssize_t filter_receive_iov(NetClientState *nc, int chain, > + NetClientState *sender, > + unsigned flags, > + const struct iovec *iov, > + int iovcnt, > + NetPacketSent *sent_cb) > +{ > + ssize_t ret = 0; > + NetFilterState *nf = NULL; > + > + QTAILQ_FOREACH(nf, &nc->filters, next) { > + if (nf->chain == chain || nf->chain == NET_FILTER_ALL) { > + ret = nf->info->receive_iov(nf, sender, flags, > + iov, iovcnt, sent_cb); > + if (ret) { > + return ret; > + } > + } > + } > + > + return ret; I think that could also be "return 0" since all other return values are handled by the return within the loop already. Then you could also remove the pre-init of "ret = 0" at the beginning of the function. > +} > + > +static ssize_t filter_receive(NetClientState *nc, int chain, > + NetClientState *sender, > + unsigned flags, > + const uint8_t *data, > + size_t size, > + NetPacketSent *sent_cb) > +{ > + struct iovec iov = { > + .iov_base = (void *)data, > + .iov_len = size > + }; > + > + return filter_receive_iov(nc, chain, sender, flags, &iov, 1, sent_cb); > +} > + > ssize_t qemu_deliver_packet(NetClientState *sender, > unsigned flags, > const uint8_t *data, > @@ -633,6 +671,7 @@ static ssize_t qemu_send_packet_async_with_flags(NetClientState *sender, > NetPacketSent *sent_cb) > { > NetQueue *queue; > + int ret; > > #ifdef DEBUG_NET > printf("qemu_send_packet_async:\n"); > @@ -643,6 +682,19 @@ static ssize_t qemu_send_packet_async_with_flags(NetClientState *sender, > return size; > } > > + /* Let filters handle the packet first */ > + ret = filter_receive(sender, NET_FILTER_OUT, > + sender, flags, buf, size, sent_cb); > + if (ret) { > + return ret; > + } > + > + ret = filter_receive(sender->peer, NET_FILTER_IN, > + sender, flags, buf, size, sent_cb); > + if (ret) { > + return ret; > + } > + > queue = sender->peer->incoming_queue; > > return qemu_net_queue_send(queue, sender, flags, buf, size, sent_cb); > @@ -713,11 +765,25 @@ ssize_t qemu_sendv_packet_async(NetClientState *sender, > NetPacketSent *sent_cb) > { > NetQueue *queue; > + int ret; > > if (sender->link_down || !sender->peer) { > return iov_size(iov, iovcnt); > } > > + /* Let filters handle the packet first */ > + ret = filter_receive_iov(sender, NET_FILTER_OUT, sender, > + QEMU_NET_PACKET_FLAG_NONE, iov, iovcnt, sent_cb); > + if (ret) { > + return ret; > + } > + > + ret = filter_receive_iov(sender->peer, NET_FILTER_IN, sender, > + QEMU_NET_PACKET_FLAG_NONE, iov, iovcnt, sent_cb); > + if (ret) { > + return ret; > + } > + > queue = sender->peer->incoming_queue; > > return qemu_net_queue_send_iov(queue, sender, My comment above was just cosmetics, patch looks already fine to me as it is, so anyway: Reviewed-by: Thomas Huth