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 <lulu@redhat.com>
---
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