[PATCH v2 12/20] net/tap: net_init_tap_one(): support bridge

Vladimir Sementsov-Ogievskiy posted 20 patches 2 months, 3 weeks ago
Maintainers: Jason Wang <jasowang@redhat.com>
There is a newer version of this series
[PATCH v2 12/20] net/tap: net_init_tap_one(): support bridge
Posted by Vladimir Sementsov-Ogievskiy 2 months, 3 weeks ago
Use net_init_tap_one() in net_init_bridge().

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 net/tap.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/net/tap.c b/net/tap.c
index 468dae7004..5acfb128a1 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -88,6 +88,12 @@ static void launch_script(const char *setup_script, const char *ifname,
 static void tap_send(void *opaque);
 static void tap_writable(void *opaque);
 
+static int net_init_tap_one(const Netdev *netdev, NetClientState *peer,
+                            const char *model, const char *name,
+                            const char *ifname, const char *script,
+                            const char *downscript, const char *vhostfdname,
+                            int vnet_hdr, int fd, Error **errp);
+
 static void tap_update_fd_handler(TAPState *s)
 {
     qemu_set_fd_handler(s->fd,
@@ -626,8 +632,7 @@ int net_init_bridge(const Netdev *netdev, const char *name,
 {
     const NetdevBridgeOptions *bridge;
     const char *helper, *br;
-    TAPState *s;
-    int fd, vnet_hdr;
+    int fd, vnet_hdr, ret;
 
     assert(netdev->type == NET_CLIENT_DRIVER_BRIDGE);
     bridge = &netdev->u.bridge;
@@ -648,9 +653,14 @@ int net_init_bridge(const Netdev *netdev, const char *name,
         close(fd);
         return -1;
     }
-    s = net_tap_fd_init(peer, "bridge", name, fd, vnet_hdr);
 
-    qemu_set_info_str(&s->nc, "helper=%s,br=%s", helper, br);
+    ret = net_init_tap_one(netdev, peer, "bridge", name,
+                           NULL, NULL, NULL,
+                           NULL, vnet_hdr, fd, errp);
+    if (ret < 0) {
+        close(fd);
+        return -1;
+    }
 
     return 0;
 }
@@ -698,11 +708,19 @@ static int net_init_tap_one(const Netdev *netdev, NetClientState *peer,
                             const char *downscript, const char *vhostfdname,
                             int vnet_hdr, int fd, Error **errp)
 {
-    const NetdevTapOptions *tap = &netdev->u.tap;
+    const NetdevTapOptions *tap;
     TAPState *s = net_tap_fd_init(peer, model, name, fd, vnet_hdr);
     int vhostfd;
 
+    if (netdev->type == NET_CLIENT_DRIVER_BRIDGE) {
+        const NetdevBridgeOptions *bridge = &netdev->u.bridge;
+        qemu_set_info_str(&s->nc, "helper=%s,br=%s",
+                          bridge->helper, bridge->br);
+        return 0;
+    }
+
     assert(netdev->type == NET_CLIENT_DRIVER_TAP);
+    tap = &netdev->u.tap;
 
     if (tap_set_sndbuf(s->fd, tap, errp) < 0) {
         goto failed;
-- 
2.48.1
Re: [PATCH v2 12/20] net/tap: net_init_tap_one(): support bridge
Posted by Jason Wang 2 months, 1 week ago
On Sun, Aug 24, 2025 at 12:03 AM Vladimir Sementsov-Ogievskiy
<vsementsov@yandex-team.ru> wrote:
>
> Use net_init_tap_one() in net_init_bridge().

Need to explain why this is needed.

Patch looks good.

Thanks

>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> ---
>  net/tap.c | 28 +++++++++++++++++++++++-----
>  1 file changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/net/tap.c b/net/tap.c
> index 468dae7004..5acfb128a1 100644
> --- a/net/tap.c
> +++ b/net/tap.c
> @@ -88,6 +88,12 @@ static void launch_script(const char *setup_script, const char *ifname,
>  static void tap_send(void *opaque);
>  static void tap_writable(void *opaque);
>
> +static int net_init_tap_one(const Netdev *netdev, NetClientState *peer,
> +                            const char *model, const char *name,
> +                            const char *ifname, const char *script,
> +                            const char *downscript, const char *vhostfdname,
> +                            int vnet_hdr, int fd, Error **errp);
> +
>  static void tap_update_fd_handler(TAPState *s)
>  {
>      qemu_set_fd_handler(s->fd,
> @@ -626,8 +632,7 @@ int net_init_bridge(const Netdev *netdev, const char *name,
>  {
>      const NetdevBridgeOptions *bridge;
>      const char *helper, *br;
> -    TAPState *s;
> -    int fd, vnet_hdr;
> +    int fd, vnet_hdr, ret;
>
>      assert(netdev->type == NET_CLIENT_DRIVER_BRIDGE);
>      bridge = &netdev->u.bridge;
> @@ -648,9 +653,14 @@ int net_init_bridge(const Netdev *netdev, const char *name,
>          close(fd);
>          return -1;
>      }
> -    s = net_tap_fd_init(peer, "bridge", name, fd, vnet_hdr);
>
> -    qemu_set_info_str(&s->nc, "helper=%s,br=%s", helper, br);
> +    ret = net_init_tap_one(netdev, peer, "bridge", name,
> +                           NULL, NULL, NULL,
> +                           NULL, vnet_hdr, fd, errp);
> +    if (ret < 0) {
> +        close(fd);
> +        return -1;
> +    }
>
>      return 0;
>  }
> @@ -698,11 +708,19 @@ static int net_init_tap_one(const Netdev *netdev, NetClientState *peer,
>                              const char *downscript, const char *vhostfdname,
>                              int vnet_hdr, int fd, Error **errp)
>  {
> -    const NetdevTapOptions *tap = &netdev->u.tap;
> +    const NetdevTapOptions *tap;
>      TAPState *s = net_tap_fd_init(peer, model, name, fd, vnet_hdr);
>      int vhostfd;
>
> +    if (netdev->type == NET_CLIENT_DRIVER_BRIDGE) {
> +        const NetdevBridgeOptions *bridge = &netdev->u.bridge;
> +        qemu_set_info_str(&s->nc, "helper=%s,br=%s",
> +                          bridge->helper, bridge->br);
> +        return 0;
> +    }
> +
>      assert(netdev->type == NET_CLIENT_DRIVER_TAP);
> +    tap = &netdev->u.tap;
>
>      if (tap_set_sndbuf(s->fd, tap, errp) < 0) {
>          goto failed;
> --
> 2.48.1
>
Re: [PATCH v2 12/20] net/tap: net_init_tap_one(): support bridge
Posted by Vladimir Sementsov-Ogievskiy 2 months, 1 week ago
On 03.09.25 08:28, Jason Wang wrote:
> On Sun, Aug 24, 2025 at 12:03 AM Vladimir Sementsov-Ogievskiy
> <vsementsov@yandex-team.ru> wrote:
>>
>> Use net_init_tap_one() in net_init_bridge().
> 
> Need to explain why this is needed.
> 

Oh, right. It took a minute for me to remember)

Will add:

To be able in further commits use net_init_bridge for "bridge" case of init_tap,
as it almost the same, but requires tap-related things in net_init_tap_one.

> 
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
>> ---
>>   net/tap.c | 28 +++++++++++++++++++++++-----
>>   1 file changed, 23 insertions(+), 5 deletions(-)
>>
>> diff --git a/net/tap.c b/net/tap.c
>> index 468dae7004..5acfb128a1 100644
>> --- a/net/tap.c
>> +++ b/net/tap.c
>> @@ -88,6 +88,12 @@ static void launch_script(const char *setup_script, const char *ifname,
>>   static void tap_send(void *opaque);
>>   static void tap_writable(void *opaque);
>>
>> +static int net_init_tap_one(const Netdev *netdev, NetClientState *peer,
>> +                            const char *model, const char *name,
>> +                            const char *ifname, const char *script,
>> +                            const char *downscript, const char *vhostfdname,
>> +                            int vnet_hdr, int fd, Error **errp);
>> +
>>   static void tap_update_fd_handler(TAPState *s)
>>   {
>>       qemu_set_fd_handler(s->fd,
>> @@ -626,8 +632,7 @@ int net_init_bridge(const Netdev *netdev, const char *name,
>>   {
>>       const NetdevBridgeOptions *bridge;
>>       const char *helper, *br;
>> -    TAPState *s;
>> -    int fd, vnet_hdr;
>> +    int fd, vnet_hdr, ret;
>>
>>       assert(netdev->type == NET_CLIENT_DRIVER_BRIDGE);
>>       bridge = &netdev->u.bridge;
>> @@ -648,9 +653,14 @@ int net_init_bridge(const Netdev *netdev, const char *name,
>>           close(fd);
>>           return -1;
>>       }
>> -    s = net_tap_fd_init(peer, "bridge", name, fd, vnet_hdr);
>>
>> -    qemu_set_info_str(&s->nc, "helper=%s,br=%s", helper, br);
>> +    ret = net_init_tap_one(netdev, peer, "bridge", name,
>> +                           NULL, NULL, NULL,
>> +                           NULL, vnet_hdr, fd, errp);
>> +    if (ret < 0) {
>> +        close(fd);
>> +        return -1;
>> +    }
>>
>>       return 0;
>>   }
>> @@ -698,11 +708,19 @@ static int net_init_tap_one(const Netdev *netdev, NetClientState *peer,
>>                               const char *downscript, const char *vhostfdname,
>>                               int vnet_hdr, int fd, Error **errp)
>>   {
>> -    const NetdevTapOptions *tap = &netdev->u.tap;
>> +    const NetdevTapOptions *tap;
>>       TAPState *s = net_tap_fd_init(peer, model, name, fd, vnet_hdr);
>>       int vhostfd;
>>
>> +    if (netdev->type == NET_CLIENT_DRIVER_BRIDGE) {
>> +        const NetdevBridgeOptions *bridge = &netdev->u.bridge;
>> +        qemu_set_info_str(&s->nc, "helper=%s,br=%s",
>> +                          bridge->helper, bridge->br);
>> +        return 0;
>> +    }
>> +
>>       assert(netdev->type == NET_CLIENT_DRIVER_TAP);
>> +    tap = &netdev->u.tap;
>>
>>       if (tap_set_sndbuf(s->fd, tap, errp) < 0) {
>>           goto failed;
>> --
>> 2.48.1
>>
> 


-- 
Best regards,
Vladimir