Laurent Vivier <lviv...@redhat.com> writes: > This commit introduces support for passt as a new network backend. > passt is an unprivileged, user-mode networking solution that provides > connectivity for virtual machines by launching an external helper process. > > The implementation reuses the generic stream data handling logic. It > launches the passt binary using GSubprocess, passing it a file > descriptor from a socketpair() for communication. QEMU connects to > the other end of the socket pair to establish the network data stream. > > The PID of the passt daemon is tracked via a temporary file to > ensure it is terminated when QEMU exits. > > Signed-off-by: Laurent Vivier <lviv...@redhat.com>
[...] > diff --git a/qapi/net.json b/qapi/net.json > index 97ea1839813b..76d7654414f7 100644 > --- a/qapi/net.json > +++ b/qapi/net.json > @@ -112,6 +112,125 @@ > 'data': { > 'str': 'str' } } > > +## > +# @NetDevPasstOptions: > +# > +# Unprivileged user-mode network connectivity using passt > +# > +# @path: path to passt binary I'd prefer a more descriptive name. Elsewhere in this file, we refer to programs like this: # @script: script to initialize the interface # # @downscript: script to shut down the interface passt isn't a script, of course. I don't know, perhaps # @passt-filename: the passt program to run. or even # @passt: Filename of the passt program to run. > +# > +# @quiet: don't print informational messages What does the printing? A peek at the code I snipped suggests this flag is passed to the passt binary as --quiet. Correct? > +# > +# @debug: be verbose > +# > +# @trace: extra verbose Likewise for these two. > +# > +# @vhost-user: enable vhost-user > +# > +# @pcap-file: log traffic to pcap file > +# > +# @mtu: assign MTU via DHCP/NDP > +# > +# @address: IPv4 or IPv6 address > +# > +# @netmask: IPv4 mask > +# > +# @mac: source MAC address > +# > +# @gateway: IPv4 or IPv6 address as gateway > +# > +# @interface: interface for addresses and routes > +# > +# @outbound: bind to address as outbound source > +# > +# @outbound-if4: bind to outbound interface for IPv4 > +# > +# @outbound-if6: bind to outbound interface for IPv6 > +# > +# @dns: IPv4 or IPv6 address as DNS > +# > +# @search: search domains > +# > +# @fqdn: FQDN to configure client with > +# > +# @dhcp-dns: enable/disable DNS list in DHCP/DHCPv6/NDP > +# > +# @dhcp-search: enable/disable list in DHCP/DHCPv6/NDP > +# > +# @map-host-loopback: addresse to refer to host > +# > +# @map-guest-addr: addr to translate to guest's address > +# > +# @dns-forward: forward DNS queries sent to > +# > +# @dns-host: host nameserver to direct queries to > +# > +# @tcp: enable/disable TCP > +# > +# @udp: enable/disable UDP > +# > +# @icmp: enable/disable ICMP > +# > +# @dhcp: enable/disable DHCP > +# > +# @ndp: enable/disable NDP > +# > +# @dhcpv6: enable/disable DHCPv6 > +# > +# @ra: enable/disable route advertisements > +# > +# @freebind: bind to any address for forwarding > +# > +# @ipv4: enable/disable IPv4 > +# > +# @ipv6: enable/disable IPv6 > +# > +# @tcp-ports: TCP ports to forward > +# > +# @udp-ports: UDP ports to forward Is there anything in this struct that configures qemu-system-FOO itself, i.e. isn't just passed to passt? > +# > +# Since: 10.1 > +## > +{ 'struct': 'NetDevPasstOptions', > + 'data': { > + '*path': 'str', > + '*quiet': 'bool', > + '*debug': 'bool', > + '*trace': 'bool', > + '*vhost-user': 'bool', > + '*pcap-file': 'str', > + '*mtu': 'int', > + '*address': 'str', > + '*netmask': 'str', > + '*mac': 'str', > + '*gateway': 'str', > + '*interface': 'str', > + '*outbound': 'str', > + '*outbound-if4': 'str', > + '*outbound-if6': 'str', > + '*dns': 'str', > + '*search': ['String'], > + '*fqdn': 'str', > + '*dhcp-dns': 'bool', > + '*dhcp-search': 'bool', > + '*map-host-loopback': 'str', > + '*map-guest-addr': 'str', > + '*dns-forward': 'str', > + '*dns-host': 'str', > + '*tcp': 'bool', > + '*udp': 'bool', > + '*icmp': 'bool', > + '*dhcp': 'bool', > + '*ndp': 'bool', > + '*dhcpv6': 'bool', > + '*ra': 'bool', > + '*freebind': 'bool', > + '*ipv4': 'bool', > + '*ipv6': 'bool', > + '*tcp-ports': ['String'], > + '*udp-ports': ['String'] }, > + 'if': 'CONFIG_PASST' } > + > ## > # @NetdevUserOptions: > # > @@ -729,12 +848,15 @@ > # > # @af-xdp: since 8.2 > # > +# @passt: since 10.1 > +# > # Since: 2.7 > ## > { 'enum': 'NetClientDriver', > 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'stream', > 'dgram', 'vde', 'bridge', 'hubport', 'netmap', 'vhost-user', > 'vhost-vdpa', > + { 'name': 'passt', 'if': 'CONFIG_PASST' }, > { 'name': 'af-xdp', 'if': 'CONFIG_AF_XDP' }, > { 'name': 'vmnet-host', 'if': 'CONFIG_VMNET' }, > { 'name': 'vmnet-shared', 'if': 'CONFIG_VMNET' }, > @@ -756,6 +878,8 @@ > 'discriminator': 'type', > 'data': { > 'nic': 'NetLegacyNicOptions', > + 'passt': { 'type': 'NetDevPasstOptions', > + 'if': 'CONFIG_PASST' }, > 'user': 'NetdevUserOptions', > 'tap': 'NetdevTapOptions', > 'l2tpv3': 'NetdevL2TPv3Options', > diff --git a/qemu-options.hx b/qemu-options.hx > index 1f862b19a676..4787f9309c69 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -2796,6 +2796,18 @@ DEFHEADING() > DEFHEADING(Network options:) > > DEF("netdev", HAS_ARG, QEMU_OPTION_netdev, > +#ifdef CONFIG_PASST > + "-netdev > passt,id=str[,path=file][,quiet=on|off][,debug=on|off][,trace=on|off]\n" > + " [,vhost-user=on|off][,pcap-file=file][,mtu=mtu]\n" > + " [,address=addr][,netmask=mask][,mac=addr][,gateway=addr]\n" > + " [,interface=name][,outbound=address][,outbound-if4=name]\n" > + " [,outbound-if6=name][,dns=addr][,search=list][,fqdn=name]\n" > + " > [,dhcp-dns=on|off][,dhcp-search=on|off][,map-host-loopback=addr]\n" > + " [,map-guest-addr=addr][,dns-forward=addr][,dns-host=addr]\n" > + " [,tcp=on|off][,udp=on|off][,icmp=on|off][,dhcp=on|off]\n" > + " [,ndp=on|off][,dhcpv6=on|off][,ra=on|off][,freebind=on|off]\n" > + " > [,ipv4=on|off][,ipv6=on|off][,tcp-ports=spec][,udp-ports=spec]\n" No help here? > +#endif > #ifdef CONFIG_SLIRP > "-netdev user,id=str[,ipv4=on|off][,net=addr[/mask]][,host=addr]\n" > " [,ipv6=on|off][,ipv6-net=addr[/int]][,ipv6-host=addr]\n" > @@ -2952,6 +2964,9 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev, > " configure a hub port on the hub with ID 'n'\n", > QEMU_ARCH_ALL) > DEF("nic", HAS_ARG, QEMU_OPTION_nic, > "-nic [tap|bridge|" > +#ifdef CONFIG_PASST > + "passt|" > +#endif > #ifdef CONFIG_SLIRP > "user|" > #endif > @@ -2984,6 +2999,9 @@ DEF("net", HAS_ARG, QEMU_OPTION_net, > " configure or create an on-board (or machine default) > NIC and\n" > " connect it to hub 0 (please use -nic unless you need a > hub)\n" > "-net [" > +#ifdef CONFIG_PASST > + "passt|" > +#endif > #ifdef CONFIG_SLIRP > "user|" > #endif