From nobody Thu May  1 03:29:45 2025
Delivered-To: importer@patchew.org
Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as
 permitted sender) client-ip=208.118.235.17;
 envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org;
 helo=lists.gnu.org;
Authentication-Results: mx.zohomail.com;
	spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted
 sender)  smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org
Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org>
Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by
 mx.zohomail.com
	with SMTPS id 150029421934843.56959154014646;
 Mon, 17 Jul 2017 05:23:39 -0700 (PDT)
Received: from localhost ([::1]:50050 helo=lists.gnu.org)
	by lists.gnu.org with esmtp (Exim 4.71)
	(envelope-from <qemu-devel-bounces+importer=patchew.org@nongnu.org>)
	id 1dX53j-0001XN-QO
	for importer@patchew.org; Mon, 17 Jul 2017 08:23:31 -0400
Received: from eggs.gnu.org ([2001:4830:134:3::10]:48240)
	by lists.gnu.org with esmtp (Exim 4.71)
	(envelope-from <jasowang@redhat.com>) id 1dX52H-0000YO-5Q
	for qemu-devel@nongnu.org; Mon, 17 Jul 2017 08:22:02 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
	(envelope-from <jasowang@redhat.com>) id 1dX52G-0007tB-1F
	for qemu-devel@nongnu.org; Mon, 17 Jul 2017 08:22:01 -0400
Received: from mx1.redhat.com ([209.132.183.28]:59510)
	by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)
	(Exim 4.71) (envelope-from <jasowang@redhat.com>) id 1dX52F-0007pU-NH
	for qemu-devel@nongnu.org; Mon, 17 Jul 2017 08:21:59 -0400
Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com
	[10.5.11.11])
	(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mx1.redhat.com (Postfix) with ESMTPS id A717D81235;
	Mon, 17 Jul 2017 12:21:58 +0000 (UTC)
Received: from jason-ThinkPad-T450s.redhat.com (ovpn-12-128.pek2.redhat.com
	[10.72.12.128])
	by smtp.corp.redhat.com (Postfix) with ESMTP id DE037600C2;
	Mon, 17 Jul 2017 12:21:56 +0000 (UTC)
DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A717D81235
Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com;
	dmarc=none (p=none dis=none) header.from=redhat.com
Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com;
	spf=pass smtp.mailfrom=jasowang@redhat.com
DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com A717D81235
From: Jason Wang <jasowang@redhat.com>
To: peter.maydell@linaro.org,
	qemu-devel@nongnu.org
Date: Mon, 17 Jul 2017 20:21:33 +0800
Message-Id: <1500294105-13713-3-git-send-email-jasowang@redhat.com>
In-Reply-To: <1500294105-13713-1-git-send-email-jasowang@redhat.com>
References: <1500294105-13713-1-git-send-email-jasowang@redhat.com>
X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11
X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16
	(mx1.redhat.com [10.5.110.25]);
	Mon, 17 Jul 2017 12:21:58 +0000 (UTC)
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
	[fuzzy]
X-Received-From: 209.132.183.28
Subject: [Qemu-devel] [PULL 02/14] net/net.c: Add vnet_hdr support in
 SocketReadState
X-BeenThere: qemu-devel@nongnu.org
X-Mailman-Version: 2.1.21
Precedence: list
List-Id: <qemu-devel.nongnu.org>
List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>,
	<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>
List-Archive: <http://lists.nongnu.org/archive/html/qemu-devel/>
List-Post: <mailto:qemu-devel@nongnu.org>
List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help>
List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>,
	<mailto:qemu-devel-request@nongnu.org?subject=subscribe>
Cc: Jason Wang <jasowang@redhat.com>,
	Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org
Sender: "Qemu-devel" <qemu-devel-bounces+importer=patchew.org@nongnu.org>
X-ZohoMail: RSF_0  Z_629925259 SPT_0
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"

From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

We add a flag to decide whether net_fill_rstate() need read
the vnet_hdr_len or not.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Suggested-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 include/net/net.h   |  9 +++++++--
 net/colo-compare.c  |  4 ++--
 net/filter-mirror.c |  2 +-
 net/net.c           | 36 ++++++++++++++++++++++++++++++++----
 net/socket.c        |  8 ++++----
 5 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/include/net/net.h b/include/net/net.h
index 9a92c70..1c55a93 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -112,9 +112,13 @@ typedef struct NICState {
 } NICState;
=20
 struct SocketReadState {
-    int state; /* 0 =3D getting length, 1 =3D getting data */
+    /* 0 =3D getting length, 1 =3D getting vnet header length, 2 =3D getti=
ng data */
+    int state;
+    /* This flag decide whether to read the vnet_hdr_len field */
+    bool vnet_hdr;
     uint32_t index;
     uint32_t packet_len;
+    uint32_t vnet_hdr_len;
     uint8_t buf[NET_BUFSIZE];
     SocketReadStateFinalize *finalize;
 };
@@ -177,7 +181,8 @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender,
 void print_net_client(Monitor *mon, NetClientState *nc);
 void hmp_info_network(Monitor *mon, const QDict *qdict);
 void net_socket_rs_init(SocketReadState *rs,
-                        SocketReadStateFinalize *finalize);
+                        SocketReadStateFinalize *finalize,
+                        bool vnet_hdr);
=20
 /* NIC info */
=20
diff --git a/net/colo-compare.c b/net/colo-compare.c
index abfc23c..ea9bccc 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -743,8 +743,8 @@ static void colo_compare_complete(UserCreatable *uc, Er=
ror **errp)
         return;
     }
=20
-    net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize);
-    net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize);
+    net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, false);
+    net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, false);
=20
     g_queue_init(&s->conn_list);
=20
diff --git a/net/filter-mirror.c b/net/filter-mirror.c
index 6043549..1b6211b 100644
--- a/net/filter-mirror.c
+++ b/net/filter-mirror.c
@@ -229,7 +229,7 @@ static void filter_redirector_setup(NetFilterState *nf,=
 Error **errp)
         }
     }
=20
-    net_socket_rs_init(&s->rs, redirector_rs_finalize);
+    net_socket_rs_init(&s->rs, redirector_rs_finalize, false);
=20
     if (s->indev) {
         chr =3D qemu_chr_find(s->indev);
diff --git a/net/net.c b/net/net.c
index b62ce10..0e28099 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1616,11 +1616,14 @@ QemuOptsList qemu_net_opts =3D {
 };
=20
 void net_socket_rs_init(SocketReadState *rs,
-                        SocketReadStateFinalize *finalize)
+                        SocketReadStateFinalize *finalize,
+                        bool vnet_hdr)
 {
     rs->state =3D 0;
+    rs->vnet_hdr =3D vnet_hdr;
     rs->index =3D 0;
     rs->packet_len =3D 0;
+    rs->vnet_hdr_len =3D 0;
     memset(rs->buf, 0, sizeof(rs->buf));
     rs->finalize =3D finalize;
 }
@@ -1635,8 +1638,12 @@ int net_fill_rstate(SocketReadState *rs, const uint8=
_t *buf, int size)
     unsigned int l;
=20
     while (size > 0) {
-        /* reassemble a packet from the network */
-        switch (rs->state) { /* 0 =3D getting length, 1 =3D getting data */
+        /* Reassemble a packet from the network.
+         * 0 =3D getting length.
+         * 1 =3D getting vnet header length.
+         * 2 =3D getting data.
+         */
+        switch (rs->state) {
         case 0:
             l =3D 4 - rs->index;
             if (l > size) {
@@ -1650,10 +1657,31 @@ int net_fill_rstate(SocketReadState *rs, const uint=
8_t *buf, int size)
                 /* got length */
                 rs->packet_len =3D ntohl(*(uint32_t *)rs->buf);
                 rs->index =3D 0;
-                rs->state =3D 1;
+                if (rs->vnet_hdr) {
+                    rs->state =3D 1;
+                } else {
+                    rs->state =3D 2;
+                    rs->vnet_hdr_len =3D 0;
+                }
             }
             break;
         case 1:
+            l =3D 4 - rs->index;
+            if (l > size) {
+                l =3D size;
+            }
+            memcpy(rs->buf + rs->index, buf, l);
+            buf +=3D l;
+            size -=3D l;
+            rs->index +=3D l;
+            if (rs->index =3D=3D 4) {
+                /* got vnet header length */
+                rs->vnet_hdr_len =3D ntohl(*(uint32_t *)rs->buf);
+                rs->index =3D 0;
+                rs->state =3D 2;
+            }
+            break;
+        case 2:
             l =3D rs->packet_len - rs->index;
             if (l > size) {
                 l =3D size;
diff --git a/net/socket.c b/net/socket.c
index dcae1ae..f85ef7d 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -174,7 +174,7 @@ static void net_socket_send(void *opaque)
         closesocket(s->fd);
=20
         s->fd =3D -1;
-        net_socket_rs_init(&s->rs, net_socket_rs_finalize);
+        net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
         s->nc.link_down =3D true;
         memset(s->nc.info_str, 0, sizeof(s->nc.info_str));
=20
@@ -366,7 +366,7 @@ static NetSocketState *net_socket_fd_init_dgram(NetClie=
ntState *peer,
     s->fd =3D fd;
     s->listen_fd =3D -1;
     s->send_fn =3D net_socket_send_dgram;
-    net_socket_rs_init(&s->rs, net_socket_rs_finalize);
+    net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
     net_socket_read_poll(s, true);
=20
     /* mcast: save bound address as dst */
@@ -417,7 +417,7 @@ static NetSocketState *net_socket_fd_init_stream(NetCli=
entState *peer,
=20
     s->fd =3D fd;
     s->listen_fd =3D -1;
-    net_socket_rs_init(&s->rs, net_socket_rs_finalize);
+    net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
=20
     /* Disable Nagle algorithm on TCP sockets to reduce latency */
     socket_set_nodelay(fd);
@@ -522,7 +522,7 @@ static int net_socket_listen_init(NetClientState *peer,
     s->fd =3D -1;
     s->listen_fd =3D fd;
     s->nc.link_down =3D true;
-    net_socket_rs_init(&s->rs, net_socket_rs_finalize);
+    net_socket_rs_init(&s->rs, net_socket_rs_finalize, false);
=20
     qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
     return 0;
--=20
2.7.4