Introduce two new optional properties for filter-redirector:
- in_netdev: specifies a TAP netdev to capture packets from using
  AF_PACKET sockets
- out_netdev: specifies a netdev to inject packets into using
  AF_PACKET sockets

These properties enable filter-redirector to work with vhost-net
backends by bypassing the QEMU network stack entirely. Instead of
relying on chardev sockets (indev/outdev), the redirector can
directly capture/inject packets at the host TAP interface level.

The in_netdev and out_netdev are mutually exclusive with each other
and with their chardev counterparts (indev/outdev) on the same
direction.

Signed-off-by: Cindy Lu <[email protected]>
---
 net/filter-mirror.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/net/filter-mirror.c b/net/filter-mirror.c
index ab711e8835..37035f3892 100644
--- a/net/filter-mirror.c
+++ b/net/filter-mirror.c
@@ -40,6 +40,8 @@ struct MirrorState {
     NetFilterState parent_obj;
     char *indev;
     char *outdev;
+    char *in_netdev;
+    char *out_netdev;
     CharFrontend chr_in;
     CharFrontend chr_out;
     SocketReadState rs;
@@ -510,6 +512,40 @@ static void filter_redirector_set_outdev(Object *obj,
     s->outdev = g_strdup(value);
 }
 
+static char *filter_redirector_get_in_netdev(Object *obj, Error **errp)
+{
+    MirrorState *s = FILTER_REDIRECTOR(obj);
+
+    return g_strdup(s->in_netdev);
+}
+
+static void filter_redirector_set_in_netdev(Object *obj,
+                                            const char *value,
+                                            Error **errp)
+{
+    MirrorState *s = FILTER_REDIRECTOR(obj);
+
+    g_free(s->in_netdev);
+    s->in_netdev = g_strdup(value);
+}
+
+static char *filter_redirector_get_out_netdev(Object *obj, Error **errp)
+{
+    MirrorState *s = FILTER_REDIRECTOR(obj);
+
+    return g_strdup(s->out_netdev);
+}
+
+static void filter_redirector_set_out_netdev(Object *obj,
+                                             const char *value,
+                                             Error **errp)
+{
+    MirrorState *s = FILTER_REDIRECTOR(obj);
+
+    g_free(s->out_netdev);
+    s->out_netdev = g_strdup(value);
+}
+
 static bool filter_redirector_get_vnet_hdr(Object *obj, Error **errp)
 {
     MirrorState *s = FILTER_REDIRECTOR(obj);
@@ -597,6 +633,12 @@ static void filter_redirector_class_init(ObjectClass *oc, 
const void *data)
                                   filter_redirector_set_indev);
     object_class_property_add_str(oc, "outdev", filter_redirector_get_outdev,
                                   filter_redirector_set_outdev);
+    object_class_property_add_str(oc, "in_netdev",
+                                  filter_redirector_get_in_netdev,
+                                  filter_redirector_set_in_netdev);
+    object_class_property_add_str(oc, "out_netdev",
+                                  filter_redirector_get_out_netdev,
+                                  filter_redirector_set_out_netdev);
     object_class_property_add_bool(oc, "vnet_hdr_support",
                                    filter_redirector_get_vnet_hdr,
                                    filter_redirector_set_vnet_hdr);
@@ -638,6 +680,8 @@ static void filter_redirector_fini(Object *obj)
 
     g_free(s->indev);
     g_free(s->outdev);
+    g_free(s->in_netdev);
+    g_free(s->out_netdev);
 }
 
 static const TypeInfo filter_redirector_info = {
-- 
2.52.0


Reply via email to