qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] net: Strip virtio-net header when dumping


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH] net: Strip virtio-net header when dumping
Date: Fri, 13 Jan 2023 14:40:32 +0100
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.6.1

On 13/1/23 14:08, Akihiko Odaki wrote:
filter-dump specifiees Ethernet as PCAP LinkType, which does not expect
virtio-net header. Having virtio-net header in such PCAP file breaks
PCAP unconsumable. Unfortunately currently there is no LinkType for
virtio-net so for now strip virtio-net header to convert the output to
Ethernet.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
  include/net/net.h |  6 ++++++
  net/dump.c        | 11 +++++++----
  net/net.c         | 18 ++++++++++++++++++
  net/netmap.c      |  1 +
  net/tap.c         | 16 ++++++++++++++++
  5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/include/net/net.h b/include/net/net.h
index dc20b31e9f..4b2d72b3fc 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -56,8 +56,10 @@ typedef RxFilterInfo *(QueryRxFilter)(NetClientState *);
  typedef bool (HasUfo)(NetClientState *);
  typedef bool (HasVnetHdr)(NetClientState *);
  typedef bool (HasVnetHdrLen)(NetClientState *, int);
+typedef bool (GetUsingVnetHdr)(NetClientState *);
  typedef void (UsingVnetHdr)(NetClientState *, bool);
  typedef void (SetOffload)(NetClientState *, int, int, int, int, int);
+typedef int (GetVnetHdrLen)(NetClientState *);
  typedef void (SetVnetHdrLen)(NetClientState *, int);
  typedef int (SetVnetLE)(NetClientState *, bool);
  typedef int (SetVnetBE)(NetClientState *, bool);
@@ -84,8 +86,10 @@ typedef struct NetClientInfo {
      HasUfo *has_ufo;
      HasVnetHdr *has_vnet_hdr;
      HasVnetHdrLen *has_vnet_hdr_len;
+    GetUsingVnetHdr *get_using_vnet_hdr;

[*]

      UsingVnetHdr *using_vnet_hdr;
      SetOffload *set_offload;
+    GetVnetHdrLen *get_vnet_hdr_len;
      SetVnetHdrLen *set_vnet_hdr_len;
      SetVnetLE *set_vnet_le;
      SetVnetBE *set_vnet_be;
@@ -183,9 +187,11 @@ void qemu_format_nic_info_str(NetClientState *nc, uint8_t 
macaddr[6]);
  bool qemu_has_ufo(NetClientState *nc);
  bool qemu_has_vnet_hdr(NetClientState *nc);
  bool qemu_has_vnet_hdr_len(NetClientState *nc, int len);
+bool qemu_get_using_vnet_hdr(NetClientState *nc);
  void qemu_using_vnet_hdr(NetClientState *nc, bool enable);
  void qemu_set_offload(NetClientState *nc, int csum, int tso4, int tso6,
                        int ecn, int ufo);

@@ -153,8 +154,10 @@ static ssize_t filter_dump_receive_iov(NetFilterState *nf, 
NetClientState *sndr,
                                         int iovcnt, NetPacketSent *sent_cb)
  {
      NetFilterDumpState *nfds = FILTER_DUMP(nf);
+    int offset = qemu_get_using_vnet_hdr(nf->netdev) ?
+                 qemu_get_vnet_hdr_len(nf->netdev) : 0;
- dump_receive_iov(&nfds->ds, iov, iovcnt);
+    dump_receive_iov(&nfds->ds, iov, iovcnt, offset);
      return 0;
  }
diff --git a/net/net.c b/net/net.c
index 2d01472998..3a95c3ba6a 100644
--- a/net/net.c
+++ b/net/net.c
@@ -513,6 +513,15 @@ bool qemu_has_vnet_hdr_len(NetClientState *nc, int len)
      return nc->info->has_vnet_hdr_len(nc, len);
  }
+bool qemu_get_using_vnet_hdr(NetClientState *nc)
+{
+    if (!nc || !nc->info->get_using_vnet_hdr) {
+        return false;
+    }
+
+    return nc->info->get_using_vnet_hdr(nc);

Per [*], is get_using_vnet_hdr() really useful? Can't we just
check for using_vnet_hdr != NULL as:

       return nc->info->using_vnet_hdr != NULL;

+}
+
  void qemu_using_vnet_hdr(NetClientState *nc, bool enable)
  {
      if (!nc || !nc->info->using_vnet_hdr) {
@@ -532,6 +541,15 @@ void qemu_set_offload(NetClientState *nc, int csum, int 
tso4, int tso6,
      nc->info->set_offload(nc, csum, tso4, tso6, ecn, ufo);
  }
+int qemu_get_vnet_hdr_len(NetClientState *nc)
+{
+    if (!nc || !nc->info->get_vnet_hdr_len) {
+        return -ENOSYS;

Does -ENOSYS provides any value? Otherwise we could return 0.

+    }
+
+    return nc->info->get_vnet_hdr_len(nc);
+}

diff --git a/net/netmap.c b/net/netmap.c
index 9e0cec58d3..ed9c7ec948 100644
--- a/net/netmap.c
+++ b/net/netmap.c
@@ -393,6 +393,7 @@ static NetClientInfo net_netmap_info = {
      .has_ufo = netmap_has_vnet_hdr,
      .has_vnet_hdr = netmap_has_vnet_hdr,
      .has_vnet_hdr_len = netmap_has_vnet_hdr_len,
+    .get_using_vnet_hdr = netmap_get_using_vnet_hdr,

On what is this patch based? I don't have netmap_get_using_vnet_hdr().

      .using_vnet_hdr = netmap_using_vnet_hdr,
      .set_offload = netmap_set_offload,
      .set_vnet_hdr_len = netmap_set_vnet_hdr_len,




reply via email to

[Prev in Thread] Current Thread [Next in Thread]