@@ -233,6 +233,7 @@ def create(self, name, virttype=None, profile='kvirt', flavor=None, plan='kvirt'
233233 self .url = 'qemu:///session'
234234 userport = common .get_free_port ()
235235 metadata ['userport' ] = userport
236+ metadata ['usermode_backend' ] = 'passt' if which ('passt' ) is not None else 'slirp'
236237 usermode = True
237238 if self .exists (name ):
238239 return {'result' : 'failure' , 'reason' : f"VM { name } already exists" }
@@ -736,9 +737,15 @@ def create(self, name, virttype=None, profile='kvirt', flavor=None, plan='kvirt'
736737 if netname in ovsnetworks :
737738 ovs = True
738739 if usermode :
739- iftype = 'user'
740- sourcexml = "<backend type='passt'/>"
741- sourcexml += f"<portForward proto='tcp'><range start='{ userport } ' to='22'/></portForward>"
740+ usermode_backend = 'passt' if which ('passt' ) is not None else 'slirp'
741+ if usermode_backend == 'slirp' :
742+ # Skip libvirt interface for slirp - handled via QEMU command line
743+ continue
744+ else :
745+ # Default to passt
746+ iftype = 'user'
747+ sourcexml = "<backend type='passt'/>"
748+ sourcexml += f"<portForward proto='tcp'><range start='{ userport } ' to='22'/></portForward>"
742749 elif netname in networks :
743750 iftype = 'network'
744751 sourcexml = f"<source network='{ netname } '/>"
@@ -1097,7 +1104,8 @@ def create(self, name, virttype=None, profile='kvirt', flavor=None, plan='kvirt'
10971104 vcpuxml = f"<vcpu>{ numcpus } </vcpu>"
10981105 clockxml = "<clock offset='utc'/>"
10991106 qemuextraxml = ''
1100- if ignition or macosx or tpm or qemuextra is not None or nvmedisks :
1107+ slirp = usermode and which ('passt' ) is None
1108+ if ignition or macosx or tpm or qemuextra is not None or nvmedisks or slirp :
11011109 namespace = "xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'"
11021110 ignitionxml = ""
11031111 if ignition :
@@ -1139,12 +1147,19 @@ def create(self, name, virttype=None, profile='kvirt', flavor=None, plan='kvirt'
11391147<qemu:arg value='file={diskpath},format=qcow2,if=none,id=NVME{index}'/>
11401148<qemu:arg value='-device'/>
11411149<qemu:arg value='nvme,drive=NVME{index},serial=nvme-{index}'/>""" .format (index = index , diskpath = diskpath )
1150+ slirpxml = ""
1151+ if slirp :
1152+ slirpxml = f"""<qemu:arg value='-netdev'/>
1153+ <qemu:arg value='user,id=net0,hostfwd=tcp::{ userport } -:22'/>
1154+ <qemu:arg value='-device'/>
1155+ <qemu:arg value='virtio-net-pci,netdev=net0,addr=0x10'/>"""
11421156 qemuextraxml = """<qemu:commandline>
11431157{ignitionxml}
11441158{macosxml}
11451159{freeformxml}
11461160{nvmexml}
1147- </qemu:commandline>""" .format (ignitionxml = ignitionxml , macosxml = macosxml , freeformxml = freeformxml , nvmexml = nvmexml )
1161+ {slirpxml}
1162+ </qemu:commandline>""" .format (ignitionxml = ignitionxml , macosxml = macosxml , freeformxml = freeformxml , nvmexml = nvmexml , slirpxml = slirpxml )
11481163 sharedxml = ""
11491164 if sharedfolders :
11501165 for folder in sharedfolders :
0 commit comments