diff --git a/bochs/.bochsrc b/bochs/.bochsrc
index f1ee620b8..c3d86242b 100644
--- a/bochs/.bochsrc
+++ b/bochs/.bochsrc
@@ -984,6 +984,7 @@ speaker: enabled=1, mode=sound
# ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=vde, ethdev="/tmp/vde.ctl"
# ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=vnet, ethdev="c:/temp"
# ne2k: mac=b0:c4:20:00:00:01, ethmod=slirp, script=/usr/local/bin/slirp, bootrom=ne2k_pci.rom
+# ne2k: mac=b0:c4:20:00:00:01, ethmod=slirp_new, script=slirp.conf
#=======================================================================
# pcipnic: Bochs/Etherboot pseudo-NIC
@@ -1007,7 +1008,7 @@ speaker: enabled=1, mode=sound
# The E1000 accepts the same syntax (for mac, ethmod, ethdev, script, bootrom)
# and supports the same networking modules as the NE2000 adapter.
#=======================================================================
-#e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=/usr/local/bin/slirp
+#e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp_new, script=slirp.conf
#=======================================================================
# USB_UHCI:
diff --git a/bochs/doc/docbook/user/user.dbk b/bochs/doc/docbook/user/user.dbk
index 4aeb981ae..094d97da6 100644
--- a/bochs/doc/docbook/user/user.dbk
+++ b/bochs/doc/docbook/user/user.dbk
@@ -4414,6 +4414,7 @@ ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=vnet, ethdev="c:/temp"
ne2k: ioaddr=0x300, irq=9, mac=fe:fd:00:00:00:01, ethmod=tap, ethdev=tap0
ne2k: ioaddr=0x300, irq=9, mac=fe:fd:00:00:00:01, ethmod=tuntap, ethdev=/dev/net/tun0, script=./tunconfig
ne2k: mac=fe:fd:00:00:00:01, ethmod=slirp, script=/usr/local/bin/slirp, bootrom=ne2k_pci.rom
+ne2k: mac=b0:c4:20:00:00:01, ethmod=slirp_new, script=slirp.conf
IOADDR, IRQ: You probably won't need to change ioaddr and irq, unless there
are IRQ conflicts. These parameters are ignored if the NE2000 is assigned to
@@ -4537,9 +4538,20 @@ version where this module was added.
overwrite files.
Yes, for TFTP
- Yes
+ Yes, for Slirp binary
2.5
+
+ slirp_new
+ Built-in Slirp support with DHCP / TFTP servers. Adds user mode
+ networking to Bochs. The "script" parameter can be used to set up an
+ alternative configuration. The TFTP server uses the 'ethdev' value for
+ the root directory and currently operates in read-only mode.
+
+ Yes, for TFTP
+ Yes, for Slirp config
+ 2.6.2.svn
+
win32
Win32 packetmover - WinPCap driver required.
diff --git a/bochs/doc/man/bochsrc.5 b/bochs/doc/man/bochsrc.5
index 85d5ed204..a0c68f38f 100644
--- a/bochs/doc/man/bochsrc.5
+++ b/bochs/doc/man/bochsrc.5
@@ -1,5 +1,5 @@
.\"Document Author: Timothy R. Butler - tbutler@uninetsolutions.com"
-.TH bochsrc 5 "28 Dec 2013" "bochsrc" "The Bochs Project"
+.TH bochsrc 5 "03 Mar 2014" "bochsrc" "The Bochs Project"
.\"SKIP_SECTION"
.SH NAME
bochsrc \- Configuration file for Bochs.
@@ -1053,12 +1053,13 @@ be other restrictions too. To be safe, just use the b0:c4... address.
ETHMOD:
The ethmod value defines which low level OS specific module to be used
to access physical ethernet interface. Current implemented values include
- - fbsd : ethernet on freebsd and openbsd
- - linux : ethernet on linux
- - win32 : ethernet on win32
- - tap : ethernet through a linux tap interface
- - tuntap : ethernet through a linux tuntap interface
- - slirp : ethernet backend for Slirp with builtin DHCP / TFTP servers
+ - fbsd : ethernet on freebsd and openbsd
+ - linux : ethernet on linux
+ - win32 : ethernet on win32
+ - tap : ethernet through a linux tap interface
+ - tuntap : ethernet through a linux tuntap interface
+ - slirp : ethernet backend for Slirp with builtin DHCP / TFTP servers
+ - slirp_new : built-in Slirp support
If you don't want to make connections to any physical networks,
you can use the following 'ethmod's to simulate a virtual network.
@@ -1099,6 +1100,7 @@ Examples:
ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=vde, ethdev="/tmp/vde.ctl"
ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=vnet, ethdev="c:/temp"
ne2k: mac=b0:c4:20:00:00:01, ethmod=slirp, script=/usr/local/bin/slirp, bootrom=ne2k_pci.rom
+ ne2k: mac=b0:c4:20:00:00:01, ethmod=slirp_new, script=slirp.conf
.TP
.I "pcipnic:"
@@ -1118,7 +1120,7 @@ with the --eanble-e1000 configure option. The E1000 accepts the same syntax
modules as the NE2000 adapter.
Example:
- e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=/usr/local/bin/slirp
+ e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp_new, script=slirp.conf
.TP
.I "usb_uhci:"
diff --git a/bochs/iodev/network/eth_slirp_new.cc b/bochs/iodev/network/eth_slirp_new.cc
index 8d9f9cca1..5cb49ab5a 100644
--- a/bochs/iodev/network/eth_slirp_new.cc
+++ b/bochs/iodev/network/eth_slirp_new.cc
@@ -52,8 +52,11 @@ private:
Slirp *slirp;
unsigned netdev_speed;
- bx_bool parse_slirp_conf(const char *conf, int *, char *, struct in_addr *, struct in_addr *,
- struct in_addr *, struct in_addr *, struct in_addr *);
+ int restricted;
+ struct in_addr net, mask, host, dhcp, dns;
+ char *bootfile, *hostname;
+
+ bx_bool parse_slirp_conf(const char *conf);
static void rx_timer_handler(void *);
};
@@ -72,12 +75,16 @@ protected:
bx_slirp_new_pktmover_c::bx_slirp_new_pktmover_c()
{
slirp = NULL;
+ bootfile = NULL;
+ hostname = NULL;
}
bx_slirp_new_pktmover_c::~bx_slirp_new_pktmover_c()
{
if (slirp != NULL) {
slirp_cleanup(slirp);
+ if (bootfile != NULL) free(bootfile);
+ if (hostname != NULL) free(hostname);
if (--bx_slirp_instances == 0) {
bx_pc_system.deactivate_timer(rx_timer_index);
#ifndef WIN32
@@ -87,10 +94,7 @@ bx_slirp_new_pktmover_c::~bx_slirp_new_pktmover_c()
}
}
-bx_bool bx_slirp_new_pktmover_c::parse_slirp_conf(const char *conf, int *restricted,
- char *hostname, struct in_addr *net,
- struct in_addr *mask, struct in_addr *host,
- struct in_addr *dhcp, struct in_addr *dns)
+bx_bool bx_slirp_new_pktmover_c::parse_slirp_conf(const char *conf)
{
FILE *fd = NULL;
char line[512];
@@ -123,36 +127,46 @@ bx_bool bx_slirp_new_pktmover_c::parse_slirp_conf(const char *conf, int *restric
} else {
continue;
}
- int len = strlen(param);
- while ((len > 0) && (param[len-1] == ' ')) {
- param[--len] = 0;
+ int len1 = strlen(param);
+ int len2 = strlen(val);
+ while ((len1 > 0) && (param[len1-1] == ' ')) {
+ param[--len1] = 0;
}
+ if ((len1 == 0) || (len2 == 0)) continue;
if (!strcmp(param, "restricted")) {
- *restricted = atoi(val);
+ restricted = atoi(val);
} else if (!strcmp(param, "hostname")) {
- if (strlen(val) < 33) {
+ if (len2 < 33) {
+ hostname = (char*)malloc(len2+1);
strcpy(hostname, val);
} else {
BX_ERROR(("slirp: wrong format for 'hostname'"));
}
+ } else if (!strcmp(param, "bootfile")) {
+ if (len2 < 128) {
+ bootfile = (char*)malloc(len2+1);
+ strcpy(bootfile, val);
+ } else {
+ BX_ERROR(("slirp: wrong format for 'bootfile'"));
+ }
} else if (!strcmp(param, "net")) {
- if (!inet_aton(val, net)) {
+ if (!inet_aton(val, &net)) {
BX_ERROR(("slirp: wrong format for 'net'"));
}
} else if (!strcmp(param, "mask")) {
- if (!inet_aton(val, mask)) {
+ if (!inet_aton(val, &mask)) {
BX_ERROR(("slirp: wrong format for 'mask'"));
}
} else if (!strcmp(param, "host")) {
- if (!inet_aton(val, host)) {
+ if (!inet_aton(val, &host)) {
BX_ERROR(("slirp: wrong format for 'host'"));
}
} else if (!strcmp(param, "dhcp")) {
- if (!inet_aton(val, dhcp)) {
+ if (!inet_aton(val, &dhcp)) {
BX_ERROR(("slirp: wrong format for 'dhcp'"));
}
} else if (!strcmp(param, "dns")) {
- if (!inet_aton(val, dns)) {
+ if (!inet_aton(val, &dns)) {
BX_ERROR(("slirp: wrong format for 'dns'"));
}
} else {
@@ -172,10 +186,8 @@ bx_slirp_new_pktmover_c::bx_slirp_new_pktmover_c(const char *netif,
bx_devmodel_c *dev,
const char *script)
{
- struct in_addr net, mask, host, dhcp, dns;
- int restricted = 0;
logfunctions *slirplog;
- char hostname[33], prefix[10];
+ char bootfile[128], hostname[33], prefix[10];
this->netdev = dev;
BX_INFO(("slirp_new network driver"));
@@ -200,16 +212,16 @@ bx_slirp_new_pktmover_c::bx_slirp_new_pktmover_c(const char *netif,
host.s_addr = htonl(0x0a000202); /* 10.0.2.2 */
dhcp.s_addr = htonl(0x0a00020f); /* 10.0.2.15 */
dns.s_addr = htonl(0x0a000203); /* 10.0.2.3 */
- hostname[0] = 0;
+ restricted = 0;
if (strlen(script) > 0) {
- if (!parse_slirp_conf(script, &restricted, hostname, &net, &mask, &host, &dhcp, &dns)) {
+ if (!parse_slirp_conf(script)) {
BX_ERROR(("reading slirp config failed"));
}
}
slirplog = new logfunctions();
sprintf(prefix, "SLIRP%d", bx_slirp_instances);
slirplog->put(prefix);
- slirp = slirp_init(restricted, net, mask, host, hostname, netif, NULL, dhcp, dns,
+ slirp = slirp_init(restricted, net, mask, host, hostname, netif, bootfile, dhcp, dns,
NULL, this, slirplog);
bx_slirp_instances++;
diff --git a/bochs/misc/slirp.conf b/bochs/misc/slirp.conf
index d97127d5a..ad5bd6d8e 100644
--- a/bochs/misc/slirp.conf
+++ b/bochs/misc/slirp.conf
@@ -16,3 +16,4 @@ mask = 255.255.255.0
host = 192.168.10.1
dhcp = 192.168.10.2
dns = 0.0.0.0
+bootfile = pxelinux.0