From nobody Thu May  1 07:23:01 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 1500294593982616.9829797126627;
 Mon, 17 Jul 2017 05:29:53 -0700 (PDT)
Received: from localhost ([::1]:50074 helo=lists.gnu.org)
	by lists.gnu.org with esmtp (Exim 4.71)
	(envelope-from <qemu-devel-bounces+importer=patchew.org@nongnu.org>)
	id 1dX59q-0007V9-Hz
	for importer@patchew.org; Mon, 17 Jul 2017 08:29:50 -0400
Received: from eggs.gnu.org ([2001:4830:134:3::10]:48321)
	by lists.gnu.org with esmtp (Exim 4.71)
	(envelope-from <jasowang@redhat.com>) id 1dX52X-0000n7-IK
	for qemu-devel@nongnu.org; Mon, 17 Jul 2017 08:22:19 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
	(envelope-from <jasowang@redhat.com>) id 1dX52W-0008BT-7u
	for qemu-devel@nongnu.org; Mon, 17 Jul 2017 08:22:17 -0400
Received: from mx1.redhat.com ([209.132.183.28]:59908)
	by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)
	(Exim 4.71) (envelope-from <jasowang@redhat.com>) id 1dX52V-0008B3-Vo
	for qemu-devel@nongnu.org; Mon, 17 Jul 2017 08:22:16 -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 EF78981243;
	Mon, 17 Jul 2017 12:22:14 +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 EABBE600C2;
	Mon, 17 Jul 2017 12:22:11 +0000 (UTC)
DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com EF78981243
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 EF78981243
From: Jason Wang <jasowang@redhat.com>
To: peter.maydell@linaro.org,
	qemu-devel@nongnu.org
Date: Mon, 17 Jul 2017 20:21:39 +0800
Message-Id: <1500294105-13713-9-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:22:15 +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 08/14] net/colo-compare.c: Make colo-compare
 support vnet_hdr_len
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 the vnet_hdr_support option for colo-compare, default is disabled.
If you use virtio-net-pci or other driver needs vnet_hdr, please enable it.
You can use it for example:
-object colo-compare,id=3Dcomp0,primary_in=3Dcompare0-0,secondary_in=3Dcomp=
are1,outdev=3Dcompare_out0,vnet_hdr_support

COLO-compare can get vnet header length from filter,
Add vnet_hdr_len to struct packet and output packet with
the vnet_hdr_len.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 net/colo-compare.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++---=
----
 qemu-options.hx    |  4 ++--
 2 files changed, 55 insertions(+), 9 deletions(-)

diff --git a/net/colo-compare.c b/net/colo-compare.c
index c5d01da..95911a2 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -73,6 +73,7 @@ typedef struct CompareState {
     CharBackend chr_out;
     SocketReadState pri_rs;
     SocketReadState sec_rs;
+    bool vnet_hdr;
=20
     /* connection list: the connections belonged to this NIC could be found
      * in this list.
@@ -99,7 +100,8 @@ enum {
=20
 static int compare_chr_send(CompareState *s,
                             const uint8_t *buf,
-                            uint32_t size);
+                            uint32_t size,
+                            uint32_t vnet_hdr_len);
=20
 static gint seq_sorter(Packet *a, Packet *b, gpointer data)
 {
@@ -483,7 +485,10 @@ static void colo_compare_connection(void *opaque, void=
 *user_data)
         }
=20
         if (result) {
-            ret =3D compare_chr_send(s, pkt->data, pkt->size);
+            ret =3D compare_chr_send(s,
+                                   pkt->data,
+                                   pkt->size,
+                                   pkt->vnet_hdr_len);
             if (ret < 0) {
                 error_report("colo_send_primary_packet failed");
             }
@@ -506,7 +511,8 @@ static void colo_compare_connection(void *opaque, void =
*user_data)
=20
 static int compare_chr_send(CompareState *s,
                             const uint8_t *buf,
-                            uint32_t size)
+                            uint32_t size,
+                            uint32_t vnet_hdr_len)
 {
     int ret =3D 0;
     uint32_t len =3D htonl(size);
@@ -520,6 +526,18 @@ static int compare_chr_send(CompareState *s,
         goto err;
     }
=20
+    if (s->vnet_hdr) {
+        /*
+         * We send vnet header len make other module(like filter-redirecto=
r)
+         * know how to parse net packet correctly.
+         */
+        len =3D htonl(vnet_hdr_len);
+        ret =3D qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof=
(len));
+        if (ret !=3D sizeof(len)) {
+            goto err;
+        }
+    }
+
     ret =3D qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)buf, size);
     if (ret !=3D size) {
         goto err;
@@ -659,13 +677,32 @@ static void compare_set_outdev(Object *obj, const cha=
r *value, Error **errp)
     s->outdev =3D g_strdup(value);
 }
=20
+static bool compare_get_vnet_hdr(Object *obj, Error **errp)
+{
+    CompareState *s =3D COLO_COMPARE(obj);
+
+    return s->vnet_hdr;
+}
+
+static void compare_set_vnet_hdr(Object *obj,
+                                 bool value,
+                                 Error **errp)
+{
+    CompareState *s =3D COLO_COMPARE(obj);
+
+    s->vnet_hdr =3D value;
+}
+
 static void compare_pri_rs_finalize(SocketReadState *pri_rs)
 {
     CompareState *s =3D container_of(pri_rs, CompareState, pri_rs);
=20
     if (packet_enqueue(s, PRIMARY_IN)) {
         trace_colo_compare_main("primary: unsupported packet in");
-        compare_chr_send(s, pri_rs->buf, pri_rs->packet_len);
+        compare_chr_send(s,
+                         pri_rs->buf,
+                         pri_rs->packet_len,
+                         pri_rs->vnet_hdr_len);
     } else {
         /* compare connection */
         g_queue_foreach(&s->conn_list, colo_compare_connection, s);
@@ -747,8 +784,8 @@ static void colo_compare_complete(UserCreatable *uc, Er=
ror **errp)
         return;
     }
=20
-    net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, false);
-    net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, false);
+    net_socket_rs_init(&s->pri_rs, compare_pri_rs_finalize, s->vnet_hdr);
+    net_socket_rs_init(&s->sec_rs, compare_sec_rs_finalize, s->vnet_hdr);
=20
     g_queue_init(&s->conn_list);
=20
@@ -774,7 +811,10 @@ static void colo_flush_packets(void *opaque, void *use=
r_data)
=20
     while (!g_queue_is_empty(&conn->primary_list)) {
         pkt =3D g_queue_pop_head(&conn->primary_list);
-        compare_chr_send(s, pkt->data, pkt->size);
+        compare_chr_send(s,
+                         pkt->data,
+                         pkt->size,
+                         pkt->vnet_hdr_len);
         packet_destroy(pkt, NULL);
     }
     while (!g_queue_is_empty(&conn->secondary_list)) {
@@ -792,6 +832,8 @@ static void colo_compare_class_init(ObjectClass *oc, vo=
id *data)
=20
 static void colo_compare_init(Object *obj)
 {
+    CompareState *s =3D COLO_COMPARE(obj);
+
     object_property_add_str(obj, "primary_in",
                             compare_get_pri_indev, compare_set_pri_indev,
                             NULL);
@@ -801,6 +843,10 @@ static void colo_compare_init(Object *obj)
     object_property_add_str(obj, "outdev",
                             compare_get_outdev, compare_set_outdev,
                             NULL);
+
+    s->vnet_hdr =3D false;
+    object_property_add_bool(obj, "vnet_hdr_support", compare_get_vnet_hdr,
+                             compare_set_vnet_hdr, NULL);
 }
=20
 static void colo_compare_finalize(Object *obj)
diff --git a/qemu-options.hx b/qemu-options.hx
index b86c09e..91a25ee 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -4282,13 +4282,13 @@ Dump the network traffic on netdev @var{dev} to the=
 file specified by
 The file format is libpcap, so it can be analyzed with tools such as tcpdu=
mp
 or Wireshark.
=20
-@item -object colo-compare,id=3D@var{id},primary_in=3D@var{chardevid},seco=
ndary_in=3D@var{chardevid},
-outdev=3D@var{chardevid}
+@item -object colo-compare,id=3D@var{id},primary_in=3D@var{chardevid},seco=
ndary_in=3D@var{chardevid},outdev=3D@var{chardevid}[,vnet_hdr_support]
=20
 Colo-compare gets packet from primary_in@var{chardevid} and secondary_in@v=
ar{chardevid}, than compare primary packet with
 secondary packet. If the packets are same, we will output primary
 packet to outdev@var{chardevid}, else we will notify colo-frame
 do checkpoint and send primary packet to outdev@var{chardevid}.
+if it has the vnet_hdr_support flag, colo compare will send/recv packet wi=
th vnet_hdr_len.
=20
 we must use it with the help of filter-mirror and filter-redirector.
=20
--=20
2.7.4