[OE-core] [PATCH 5/5] runqemu: set default device and hostfwd for slirp
Nathan Rossi
nathan at nathanrossi.com
Tue Nov 29 09:54:57 UTC 2016
On 29 November 2016 at 19:38, Nathan Rossi <nathan at nathanrossi.com> wrote:
> On 29 November 2016 at 17:35, Robert Yang <liezhi.yang at windriver.com> wrote:
>> There is no network rather than lo whitout set device, so set it by
>> default. And set hostfwd: 2222 -> 22, 2323 -> 23
>>
>> [YOCTO #7887]
>>
>> Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
>> ---
>> meta/conf/machine/include/qemuboot-x86.inc | 1 -
>> meta/conf/machine/qemuarm64.conf | 1 -
>> scripts/runqemu | 34 ++++++++++++++++++++++++++++--
>> 3 files changed, 32 insertions(+), 4 deletions(-)
>>
>> diff --git a/meta/conf/machine/include/qemuboot-x86.inc b/meta/conf/machine/include/qemuboot-x86.inc
>> index 0870294..06ac983 100644
>> --- a/meta/conf/machine/include/qemuboot-x86.inc
>> +++ b/meta/conf/machine/include/qemuboot-x86.inc
>> @@ -13,4 +13,3 @@ QB_AUDIO_OPT = "-soundhw ac97,es1370"
>> QB_KERNEL_CMDLINE_APPEND = "vga=0 uvesafb.mode_option=640x480-32 oprofile.timer=1 uvesafb.task_timeout=-1"
>> # Add the 'virtio-rng-pci' device otherwise the guest may run out of entropy
>> QB_OPT_APPEND = "-vga vmware -show-cursor -usb -usbdevice tablet -device virtio-rng-pci"
>> -QB_SLIRP_OPT = "-net nic,model=e1000 -net user,hostfwd=tcp::2222-:22"
>> diff --git a/meta/conf/machine/qemuarm64.conf b/meta/conf/machine/qemuarm64.conf
>> index df2010c..7a5570c 100644
>> --- a/meta/conf/machine/qemuarm64.conf
>> +++ b/meta/conf/machine/qemuarm64.conf
>> @@ -18,7 +18,6 @@ QB_KERNEL_CMDLINE_APPEND = "console=ttyAMA0,38400"
>> # Add the 'virtio-rng-pci' device otherwise the guest may run out of entropy
>> QB_OPT_APPEND = "-show-cursor -device virtio-rng-pci -monitor null"
>> QB_TAP_OPT = "-netdev tap,id=net0,ifname=@TAP@,script=no,downscript=no -device virtio-net-device,netdev=net0,mac=@MAC@"
>> -QB_SLIRP_OPT = "-netdev user,id=net0 -device virtio-net-device,netdev=net0"
>> QB_ROOTFS_OPT = "-drive id=disk0,file=@ROOTFS@,if=none,format=raw -device virtio-blk-device,drive=disk0"
>> QB_SERIAL_OPT = "-device virtio-serial-device -chardev null,id=virtcon -device virtconsole,chardev=virtcon"
>> QB_TCPSERIAL_OPT = " -device virtio-serial-device -chardev socket,id=virtcon,port=@PORT@,host=127.0.0.1 -device virtconsole,chardev=virtcon"
>> diff --git a/scripts/runqemu b/scripts/runqemu
>> index a10270c..7123b8f 100755
>> --- a/scripts/runqemu
>> +++ b/scripts/runqemu
>> @@ -147,6 +147,19 @@ def get_first_file(cmds):
>> return f
>> return ''
>>
>> +def check_free_port(host, port):
>> + """ Check whether the port is free or not """
>> + import socket
>> + from contextlib import closing
>> +
>> + with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
>> + if sock.connect_ex((host, port)) == 0:
>> + # Port is open, so not free
>> + return False
>> + else:
>> + # Port is not open, so free
>> + return True
>> +
>> class BaseConfig(object):
>> def __init__(self):
>> # Vars can be merged with .qemuboot.conf, use a dict to manage them.
>> @@ -751,14 +764,31 @@ class BaseConfig(object):
>>
>> self.nfs_running = True
>>
>> -
>> def setup_slirp(self):
>> """Setup user networking"""
>>
>> if self.fstype == 'nfs':
>> self.setup_nfs()
>> self.kernel_cmdline_script += ' ip=dhcp'
>> - self.set('NETWORK_CMD', self.get('QB_SLIRP_OPT'))
>> + # Port mapping
>> + hostfwd = ",hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23"
>> + qb_slirp_opt_default = "-netdev user,id=net0%s -device virtio-net-pci,netdev=net0" % hostfwd
>> + qb_slirp_opt = self.get('QB_SLIRP_OPT') or qb_slirp_opt_default
>> + # Figure out the port
>> + ports = re.findall('hostfwd=[^-]*:([0-9]+)-[^,-]*', qb_slirp_opt)
>> + ports = [int(i) for i in ports]
>
> Should runqemu not just always supply "-netdev user,id=net0..." itself
> for slirp. And qemuboot should supply only the devices, e.g. the "-dev
> virtio-net-pci,netdev=net0" or "-net nic,netdev=net0". This could even
> allow for consolidation of the "QB_SLIRP_OPT" and "QB_TAP_OPT" into
> "QB_NETWORK".
Just saw this patch was an updated version of
https://patchwork.openembedded.org/patch/134399/ which was doing
similar to what I suggested above. (I read this patch before the other
one linked)
Maybe QB_SLIRP_OPT and QB_TAP_OPT should provide overrides for the
-netdev user/tap, and if a BSP/etc needs to overwrite them it can. But
the "-net"/"-device" is provided as a separate QB_NETWORK variable.
This would allow for BSPs to take advantage of the default netdev
user/tap args that runqemu provides without needing to specify any of
the forwards/etc. And would also allow for backwards compatibility
with current BSP QB_* setups.
Regards,
Nathan
>
> This way runqemu would not need to do any searching/substitution and
> could just build the user netdev arg itself. This would allow for easy
> extension of custom forwards (e.g gdbserver, etc), and also even
> setting up the in qemu user/slirp 'tftp=<dir>' server.
>
>> + # Find a free port to avoid conflicts
>> + for p in ports[:]:
>> + p_new = p
>> + while not check_free_port('127.0.0.1', p_new):
>
> Should this be 'localhost', since 127.0.0.1 will only check for ipv4 listeners.
>
> Regards,
> Nathan
>
>> + p_new += 1
>> + while p_new in ports:
>> + p_new += 1
>> + if p != p_new:
>> + ports.append(p_new)
>> + qb_slirp_opt = re.sub(':%s-' % p, ':%s-' % p_new, qb_slirp_opt)
>> + logger.info("Port forward changed: %s -> %s" % (p, p_new))
>> + self.set('NETWORK_CMD', qb_slirp_opt)
>>
>> def setup_tap(self):
>> """Setup tap"""
>> --
>> 2.9.0
>>
>> --
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core at lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
More information about the Openembedded-core
mailing list