Message ID | 20210617143246.55336-3-yaroshchuk2000@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add vmnet.framework based network backend | expand |
On Thu, Jun 17, 2021 at 05:32:41PM +0300, Vladislav Yaroshchuk wrote: > Created separate netdev per each vmnet operating mode > because they use quite different settings. Especially since > macOS 11.0 (vmnet.framework API gets lots of updates) > > Three new netdevs are added: > - vmnet-host > - vmnet-shared > - vmnet-bridged > > Signed-off-by: Vladislav Yaroshchuk <yaroshchuk2000@gmail.com> > --- > +++ b/qapi/net.json > @@ -452,6 +452,89 @@ > '*vhostdev': 'str', > '*queues': 'int' } } > > +## > +# @NetdevVmnetHostOptions: > +# > +# vmnet (host mode) network backend. > +# > +# Allows the vmnet interface to communicate with > +# other vmnet interfaces that are in host mode and also with the native host. > +# > +# @dhcpstart: The starting IPv4 address to use for the interface. Must be in the > +# private IP range (RFC 1918). Must be specified along > +# with @dhcpend and @subnetmask. > +# This address is used as the gateway address. The subsequent address > +# up to and including dhcpend are placed in the DHCP pool. > +# > +# @dhcpend: The DHCP IPv4 range end address to use for the interface. Must be in > +# the private IP range (RFC 1918). Must be specified along > +# with @dhcpstart and @subnetmask. > +# > +# @subnetmask: The IPv4 subnet mask to use on the interface. Must be specified > +# along with @dhcpstart and @subnetmask. > +# > +# > +# Since: 6.1, > +## Same comments about 6.1 vs. 6.2 as before (I'll quit pointing it out). Spurious trailing comma. > +{ 'struct': 'NetdevVmnetHostOptions', > + 'data': { > + '*dhcpstart': 'str', > + '*dhcpend': 'str', > + '*subnetmask': 'str' Hmm. You listed all three as optional, but document that they must all be specified together. Why not just make them all required, and simplify the documentation? > + }, > + 'if': 'defined(CONFIG_VMNET)' } > + > +## > +# @NetdevVmnetSharedOptions: > +# > +# vmnet (shared mode) network backend. > +# > +# Allows traffic originating from the vmnet interface to reach the > +# Internet through a network address translator (NAT). The vmnet interface > +# can also communicate with the native host. By default, the vmnet interface > +# is able to communicate with other shared mode interfaces. If a subnet range > +# is specified, the vmnet interface can communicate with other shared mode > +# interfaces on the same subnet. > +# > +# @dhcpstart: The starting IPv4 address to use for the interface. Must be in the > +# private IP range (RFC 1918). Must be specified along > +# with @dhcpend and @subnetmask. > +# This address is used as the gateway address. The subsequent address > +# up to and including dhcpend are placed in the DHCP pool. Spurious double space. > +# > +# @dhcpend: The DHCP IPv4 range end address to use for the interface. Must be in > +# the private IP range (RFC 1918). Must be specified along > +# with @dhcpstart and @subnetmask. > +# > +# @subnetmask: The IPv4 subnet mask to use on the interface. Must be specified > +# along with @dhcpstart and @subnetmask. > +# > +# > +# Since: 6.1, > +## > +{ 'struct': 'NetdevVmnetSharedOptions', > + 'data': { > + '*dhcpstart': 'str', > + '*dhcpend': 'str', > + '*subnetmask': 'str' > + }, > + 'if': 'defined(CONFIG_VMNET)' } > + > +## > +# @NetdevVmnetBridgedOptions: > +# > +# vmnet (bridged mode) network backend. > +# > +# Bridges the vmnet interface with a physical network interface. > +# > +# @ifname: The name of the physical interface to be bridged. > +# > +# Since: 6.1 > +## > +{ 'struct': 'NetdevVmnetBridgedOptions', > + 'data': { 'ifname': 'str' }, > + 'if': 'defined(CONFIG_VMNET)' } > + > ## > # @NetClientDriver: > # > @@ -460,11 +543,16 @@ > # Since: 2.7 > # > # @vhost-vdpa since 5.1 > -# @vmnet since 6.1 Why are you dropping vmnet? Especially since you just added it in the previous patch? That feels like needless churn. > +# @vmnet-host since 6.1 > +# @vmnet-shared since 6.1 > +# @vmnet-bridged since 6.1 > ## > { 'enum': 'NetClientDriver', > 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'vde', > - 'bridge', 'hubport', 'netmap', 'vhost-user', 'vhost-vdpa', 'vmnet' ] } > + 'bridge', 'hubport', 'netmap', 'vhost-user', 'vhost-vdpa', > + { 'name': 'vmnet-host', 'if': 'defined(CONFIG_VMNET)' }, > + { 'name': 'vmnet-shared', 'if': 'defined(CONFIG_VMNET)' }, > + { 'name': 'vmnet-bridged', 'if': 'defined(CONFIG_VMNET)' }] }
Hi Eric, Thank you for your review. сб, 7 авг. 2021 г. в 00:19, Eric Blake <eblake@redhat.com>: > On Thu, Jun 17, 2021 at 05:32:41PM +0300, Vladislav Yaroshchuk wrote: > > Created separate netdev per each vmnet operating mode > > because they use quite different settings. Especially since > > macOS 11.0 (vmnet.framework API gets lots of updates) > > > > Three new netdevs are added: > > - vmnet-host > > - vmnet-shared > > - vmnet-bridged > > > > Signed-off-by: Vladislav Yaroshchuk <yaroshchuk2000@gmail.com> > > --- > > > +++ b/qapi/net.json > > @@ -452,6 +452,89 @@ > > '*vhostdev': 'str', > > '*queues': 'int' } } > > > > +## > > +# @NetdevVmnetHostOptions: > > +# > > +# vmnet (host mode) network backend. > > +# > > +# Allows the vmnet interface to communicate with > > +# other vmnet interfaces that are in host mode and also with the native > host. > > +# > > +# @dhcpstart: The starting IPv4 address to use for the interface. Must > be in the > > +# private IP range (RFC 1918). Must be specified along > > +# with @dhcpend and @subnetmask. > > +# This address is used as the gateway address. The > subsequent address > > +# up to and including dhcpend are placed in the DHCP pool. > > +# > > +# @dhcpend: The DHCP IPv4 range end address to use for the interface. > Must be in > > +# the private IP range (RFC 1918). Must be specified along > > +# with @dhcpstart and @subnetmask. > > +# > > +# @subnetmask: The IPv4 subnet mask to use on the interface. Must be > specified > > +# along with @dhcpstart and @subnetmask. > > +# > > +# > > +# Since: 6.1, > > +## > > Same comments about 6.1 vs. 6.2 as before (I'll quit pointing it out). > Spurious trailing comma. > > > +{ 'struct': 'NetdevVmnetHostOptions', > > + 'data': { > > + '*dhcpstart': 'str', > > + '*dhcpend': 'str', > > + '*subnetmask': 'str' > > Hmm. You listed all three as optional, but document that they must all > be specified together. Why not just make them all required, and > simplify the documentation? > > All three options can be not specified at all, or, if specified, must be used all together. It's the user's choice to adjust DHCP settings or leave it for vmnet.framework. `-netdev vmnet-host` is correct and `-netdev vmnet-host,dhcpstart="..",dhcpend="..",subnetmask=".."` is correct too. So we can't make all the options required > > + }, > > + 'if': 'defined(CONFIG_VMNET)' } > > + > > +## > > +# @NetdevVmnetSharedOptions: > > +# > > +# vmnet (shared mode) network backend. > > +# > > +# Allows traffic originating from the vmnet interface to reach the > > +# Internet through a network address translator (NAT). The vmnet > interface > > +# can also communicate with the native host. By default, the vmnet > interface > > +# is able to communicate with other shared mode interfaces. If a subnet > range > > +# is specified, the vmnet interface can communicate with other shared > mode > > +# interfaces on the same subnet. > > +# > > +# @dhcpstart: The starting IPv4 address to use for the interface. Must > be in the > > +# private IP range (RFC 1918). Must be specified along > > +# with @dhcpend and @subnetmask. > > +# This address is used as the gateway address. The > subsequent address > > +# up to and including dhcpend are placed in the DHCP pool. > > Spurious double space. > > > +# > > +# @dhcpend: The DHCP IPv4 range end address to use for the interface. > Must be in > > +# the private IP range (RFC 1918). Must be specified along > > +# with @dhcpstart and @subnetmask. > > +# > > +# @subnetmask: The IPv4 subnet mask to use on the interface. Must be > specified > > +# along with @dhcpstart and @subnetmask. > > +# > > +# > > +# Since: 6.1, > > +## > > +{ 'struct': 'NetdevVmnetSharedOptions', > > + 'data': { > > + '*dhcpstart': 'str', > > + '*dhcpend': 'str', > > + '*subnetmask': 'str' > > + }, > > + 'if': 'defined(CONFIG_VMNET)' } > > + > > +## > > +# @NetdevVmnetBridgedOptions: > > +# > > +# vmnet (bridged mode) network backend. > > +# > > +# Bridges the vmnet interface with a physical network interface. > > +# > > +# @ifname: The name of the physical interface to be bridged. > > +# > > +# Since: 6.1 > > +## > > +{ 'struct': 'NetdevVmnetBridgedOptions', > > + 'data': { 'ifname': 'str' }, > > + 'if': 'defined(CONFIG_VMNET)' } > > + > > ## > > # @NetClientDriver: > > # > > @@ -460,11 +543,16 @@ > > # Since: 2.7 > > # > > # @vhost-vdpa since 5.1 > > -# @vmnet since 6.1 > > Why are you dropping vmnet? Especially since you just added it in the > previous patch? That feels like needless churn. > > Yep, that was my mistake, on that stage I decided to create separate backends for each vmnet operational mode. Will remove redundant change the next series. > +# @vmnet-host since 6.1 > > +# @vmnet-shared since 6.1 > > +# @vmnet-bridged since 6.1 > > ## > > { 'enum': 'NetClientDriver', > > 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'vde', > > - 'bridge', 'hubport', 'netmap', 'vhost-user', 'vhost-vdpa', > 'vmnet' ] } > > + 'bridge', 'hubport', 'netmap', 'vhost-user', 'vhost-vdpa', > > + { 'name': 'vmnet-host', 'if': 'defined(CONFIG_VMNET)' }, > > + { 'name': 'vmnet-shared', 'if': 'defined(CONFIG_VMNET)' }, > > + { 'name': 'vmnet-bridged', 'if': 'defined(CONFIG_VMNET)' }] > } > > -- > Eric Blake, Principal Software Engineer > Red Hat, Inc. +1-919-301-3266 > Virtualization: qemu.org | libvirt.org > > Will fix all other issues asap, thank you! Regards, Vladislav
diff --git a/net/clients.h b/net/clients.h index ac19843aab..c9157789f2 100644 --- a/net/clients.h +++ b/net/clients.h @@ -64,7 +64,14 @@ int net_init_vhost_user(const Netdev *netdev, const char *name, int net_init_vhost_vdpa(const Netdev *netdev, const char *name, NetClientState *peer, Error **errp); #ifdef CONFIG_VMNET -int net_init_vmnet(const Netdev *netdev, const char *name, +int net_init_vmnet_host(const Netdev *netdev, const char *name, NetClientState *peer, Error **errp); -#endif + +int net_init_vmnet_shared(const Netdev *netdev, const char *name, + NetClientState *peer, Error **errp); + +int net_init_vmnet_bridged(const Netdev *netdev, const char *name, + NetClientState *peer, Error **errp); +#endif /* CONFIG_VMNET */ + #endif /* QEMU_NET_CLIENTS_H */ diff --git a/net/net.c b/net/net.c index 645c52ef6e..87a6f96665 100644 --- a/net/net.c +++ b/net/net.c @@ -1002,8 +1002,10 @@ static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])( [NET_CLIENT_DRIVER_L2TPV3] = net_init_l2tpv3, #endif #ifdef CONFIG_VMNET - [NET_CLIENT_DRIVER_VMNET] = net_init_vmnet, -#endif + [NET_CLIENT_DRIVER_VMNET_HOST] = net_init_vmnet_host, + [NET_CLIENT_DRIVER_VMNET_SHARED] = net_init_vmnet_shared, + [NET_CLIENT_DRIVER_VMNET_BRIDGED] = net_init_vmnet_bridged, +#endif /* CONFIG_VMNET */ }; @@ -1091,7 +1093,9 @@ void show_netdevs(void) "vhost-vdpa", #endif #ifdef CONFIG_VMNET - "vmnet", + "vmnet-host", + "vmnet-shared", + "vmnet-bridged", #endif }; diff --git a/net/vmnet.c b/net/vmnet.c index f8b64e2a27..3f25afd7e8 100644 --- a/net/vmnet.c +++ b/net/vmnet.c @@ -15,7 +15,19 @@ #include <vmnet/vmnet.h> -int net_init_vmnet(const Netdev *netdev, const char *name, +int net_init_vmnet_host(const Netdev *netdev, const char *name, + NetClientState *peer, Error **errp) { + error_setg(errp, "vmnet is not implemented yet"); + return -1; +} + +int net_init_vmnet_shared(const Netdev *netdev, const char *name, + NetClientState *peer, Error **errp) { + error_setg(errp, "vmnet is not implemented yet"); + return -1; +} + +int net_init_vmnet_bridged(const Netdev *netdev, const char *name, NetClientState *peer, Error **errp) { error_setg(errp, "vmnet is not implemented yet"); return -1; diff --git a/qapi/net.json b/qapi/net.json index c5de234e2c..a548d7a7f4 100644 --- a/qapi/net.json +++ b/qapi/net.json @@ -452,6 +452,89 @@ '*vhostdev': 'str', '*queues': 'int' } } +## +# @NetdevVmnetHostOptions: +# +# vmnet (host mode) network backend. +# +# Allows the vmnet interface to communicate with +# other vmnet interfaces that are in host mode and also with the native host. +# +# @dhcpstart: The starting IPv4 address to use for the interface. Must be in the +# private IP range (RFC 1918). Must be specified along +# with @dhcpend and @subnetmask. +# This address is used as the gateway address. The subsequent address +# up to and including dhcpend are placed in the DHCP pool. +# +# @dhcpend: The DHCP IPv4 range end address to use for the interface. Must be in +# the private IP range (RFC 1918). Must be specified along +# with @dhcpstart and @subnetmask. +# +# @subnetmask: The IPv4 subnet mask to use on the interface. Must be specified +# along with @dhcpstart and @subnetmask. +# +# +# Since: 6.1, +## +{ 'struct': 'NetdevVmnetHostOptions', + 'data': { + '*dhcpstart': 'str', + '*dhcpend': 'str', + '*subnetmask': 'str' + }, + 'if': 'defined(CONFIG_VMNET)' } + +## +# @NetdevVmnetSharedOptions: +# +# vmnet (shared mode) network backend. +# +# Allows traffic originating from the vmnet interface to reach the +# Internet through a network address translator (NAT). The vmnet interface +# can also communicate with the native host. By default, the vmnet interface +# is able to communicate with other shared mode interfaces. If a subnet range +# is specified, the vmnet interface can communicate with other shared mode +# interfaces on the same subnet. +# +# @dhcpstart: The starting IPv4 address to use for the interface. Must be in the +# private IP range (RFC 1918). Must be specified along +# with @dhcpend and @subnetmask. +# This address is used as the gateway address. The subsequent address +# up to and including dhcpend are placed in the DHCP pool. +# +# @dhcpend: The DHCP IPv4 range end address to use for the interface. Must be in +# the private IP range (RFC 1918). Must be specified along +# with @dhcpstart and @subnetmask. +# +# @subnetmask: The IPv4 subnet mask to use on the interface. Must be specified +# along with @dhcpstart and @subnetmask. +# +# +# Since: 6.1, +## +{ 'struct': 'NetdevVmnetSharedOptions', + 'data': { + '*dhcpstart': 'str', + '*dhcpend': 'str', + '*subnetmask': 'str' + }, + 'if': 'defined(CONFIG_VMNET)' } + +## +# @NetdevVmnetBridgedOptions: +# +# vmnet (bridged mode) network backend. +# +# Bridges the vmnet interface with a physical network interface. +# +# @ifname: The name of the physical interface to be bridged. +# +# Since: 6.1 +## +{ 'struct': 'NetdevVmnetBridgedOptions', + 'data': { 'ifname': 'str' }, + 'if': 'defined(CONFIG_VMNET)' } + ## # @NetClientDriver: # @@ -460,11 +543,16 @@ # Since: 2.7 # # @vhost-vdpa since 5.1 -# @vmnet since 6.1 +# @vmnet-host since 6.1 +# @vmnet-shared since 6.1 +# @vmnet-bridged since 6.1 ## { 'enum': 'NetClientDriver', 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'vde', - 'bridge', 'hubport', 'netmap', 'vhost-user', 'vhost-vdpa', 'vmnet' ] } + 'bridge', 'hubport', 'netmap', 'vhost-user', 'vhost-vdpa', + { 'name': 'vmnet-host', 'if': 'defined(CONFIG_VMNET)' }, + { 'name': 'vmnet-shared', 'if': 'defined(CONFIG_VMNET)' }, + { 'name': 'vmnet-bridged', 'if': 'defined(CONFIG_VMNET)' }] } ## # @Netdev: @@ -478,6 +566,9 @@ # Since: 1.2 # # 'l2tpv3' - since 2.1 +# 'vmnet-host' - since 6.1 +# 'vmnet-shared' - since 6.1 +# 'vmnet-bridged' - since 6.1 ## { 'union': 'Netdev', 'base': { 'id': 'str', 'type': 'NetClientDriver' }, @@ -493,7 +584,10 @@ 'hubport': 'NetdevHubPortOptions', 'netmap': 'NetdevNetmapOptions', 'vhost-user': 'NetdevVhostUserOptions', - 'vhost-vdpa': 'NetdevVhostVDPAOptions' } } + 'vhost-vdpa': 'NetdevVhostVDPAOptions', + 'vmnet-host': 'NetdevVmnetHostOptions', + 'vmnet-shared': 'NetdevVmnetSharedOptions', + 'vmnet-bridged': 'NetdevVmnetBridgedOptions' } } ## # @RxState:
Created separate netdev per each vmnet operating mode because they use quite different settings. Especially since macOS 11.0 (vmnet.framework API gets lots of updates) Three new netdevs are added: - vmnet-host - vmnet-shared - vmnet-bridged Signed-off-by: Vladislav Yaroshchuk <yaroshchuk2000@gmail.com> --- net/clients.h | 11 +++++- net/net.c | 10 +++-- net/vmnet.c | 14 ++++++- qapi/net.json | 100 ++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 126 insertions(+), 9 deletions(-)