diff --git a/bochs/iodev/network/Makefile.in b/bochs/iodev/network/Makefile.in index 4a9c8966c..035888a00 100644 --- a/bochs/iodev/network/Makefile.in +++ b/bochs/iodev/network/Makefile.in @@ -129,11 +129,12 @@ dist-clean: clean ########################################### # dependencies generated by # gcc -MM -I.. -I../.. -I../../instrument/stubs *.cc | sed -e 's/\.cc/.@CPP_SUFFIX@/g' -# gcc -MM -I.. -I../.. -I../../instrument/stubs slirp/*.cc | sed -e 's/\.cc/.@CPP_SUFFIX@/g' +# gcc -MM -I.. -I../.. -I../../instrument/stubs slirp/*.cc | \ +# sed -e 's/^[^ ]/slirp\/&/g' -e 's/\.cc/.@CPP_SUFFIX@/g' # gcc -MM -I.. -I../.. -I../../instrument/stubs *.cc | \ # sed -e 's/\.cc/.@CPP_SUFFIX@/g' -e 's/\.o:/.lo:/g' # gcc -MM -I.. -I../.. -I../../instrument/stubs slirp/*.cc | \ -# sed -e 's/\.cc/.@CPP_SUFFIX@/g' -e 's/\.o:/.lo:/g' +# sed -e 's/^[^ ]/slirp\/&/g' -e 's/\.cc/.@CPP_SUFFIX@/g' -e 's/\.o:/.lo:/g' # # This means that every source file is listed twice, once with a .o rule # and then again with an identical .lo rule. The .lo rules are used when @@ -232,16 +233,11 @@ slirp/arp_table.o: slirp/arp_table.@CPP_SUFFIX@ slirp/slirp.h ../../config.h \ slirp/ip.h slirp/tcp.h slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h \ slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h slirp/sbuf.h slirp/socket.h \ slirp/if.h slirp/main.h slirp/misc.h slirp/bootp.h slirp/tftp.h -slirp/bootp.o: slirp/bootp.@CPP_SUFFIX@ ../iodev.h ../../bochs.h ../../config.h \ - ../../osdep.h ../../bx_debug/debug.h ../../config.h ../../osdep.h \ - ../../gui/siminterface.h ../../cpudb.h ../../gui/paramtree.h \ - ../../memory/memory.h ../../pc_system.h ../../gui/gui.h \ - ../../instrument/stubs/instrument.h ../../plugin.h ../../extplugin.h \ - ../../param_names.h slirp/slirp.h slirp/slirp_config.h slirp/debug.h \ - slirp/libslirp.h slirp/compat.h slirp/ip.h slirp/tcp.h slirp/tcp_var.h \ - slirp/tcpip.h slirp/tcp_timer.h slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h \ - slirp/sbuf.h slirp/socket.h slirp/if.h slirp/main.h slirp/misc.h \ - slirp/bootp.h slirp/tftp.h +slirp/bootp.o: slirp/bootp.@CPP_SUFFIX@ slirp/slirp.h ../../config.h slirp/slirp_config.h \ + slirp/debug.h slirp/libslirp.h slirp/compat.h slirp/ip.h slirp/tcp.h \ + slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h slirp/udp.h \ + slirp/ip_icmp.h slirp/mbuf.h slirp/sbuf.h slirp/socket.h slirp/if.h \ + slirp/main.h slirp/misc.h slirp/bootp.h slirp/tftp.h slirp/cksum.o: slirp/cksum.@CPP_SUFFIX@ slirp/slirp.h ../../config.h slirp/slirp_config.h \ slirp/debug.h slirp/libslirp.h slirp/compat.h slirp/ip.h slirp/tcp.h \ slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h slirp/udp.h \ @@ -252,16 +248,11 @@ slirp/compat.o: slirp/compat.@CPP_SUFFIX@ slirp/slirp.h ../../config.h \ slirp/ip.h slirp/tcp.h slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h \ slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h slirp/sbuf.h slirp/socket.h \ slirp/if.h slirp/main.h slirp/misc.h slirp/bootp.h slirp/tftp.h -slirp/dnssearch.o: slirp/dnssearch.@CPP_SUFFIX@ ../iodev.h ../../bochs.h ../../config.h \ - ../../osdep.h ../../bx_debug/debug.h ../../config.h ../../osdep.h \ - ../../gui/siminterface.h ../../cpudb.h ../../gui/paramtree.h \ - ../../memory/memory.h ../../pc_system.h ../../gui/gui.h \ - ../../instrument/stubs/instrument.h ../../plugin.h ../../extplugin.h \ - ../../param_names.h slirp/slirp.h slirp/slirp_config.h slirp/debug.h \ - slirp/libslirp.h slirp/compat.h slirp/ip.h slirp/tcp.h slirp/tcp_var.h \ - slirp/tcpip.h slirp/tcp_timer.h slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h \ - slirp/sbuf.h slirp/socket.h slirp/if.h slirp/main.h slirp/misc.h \ - slirp/bootp.h slirp/tftp.h +slirp/dnssearch.o: slirp/dnssearch.@CPP_SUFFIX@ slirp/slirp.h ../../config.h \ + slirp/slirp_config.h slirp/debug.h slirp/libslirp.h slirp/compat.h \ + slirp/ip.h slirp/tcp.h slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h \ + slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h slirp/sbuf.h slirp/socket.h \ + slirp/if.h slirp/main.h slirp/misc.h slirp/bootp.h slirp/tftp.h slirp/if.o: slirp/if.@CPP_SUFFIX@ ../iodev.h ../../bochs.h ../../config.h ../../osdep.h \ ../../bx_debug/debug.h ../../config.h ../../osdep.h \ ../../gui/siminterface.h ../../cpudb.h ../../gui/paramtree.h \ @@ -440,16 +431,11 @@ slirp/arp_table.lo: slirp/arp_table.@CPP_SUFFIX@ slirp/slirp.h ../../config.h \ slirp/ip.h slirp/tcp.h slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h \ slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h slirp/sbuf.h slirp/socket.h \ slirp/if.h slirp/main.h slirp/misc.h slirp/bootp.h slirp/tftp.h -slirp/bootp.lo: slirp/bootp.@CPP_SUFFIX@ ../iodev.h ../../bochs.h ../../config.h \ - ../../osdep.h ../../bx_debug/debug.h ../../config.h ../../osdep.h \ - ../../gui/siminterface.h ../../cpudb.h ../../gui/paramtree.h \ - ../../memory/memory.h ../../pc_system.h ../../gui/gui.h \ - ../../instrument/stubs/instrument.h ../../plugin.h ../../extplugin.h \ - ../../param_names.h slirp/slirp.h slirp/slirp_config.h slirp/debug.h \ - slirp/libslirp.h slirp/compat.h slirp/ip.h slirp/tcp.h slirp/tcp_var.h \ - slirp/tcpip.h slirp/tcp_timer.h slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h \ - slirp/sbuf.h slirp/socket.h slirp/if.h slirp/main.h slirp/misc.h \ - slirp/bootp.h slirp/tftp.h +slirp/bootp.lo: slirp/bootp.@CPP_SUFFIX@ slirp/slirp.h ../../config.h slirp/slirp_config.h \ + slirp/debug.h slirp/libslirp.h slirp/compat.h slirp/ip.h slirp/tcp.h \ + slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h slirp/udp.h \ + slirp/ip_icmp.h slirp/mbuf.h slirp/sbuf.h slirp/socket.h slirp/if.h \ + slirp/main.h slirp/misc.h slirp/bootp.h slirp/tftp.h slirp/cksum.lo: slirp/cksum.@CPP_SUFFIX@ slirp/slirp.h ../../config.h slirp/slirp_config.h \ slirp/debug.h slirp/libslirp.h slirp/compat.h slirp/ip.h slirp/tcp.h \ slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h slirp/udp.h \ @@ -460,16 +446,11 @@ slirp/compat.lo: slirp/compat.@CPP_SUFFIX@ slirp/slirp.h ../../config.h \ slirp/ip.h slirp/tcp.h slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h \ slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h slirp/sbuf.h slirp/socket.h \ slirp/if.h slirp/main.h slirp/misc.h slirp/bootp.h slirp/tftp.h -slirp/dnssearch.lo: slirp/dnssearch.@CPP_SUFFIX@ ../iodev.h ../../bochs.h ../../config.h \ - ../../osdep.h ../../bx_debug/debug.h ../../config.h ../../osdep.h \ - ../../gui/siminterface.h ../../cpudb.h ../../gui/paramtree.h \ - ../../memory/memory.h ../../pc_system.h ../../gui/gui.h \ - ../../instrument/stubs/instrument.h ../../plugin.h ../../extplugin.h \ - ../../param_names.h slirp/slirp.h slirp/slirp_config.h slirp/debug.h \ - slirp/libslirp.h slirp/compat.h slirp/ip.h slirp/tcp.h slirp/tcp_var.h \ - slirp/tcpip.h slirp/tcp_timer.h slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h \ - slirp/sbuf.h slirp/socket.h slirp/if.h slirp/main.h slirp/misc.h \ - slirp/bootp.h slirp/tftp.h +slirp/dnssearch.lo: slirp/dnssearch.@CPP_SUFFIX@ slirp/slirp.h ../../config.h \ + slirp/slirp_config.h slirp/debug.h slirp/libslirp.h slirp/compat.h \ + slirp/ip.h slirp/tcp.h slirp/tcp_var.h slirp/tcpip.h slirp/tcp_timer.h \ + slirp/udp.h slirp/ip_icmp.h slirp/mbuf.h slirp/sbuf.h slirp/socket.h \ + slirp/if.h slirp/main.h slirp/misc.h slirp/bootp.h slirp/tftp.h slirp/if.lo: slirp/if.@CPP_SUFFIX@ ../iodev.h ../../bochs.h ../../config.h ../../osdep.h \ ../../bx_debug/debug.h ../../config.h ../../osdep.h \ ../../gui/siminterface.h ../../cpudb.h ../../gui/paramtree.h \ diff --git a/bochs/iodev/network/eth_slirp_new.cc b/bochs/iodev/network/eth_slirp_new.cc index c7a3d4405..8d9f9cca1 100644 --- a/bochs/iodev/network/eth_slirp_new.cc +++ b/bochs/iodev/network/eth_slirp_new.cc @@ -52,6 +52,8 @@ 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 *); static void rx_timer_handler(void *); }; @@ -85,6 +87,84 @@ 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) +{ + FILE *fd = NULL; + char line[512]; + char *ret, *param, *val; + bx_bool format_checked = 0; + + fd = fopen(conf, "r"); + if (fd == NULL) return 0; + + do { + ret = fgets(line, sizeof(line)-1, fd); + line[sizeof(line) - 1] = '\0'; + size_t len = strlen(line); + if ((len>0) && (line[len-1] < ' ')) + line[len-1] = '\0'; + if ((ret != NULL) && (strlen(line) > 0)) { + if (!format_checked) { + if (!strncmp(line, "# slirp config", 14)) { + format_checked = 1; + } else { + BX_ERROR(("slirp config: wrong file format")); + fclose(fd); + return 0; + } + } else { + if (line[0] == '#') continue; + param = strtok(line, "="); + if (param != NULL) { + val = strtok(NULL, " "); + } else { + continue; + } + int len = strlen(param); + while ((len > 0) && (param[len-1] == ' ')) { + param[--len] = 0; + } + if (!strcmp(param, "restricted")) { + *restricted = atoi(val); + } else if (!strcmp(param, "hostname")) { + if (strlen(val) < 33) { + strcpy(hostname, val); + } else { + BX_ERROR(("slirp: wrong format for 'hostname'")); + } + } else if (!strcmp(param, "net")) { + if (!inet_aton(val, net)) { + BX_ERROR(("slirp: wrong format for 'net'")); + } + } else if (!strcmp(param, "mask")) { + if (!inet_aton(val, mask)) { + BX_ERROR(("slirp: wrong format for 'mask'")); + } + } else if (!strcmp(param, "host")) { + if (!inet_aton(val, host)) { + BX_ERROR(("slirp: wrong format for 'host'")); + } + } else if (!strcmp(param, "dhcp")) { + if (!inet_aton(val, dhcp)) { + BX_ERROR(("slirp: wrong format for 'dhcp'")); + } + } else if (!strcmp(param, "dns")) { + if (!inet_aton(val, dns)) { + BX_ERROR(("slirp: wrong format for 'dns'")); + } + } else { + BX_ERROR(("slirp: unknown option '%s'", line)); + } + } + } + } while (!feof(fd)); + fclose(fd); + return 1; +} + bx_slirp_new_pktmover_c::bx_slirp_new_pktmover_c(const char *netif, const char *macaddr, eth_rx_handler_t rxh, @@ -93,6 +173,9 @@ bx_slirp_new_pktmover_c::bx_slirp_new_pktmover_c(const char *netif, const char *script) { struct in_addr net, mask, host, dhcp, dns; + int restricted = 0; + logfunctions *slirplog; + char hostname[33], prefix[10]; this->netdev = dev; BX_INFO(("slirp_new network driver")); @@ -117,7 +200,17 @@ 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 */ - slirp = slirp_init(0, net, mask, host, NULL, netif, NULL, dhcp, dns, NULL, this); + hostname[0] = 0; + if (strlen(script) > 0) { + if (!parse_slirp_conf(script, &restricted, hostname, &net, &mask, &host, &dhcp, &dns)) { + 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, + NULL, this, slirplog); bx_slirp_instances++; } diff --git a/bochs/iodev/network/slirp/bootp.cc b/bochs/iodev/network/slirp/bootp.cc index 635f0bbbf..3492085aa 100644 --- a/bochs/iodev/network/slirp/bootp.cc +++ b/bochs/iodev/network/slirp/bootp.cc @@ -25,15 +25,10 @@ * THE SOFTWARE. */ -#define BX_PLUGGABLE - -#include "iodev.h" #include "slirp.h" #if BX_NETWORKING && BX_NETMOD_SLIRP_NEW -#define LOG_THIS genlog-> - /* XXX: only DHCP is supported */ #define LEASE_TIME (24 * 3600) @@ -303,7 +298,7 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) size_t spaceleft = sizeof(rbp->bp_vend) - (q - rbp->bp_vend); val = slirp->vdnssearch_len; if (val + 1 > (int)spaceleft) { - BX_ERROR(("DHCP packet size exceeded, omitting domain-search option.")); + slirp_warning(slirp, "DHCP packet size exceeded, omitting domain-search option."); } else { memcpy(q, slirp->vdnssearch, val); q += val; diff --git a/bochs/iodev/network/slirp/dnssearch.cc b/bochs/iodev/network/slirp/dnssearch.cc index f9545feaa..85cce9df4 100644 --- a/bochs/iodev/network/slirp/dnssearch.cc +++ b/bochs/iodev/network/slirp/dnssearch.cc @@ -25,18 +25,13 @@ * THE SOFTWARE. */ -#define BX_PLUGGABLE - #include #include #include -#include "iodev.h" #include "slirp.h" #if BX_NETWORKING && BX_NETMOD_SLIRP_NEW -#define LOG_THIS genlog-> - static const uint8_t RFC3397_OPT_DOMAIN_SEARCH = 119; static const uint8_t MAX_OPT_LEN = 255; static const uint8_t OPT_HEADER_LEN = 2; @@ -124,13 +119,14 @@ static void domain_fixup_order(CompactDomain *cd, size_t n) } } -static void domain_mklabels(CompactDomain *cd, const char *input) +static void domain_mklabels(Slirp *s, CompactDomain *cd, const char *input) { uint8_t *len_marker = cd->labels; uint8_t *output = len_marker; /* pre-incremented */ const char *in = input; char cur_chr; size_t len = 0; + char msg[80]; if (cd->len == 0) { goto fail; @@ -162,7 +158,8 @@ static void domain_mklabels(CompactDomain *cd, const char *input) return; fail: - BX_ERROR(("failed to parse domain name '%s'\n", input)); + sprintf(msg, "failed to parse domain name '%s'\n", input); + slirp_warning(s, msg); cd->len = 0; } @@ -279,7 +276,7 @@ int translate_dnssearch(Slirp *s, const char **names) outptr = result; for (i = 0; i < num_domains; i++) { domains[i].labels = outptr; - domain_mklabels(domains + i, names[i]); + domain_mklabels(s, domains + i, names[i]); outptr += domains[i].len; } diff --git a/bochs/iodev/network/slirp/libslirp.h b/bochs/iodev/network/slirp/libslirp.h index b4e7d5996..45cb31c01 100644 --- a/bochs/iodev/network/slirp/libslirp.h +++ b/bochs/iodev/network/slirp/libslirp.h @@ -17,7 +17,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, const char *vhostname, const char *tftp_path, const char *bootfile, struct in_addr vdhcp_start, struct in_addr vnameserver, const char **vdnssearch, - void *opaque); + void *opaque, void *logfn); void slirp_cleanup(Slirp *slirp); void slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds, diff --git a/bochs/iodev/network/slirp/slirp.cc b/bochs/iodev/network/slirp/slirp.cc index 1ae4b9719..1cf29eb67 100644 --- a/bochs/iodev/network/slirp/slirp.cc +++ b/bochs/iodev/network/slirp/slirp.cc @@ -31,7 +31,7 @@ #if BX_NETWORKING && BX_NETMOD_SLIRP_NEW -#define LOG_THIS genlog-> +#define LOG_THIS ((logfunctions*)slirp->logfn)-> /* host loopback address */ struct in_addr loopback_addr; @@ -214,7 +214,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, const char *vhostname, const char *tftp_path, const char *bootfile, struct in_addr vdhcp_start, struct in_addr vnameserver, const char **vdnssearch, - void *opaque) + void *opaque, void *logfn) { Slirp *slirp = (Slirp*)malloc(sizeof(Slirp)); memset(slirp, 0, sizeof(Slirp)); @@ -250,6 +250,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, } slirp->opaque = opaque; + slirp->logfn = logfn; QTAILQ_INSERT_TAIL(&slirp_instances, slirp, entry); @@ -869,6 +870,7 @@ int slirp_add_exec(Slirp *slirp, int do_pty, const void *args, ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags) { if (so->s == -1 && so->extra) { + Slirp *slirp = so->slirp; BX_ERROR(("slirp_send(): so->extra not supported")); return len; } @@ -924,4 +926,9 @@ void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr, int guest_port, tcp_output(sototcpcb(so)); } +void slirp_warning(Slirp *slirp, const char *msg) +{ + BX_ERROR((msg)); +} + #endif diff --git a/bochs/iodev/network/slirp/slirp.h b/bochs/iodev/network/slirp/slirp.h index 89de5ed24..0ecc02fda 100644 --- a/bochs/iodev/network/slirp/slirp.h +++ b/bochs/iodev/network/slirp/slirp.h @@ -279,6 +279,7 @@ struct Slirp { ArpTable arp_table; void *opaque; + void *logfn; }; extern Slirp *slirp_instance; @@ -305,6 +306,8 @@ void if_start(struct ttys *); long gethostid(void); #endif +void slirp_warning(Slirp *, const char *); + #ifndef _WIN32 #include #endif diff --git a/bochs/misc/slirp.conf b/bochs/misc/slirp.conf new file mode 100644 index 000000000..d97127d5a --- /dev/null +++ b/bochs/misc/slirp.conf @@ -0,0 +1,18 @@ +# slirp config +# The line above is mandatory + +# This is the classic slirp setup +# restricted = 0 +# net = 10.0.2.0 +# mask = 255.255.255.0 +# host = 10.0.2.2 +# dhcp = 10.0.2.15 +# dns = 10.0.2.3 + +# This is the vnet setup +restricted = 1 +net = 192.168.10.0 +mask = 255.255.255.0 +host = 192.168.10.1 +dhcp = 192.168.10.2 +dns = 0.0.0.0