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
