diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2019-01-15 18:32:57 +0000 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2019-01-15 18:32:57 +0000 |
| commit | 6f2f34177a25bffd6fd92a05e6e66c8d22d97094 (patch) | |
| tree | 1882acc43647e724d01c6b6057b1fc7bad70d47a /net/slirp.c | |
| parent | 4b9f0b0f7c84eea2dfb0d5be3e0254bc91319dbc (diff) | |
| parent | a7104eda7dab99d0cdbd3595c211864cba415905 (diff) | |
| download | focaccia-qemu-6f2f34177a25bffd6fd92a05e6e66c8d22d97094.tar.gz focaccia-qemu-6f2f34177a25bffd6fd92a05e6e66c8d22d97094.zip | |
Merge remote-tracking branch 'remotes/thibault/tags/samuel-thibault' into staging
slirp updates Gerd Hoffmann (1): slirp: add tftp tracing Marc-André Lureau (61): slirp: associate slirp_output callback with the Slirp context slirp: remove do_pty from fork_exec() slirp: replace ex_pty with ex_chardev slirp: use a dedicated field for chardev pointer slirp: remove unused EMU_RSH slirp: rename /extra/chardev slirp: move internal function declarations slirp: remove Monitor dependency, return a string for info slirp: fix slirp_add_exec() leaks slirp: replace the poor-man string split with g_strsplit() slirp: remove dead declarations slirp: move socket pair creation in helper function slirp: remove unused M_TRAILINGSPACE slirp: use a callback structure to interface with qemu slirp: remove PROBE_CONN dead-code slirp: remove FULL_BOLT slirp: remove the disabled readv()/writev() code path slirp: remove HAVE_SYS_SIGNAL_H slirp: remove unused HAVE_SYS_BITYPES_H slirp: remove NO_UNIX_SOCKETS slirp: remove unused HAVE_SYS_STROPTS_H slirp: remove unused HAVE_ARPA_INET_H slirp: remove unused HAVE_SYS_WAIT_H slirp: remove unused HAVE_SYS_SELECT_H slirp: remove HAVE_SYS_IOCTL_H slirp: remove HAVE_SYS_FILIO_H slirp: remove unused DECLARE_IOVEC slirp: remove unused HAVE_INET_ATON slirp: replace HOST_WORDS_BIGENDIAN with glib equivalent slirp: replace SIZEOF_CHAR_P with glib equivalent slirp: replace compile time DO_KEEPALIVE slirp: remove unused global slirp_instance slirp: replace error_report() with g_critical() slirp: improve a bit the debug macros slirp: add a callback to log guest errors slirp: remove #if notdef dead code slirp: remove unused sbflush() slirp: NULL is defined by stddef.h slirp: remove dead TCP_ACK_HACK code slirp: replace ARRAY_SIZE with G_N_ELEMENTS net: do not depend on slirp internals glib-compat: add g_spawn_async_with_fds() fallback slirp: simplify fork_exec() slirp: replace error_report() with g_critical() slirp: drop <Vista compatibility slirp: rename exec_list slirp: use virtual time for packet expiration slirp: replace a fprintf with g_critical() slirp: replace some fprintf() with DEBUG_MISC slirp: replace a DEBUG block with WITH_ICMP_ERROR_MSG slirp: no need to make DPRINTF conditional on DEBUG slirp: always build with debug statements slirp: introduce SLIRP_DEBUG environment variable slirp: use %p for pointers format slirp: remove remaining DEBUG blocks slirp: replace DEBUG_ARGS with DEBUG_ARG slirp: factor out guestfwd addition checks slirp: add clock_get_ns() callback build-sys: use a separate slirp-obj-y && slirp.mo slirp: set G_LOG_DOMAIN slirp: call into g_debug() for DEBUG macros Prasad J Pandit (1): slirp: check data length while emulating ident function Samuel Thibault (2): slirp: Enable fork_exec support on Windows slirp: Mark debugging calls as unlikely Makefile | 5 +- Makefile.objs | 4 +- Makefile.target | 5 +- include/glib-compat.h | 56 +++++++++ net/colo-compare.c | 11 +- net/colo.c | 1 + net/colo.h | 7 +- net/filter-rewriter.c | 9 +- net/slirp.c | 61 +++++---- net/util.h | 55 ++++++++ slirp/Makefile.objs | 37 +++++- slirp/arp_table.c | 12 +- slirp/bootp.c | 10 +- slirp/cksum.c | 8 +- slirp/debug.h | 47 ++++--- slirp/dhcpv6.c | 17 ++- slirp/if.c | 4 +- slirp/ip.h | 10 +- slirp/ip6.h | 3 +- slirp/ip6_icmp.c | 27 ++-- slirp/ip6_icmp.h | 6 +- slirp/ip6_input.c | 2 +- slirp/ip6_output.c | 4 +- slirp/ip_icmp.c | 31 ++--- slirp/ip_input.c | 200 ----------------------------- slirp/libslirp.h | 27 ++-- slirp/main.h | 33 ----- slirp/mbuf.c | 2 +- slirp/mbuf.h | 1 - slirp/misc.c | 286 +++++++++++++++++------------------------- slirp/misc.h | 13 +- slirp/ncsi.c | 4 +- slirp/ndp_table.c | 32 +++-- slirp/sbuf.h | 1 - slirp/slirp.c | 177 +++++++++++++------------- slirp/slirp.h | 45 ++----- slirp/slirp_config.h | 86 ------------- slirp/socket.c | 53 +++----- slirp/socket.h | 2 +- slirp/tcp.h | 4 +- slirp/tcp_input.c | 84 ++----------- slirp/tcp_output.c | 2 +- slirp/tcp_subr.c | 22 ++-- slirp/tcp_timer.c | 2 +- slirp/tftp.c | 7 +- slirp/trace-events | 5 + slirp/udp.c | 5 +- slirp/udp6.c | 11 +- stubs/slirp.c | 2 +- 49 files changed, 603 insertions(+), 935 deletions(-) delete mode 100644 slirp/slirp_config.h create mode 100644 slirp/trace-events -- 2.20.1 # gpg: Signature made Mon 14 Jan 2019 22:52:32 GMT # gpg: using RSA key DB550E89F0FA54F3 # gpg: Good signature from "Samuel Thibault <samuel.thibault@aquilenet.fr>" # gpg: aka "Samuel Thibault <sthibault@debian.org>" # gpg: aka "Samuel Thibault <samuel.thibault@gnu.org>" # gpg: aka "Samuel Thibault <samuel.thibault@inria.fr>" # gpg: aka "Samuel Thibault <samuel.thibault@labri.fr>" # gpg: aka "Samuel Thibault <samuel.thibault@ens-lyon.org>" # gpg: aka "Samuel Thibault <samuel.thibault@u-bordeaux.fr>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 900C B024 B679 31D4 0F82 304B D017 8C76 7D06 9EE6 # Subkey fingerprint: E61D BB15 D417 2BDE C97E 92D9 DB55 0E89 F0FA 54F3 * remotes/thibault/tags/samuel-thibault: (65 commits) slirp: check data length while emulating ident function slirp: Mark debugging calls as unlikely slirp: call into g_debug() for DEBUG macros slirp: set G_LOG_DOMAIN build-sys: use a separate slirp-obj-y && slirp.mo slirp: add clock_get_ns() callback slirp: factor out guestfwd addition checks slirp: replace DEBUG_ARGS with DEBUG_ARG slirp: remove remaining DEBUG blocks slirp: use %p for pointers format slirp: introduce SLIRP_DEBUG environment variable slirp: always build with debug statements slirp: no need to make DPRINTF conditional on DEBUG slirp: replace a DEBUG block with WITH_ICMP_ERROR_MSG slirp: replace some fprintf() with DEBUG_MISC slirp: replace a fprintf with g_critical() slirp: use virtual time for packet expiration slirp: rename exec_list slirp: drop <Vista compatibility slirp: Enable fork_exec support on Windows ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'net/slirp.c')
| -rw-r--r-- | net/slirp.c | 61 |
1 files changed, 29 insertions, 32 deletions
diff --git a/net/slirp.c b/net/slirp.c index 38ae65e4a9..f98425ee9f 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -23,6 +23,7 @@ */ #include "qemu/osdep.h" +#include "qemu/log.h" #include "net/slirp.h" @@ -37,12 +38,12 @@ #include "qemu/error-report.h" #include "qemu/sockets.h" #include "slirp/libslirp.h" -#include "slirp/ip6.h" #include "chardev/char-fe.h" #include "sysemu/sysemu.h" #include "qemu/cutils.h" #include "qapi/error.h" #include "qapi/qmp/qdict.h" +#include "util.h" static int get_str_sep(char *buf, int buf_size, const char **pp, int sep) { @@ -99,7 +100,7 @@ static void slirp_smb_cleanup(SlirpState *s); static inline void slirp_smb_cleanup(SlirpState *s) { } #endif -void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len) +static void net_slirp_output(void *opaque, const uint8_t *pkt, int pkt_len) { SlirpState *s = opaque; @@ -140,6 +141,22 @@ static NetClientInfo net_slirp_info = { .cleanup = net_slirp_cleanup, }; +static void net_slirp_guest_error(const char *msg) +{ + qemu_log_mask(LOG_GUEST_ERROR, "%s", msg); +} + +static int64_t net_slirp_clock_get_ns(void) +{ + return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); +} + +static const SlirpCb slirp_cb = { + .output = net_slirp_output, + .guest_error = net_slirp_guest_error, + .clock_get_ns = net_slirp_clock_get_ns, +}; + static int net_slirp_init(NetClientState *peer, const char *model, const char *name, int restricted, bool ipv4, const char *vnetwork, const char *vhost, @@ -279,17 +296,6 @@ static int net_slirp_init(NetClientState *peer, const char *model, } #endif -#if defined(_WIN32) && (_WIN32_WINNT < 0x0600) - /* No inet_pton helper before Vista... */ - if (vprefix6) { - /* Unsupported */ - error_setg(errp, "IPv6 prefix not supported"); - return -1; - } - memset(&ip6_prefix, 0, sizeof(ip6_prefix)); - ip6_prefix.s6_addr[0] = 0xfe; - ip6_prefix.s6_addr[1] = 0xc0; -#else if (!vprefix6) { vprefix6 = "fec0::"; } @@ -297,7 +303,6 @@ static int net_slirp_init(NetClientState *peer, const char *model, error_setg(errp, "Failed to parse IPv6 prefix"); return -1; } -#endif if (!vprefix6_len) { vprefix6_len = 64; @@ -309,10 +314,6 @@ static int net_slirp_init(NetClientState *peer, const char *model, } if (vhost6) { -#if defined(_WIN32) && (_WIN32_WINNT < 0x0600) - error_setg(errp, "IPv6 host not supported"); - return -1; -#else if (!inet_pton(AF_INET6, vhost6, &ip6_host)) { error_setg(errp, "Failed to parse IPv6 host"); return -1; @@ -321,17 +322,12 @@ static int net_slirp_init(NetClientState *peer, const char *model, error_setg(errp, "IPv6 Host doesn't belong to network"); return -1; } -#endif } else { ip6_host = ip6_prefix; ip6_host.s6_addr[15] |= 2; } if (vnameserver6) { -#if defined(_WIN32) && (_WIN32_WINNT < 0x0600) - error_setg(errp, "IPv6 DNS not supported"); - return -1; -#else if (!inet_pton(AF_INET6, vnameserver6, &ip6_dns)) { error_setg(errp, "Failed to parse IPv6 DNS"); return -1; @@ -340,7 +336,6 @@ static int net_slirp_init(NetClientState *peer, const char *model, error_setg(errp, "IPv6 DNS doesn't belong to network"); return -1; } -#endif } else { ip6_dns = ip6_prefix; ip6_dns.s6_addr[15] |= 3; @@ -378,7 +373,8 @@ static int net_slirp_init(NetClientState *peer, const char *model, ipv6, ip6_prefix, vprefix6_len, ip6_host, vhostname, tftp_server_name, tftp_export, bootfile, dhcp, - dns, ip6_dns, dnssearch, vdomainname, s); + dns, ip6_dns, dnssearch, vdomainname, + &slirp_cb, s); QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry); for (config = slirp_configs; config; config = config->next) { @@ -708,8 +704,8 @@ static int slirp_smb(SlirpState* s, const char *exported_dir, CONFIG_SMBD_COMMAND, s->smb_dir, smb_conf); g_free(smb_conf); - if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0 || - slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 445) < 0) { + if (slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 139) < 0 || + slirp_add_exec(s->slirp, NULL, smb_cmdline, &vserver_addr, 445) < 0) { slirp_smb_cleanup(s); g_free(smb_cmdline); error_setg(errp, "Conflicting/invalid smbserver address"); @@ -773,7 +769,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp) snprintf(buf, sizeof(buf), "guestfwd.tcp.%d", port); if ((strlen(p) > 4) && !strncmp(p, "cmd:", 4)) { - if (slirp_add_exec(s->slirp, 0, &p[4], &server, port) < 0) { + if (slirp_add_exec(s->slirp, NULL, &p[4], &server, port) < 0) { error_setg(errp, "Conflicting/invalid host:port in guest " "forwarding rule '%s'", config_str); return -1; @@ -800,7 +796,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp) return -1; } - if (slirp_add_exec(s->slirp, 3, &fwd->hd, &server, port) < 0) { + if (slirp_add_exec(s->slirp, &fwd->hd, NULL, &server, port) < 0) { error_setg(errp, "Conflicting/invalid host:port in guest " "forwarding rule '%s'", config_str); g_free(fwd); @@ -827,10 +823,11 @@ void hmp_info_usernet(Monitor *mon, const QDict *qdict) QTAILQ_FOREACH(s, &slirp_stacks, entry) { int id; bool got_hub_id = net_hub_id_for_client(&s->nc, &id) == 0; - monitor_printf(mon, "Hub %d (%s):\n", + char *info = slirp_connection_info(s->slirp); + monitor_printf(mon, "Hub %d (%s):\n%s", got_hub_id ? id : -1, - s->nc.name); - slirp_connection_info(s->slirp, mon); + s->nc.name, info); + g_free(info); } } |