From a16a4a088676a99beafa790f2a1f104475f179c0 Mon Sep 17 00:00:00 2001 From: Volker Ruppert Date: Thu, 3 Sep 2020 14:23:06 +0000 Subject: [PATCH] Some improvements for the vnet config file support. - Added options "net" for the IP address space and "ftp" for the FTP server. - Added some sanity checks for the IP address configuration. - Added sample config file. --- bochs/iodev/network/eth_vnet.cc | 42 ++++++++++++++++++++++++++++++--- bochs/iodev/network/netutil.h | 1 + bochs/misc/vnet.conf | 24 +++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 bochs/misc/vnet.conf diff --git a/bochs/iodev/network/eth_vnet.cc b/bochs/iodev/network/eth_vnet.cc index 65d66e7b8..0d606a88f 100644 --- a/bochs/iodev/network/eth_vnet.cc +++ b/bochs/iodev/network/eth_vnet.cc @@ -26,6 +26,7 @@ // There are no connections between the virtual host and real ethernets. // // Virtual host name: vnet +// Virtual net IP space: 192.168.10.0 // Virtual server IP: 192.168.10.1 // Virtual DNS server IP: 192.168.10.2 // Virtual FTP server IP: 192.168.10.3 @@ -71,6 +72,7 @@ void CDECL libvnet_net_plugin_fini(void) // handler to send/receive packets ///////////////////////////////////////////////////////////////////////// +static const Bit8u default_net_ipv4addr[4] = {192,168,10,0}; static const Bit8u default_host_ipv4addr[4] = {192,168,10,1}; static const Bit8u default_dns_ipv4addr[4] = {192,168,10,2}; static const Bit8u default_ftp_ipv4addr[4] = {192,168,10,3}; @@ -150,6 +152,7 @@ bx_bool bx_vnet_pktmover_c::parse_vnet_conf(const char *conf) char *ret, *param, *val; bx_bool format_checked = 0; size_t len1 = 0, len2; + Bit8u tmp_ipv4addr[4]; fd = fopen(conf, "r"); if (fd == NULL) return 0; @@ -197,18 +200,50 @@ bx_bool bx_vnet_pktmover_c::parse_vnet_conf(const char *conf) } else { BX_ERROR(("vnet: wrong format for 'bootfile'")); } + } else if (!stricmp(param, "net")) { + if (!get_ipv4_address(val, (Bit8u*)&dhcp.net_ipv4addr)) { + BX_ERROR(("vnet: wrong format for 'net'")); + } + if (dhcp.net_ipv4addr[3] != 0) { + BX_ERROR(("vnet: IP address space must be set to x.y.z.0")); + dhcp.net_ipv4addr[3] = 0; + } } else if (!stricmp(param, "host")) { - if (!get_ipv4_address(val, (Bit8u*)&dhcp.srv_ipv4addr[VNET_SRV])) { + if (!get_ipv4_address(val, (Bit8u*)tmp_ipv4addr)) { BX_ERROR(("vnet: wrong format for 'host'")); } + if (!memcmp(tmp_ipv4addr, dhcp.net_ipv4addr, 3)) { + memcpy(dhcp.srv_ipv4addr[VNET_SRV], tmp_ipv4addr, 4); + } else { + BX_ERROR(("vnet: wrong IP address space for 'host'")); + } } else if (!stricmp(param, "dhcpstart")) { - if (!get_ipv4_address(val, (Bit8u*)&dhcp.client_base_ipv4addr)) { + if (!get_ipv4_address(val, (Bit8u*)tmp_ipv4addr)) { BX_ERROR(("vnet: wrong format for 'dhcpstart'")); } + if (!memcmp(tmp_ipv4addr, dhcp.net_ipv4addr, 3)) { + memcpy(dhcp.client_base_ipv4addr, tmp_ipv4addr, 4); + } else { + BX_ERROR(("vnet: wrong IP address space for 'dhcpstart'")); + } } else if (!stricmp(param, "dns")) { - if (!get_ipv4_address(val, (Bit8u*)&dhcp.srv_ipv4addr[VNET_DNS])) { + if (!get_ipv4_address(val, (Bit8u*)tmp_ipv4addr)) { BX_ERROR(("vnet: wrong format for 'dns'")); } + if (!memcmp(tmp_ipv4addr, dhcp.net_ipv4addr, 3)) { + memcpy(dhcp.srv_ipv4addr[VNET_DNS], tmp_ipv4addr, 4); + } else { + BX_ERROR(("vnet: wrong IP address space for 'dns'")); + } + } else if (!stricmp(param, "ftp")) { + if (!get_ipv4_address(val, (Bit8u*)tmp_ipv4addr)) { + BX_ERROR(("vnet: wrong format for 'ftp'")); + } + if (!memcmp(tmp_ipv4addr, dhcp.net_ipv4addr, 3)) { + memcpy(dhcp.srv_ipv4addr[VNET_MISC], tmp_ipv4addr, 4); + } else { + BX_ERROR(("vnet: wrong IP address space for 'ftp'")); + } } else if (!stricmp(param, "pktlog")) { if (len2 < BX_PATHNAME_LEN) { pktlog_fn = (char*)malloc(len2+1); @@ -243,6 +278,7 @@ bx_vnet_pktmover_c::bx_vnet_pktmover_c(const char *netif, memcpy(&dhcp.host_macaddr[0], macaddr, 6); dhcp.host_macaddr[5] ^= 0x03; + memcpy(dhcp.net_ipv4addr, default_net_ipv4addr, 4); memcpy(dhcp.srv_ipv4addr[VNET_SRV], default_host_ipv4addr, 4); memcpy(dhcp.srv_ipv4addr[VNET_DNS], default_dns_ipv4addr, 4); memcpy(dhcp.srv_ipv4addr[VNET_MISC], default_ftp_ipv4addr, 4); diff --git a/bochs/iodev/network/netutil.h b/bochs/iodev/network/netutil.h index 1ded422c1..382019e61 100644 --- a/bochs/iodev/network/netutil.h +++ b/bochs/iodev/network/netutil.h @@ -163,6 +163,7 @@ tcp_header_t; // DHCP configuration structure typedef struct { Bit8u host_macaddr[6]; + Bit8u net_ipv4addr[4]; Bit8u srv_ipv4addr[3][4]; Bit8u client_base_ipv4addr[4]; char bootfile[128]; diff --git a/bochs/misc/vnet.conf b/bochs/misc/vnet.conf new file mode 100644 index 000000000..5be172040 --- /dev/null +++ b/bochs/misc/vnet.conf @@ -0,0 +1,24 @@ +# vnet config +# The line above is mandatory + +# Supported options: +# +# NET base IP address of the virtual network +# HOST IP address of the DHCP and TFTP server +# HOSTNAME DHCP client hostname +# DHCPSTART start address of DHCP pool +# DNS IP address of the virtual DNS server +# FTP IP address of the virtual FTP server +# BOOTFILE boot filename returned by DHCP +# PKTLOG enable packet logging in text format + +# This is the default vnet setup +# net = 192.168.10.0 +# host = 192.168.10.1 +# dhcpstart = 192.168.10.15 +# dns = 192.168.10.2 +# ftp = 192.168.10.3 +# bootfile = pxelinux.0 + +# Uncomment this to enable logging +# pktlog = slirp-pktlog.txt