slirp.c revision d981a844e64c196b4c96be1a52ddc42e23337138
1N/A#include "dnsproxy/dnsproxy.h"
1N/A#ifndef RT_OS_WINDOWS
1N/A# define _WINSOCK2API_
1N/A# include <IPHlpApi.h>
1N/A#ifdef VBOX_WITH_SLIRP_ALIAS
1N/A#if !defined(RT_OS_WINDOWS)
1N/A poll_index++; \
1N/A poll_index++; \
1N/A# define DO_UNIX_CHECK_FD_SET(so, events, fdset ) DO_CHECK_FD_SET((so), (events), fdset) /*specific for Unix API */
1N/A# ifndef RT_OS_WINDOWS
1N/A# ifndef RT_OS_LINUX
# if defined(RT_OS_WINDOWS)
#define LOG_NAT_SOCK(so, proto, winevent, r_fdset, w_fdset, x_fdset) DO_LOG_NAT_SOCK((so), proto, (winevent), r_fdset, w_fdset, x_fdset)
#ifdef RT_OS_WINDOWS
# ifndef VBOX_WITH_MULTI_DNS
const char **ppszDomain)
int rc = 0;
if (FixedInfo)
if (FixedInfo)
goto get_dns_prefix;
while (pIPAddr)
if (fVerbose)
if (FixedInfo)
if (ppszDomain)
if (szDnsDomain[0])
if (fVerbose)
return rc;
const char **ppszDomain)
ULONG flags = GAA_FLAG_INCLUDE_PREFIX; /*GAA_FLAG_INCLUDE_ALL_INTERFACES;*/ /* all interfaces registered in NDIS */
int wlen = 0;
char *suffix;
if (size == 0)
int found;
goto next;
goto next_dns;
return VERR_NO_MEMORY;
if ((((struct sockaddr_in *)saddr)->sin_addr.s_addr & htonl(IN_CLASSA_NET)) == ntohl(INADDR_LOOPBACK & IN_CLASSA_NET)) {
goto next_dns;
goto next_dns;
found = 0;
if (found == 0)
return VERR_NO_MEMORY;
next:
const char **ppszDomain)
int found = 0;
#ifdef RT_OS_OS2
if (etc)
#ifndef DEBUG_vvl
if (f != NULL)
if (ppszDomain)
#ifdef VBOX_WITH_MULTI_DNS
#ifndef VBOX_WITH_MULTI_DNS
if (!found)
if (fVerbose)
found++;
#ifndef VBOX_WITH_MULTI_DNS
if ( ppszDomain
char *tok;
char *saveptr;
if (tok)
if (fVerbose)
char *tok;
char *saveptr;
int found = 0;
return VERR_NO_MEMORY;
fclose(f);
if (!found)
#ifdef VBOX_WITH_MULTI_DNS
#ifndef VBOX_WITH_NAT_SERVICE
int fNATfailed = 0;
int rc;
if (!pData)
return VERR_NO_MEMORY;
return VERR_INVALID_PARAMETER;
#ifdef RT_OS_WINDOWS
#ifdef VBOX_WITH_SLIRP_MT
debug_init();
#ifndef VBOX_WITH_NAT_SERVICE
#ifndef VBOX_WITH_MULTI_DNS
#ifdef VBOX_WITH_SLIRP_DNS_PROXY
#ifdef VBOX_WITH_SLIRP_ALIAS
int flags = 0;
#ifdef VBOX_WITH_STATISTICS
type, \
units, \
dsc, \
#include "counters.h"
link_up = 0;
#ifndef VBOX_WITH_MULTI_DNS
#ifdef RT_OS_WINDOWS
#ifdef VBOX_WITH_MULTI_DNS
#ifdef RT_OS_WINDOWS
WSACleanup();
#ifdef VBOX_WITH_SLIRP_ALIAS
#ifdef LOG_ENABLED
#define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED)
#ifdef RT_OS_WINDOWS
curtime++;
#ifdef RT_OS_WINDOWS
int nfds;
#if defined(RT_OS_WINDOWS)
int rc;
int error;
int poll_index = 0;
do_slowtimo = 0;
if (!link_up)
goto done;
if (!do_slowtimo)
for (i = 0; i < IPREASS_NHASH; i++)
#if !defined(RT_OS_WINDOWS)
if ( time_fasttimo == 0
#if !defined(RT_OS_WINDOWS)
#ifdef VBOX_WITH_SLIRP_DNS_PROXY
#ifdef VBOX_WITH_SLIRP_MT
done:
#if defined(RT_OS_WINDOWS)
#if defined(RT_OS_WINDOWS)
int ret;
#if defined(RT_OS_WINDOWS)
int rc;
int error;
int poll_index = 0;
if (link_up)
time_fasttimo = 0;
#if defined(RT_OS_WINDOWS)
if (fTimeout)
if (!link_up)
goto done;
#if defined(RT_OS_WINDOWS)
* fIcmp in slirp_state.h
if (fIcmp)
#ifdef VBOX_WITH_SLIRP_MT
NSOCK_DEC();
#if defined(RT_OS_WINDOWS)
#if defined(RT_OS_WINDOWS)
if (ret > 0)
#ifndef RT_OS_OS2
if (ret < 0)
#ifdef PROBE_CONN
if (ret < 0)
if (ret < 0)
#ifndef RT_OS_WINDOWS
int err;
int status;
if (status != 0)
#ifndef RT_OS_SOLARIS
if (status != 0)
goto tcp_input_close;
goto tcp_input_close;
so->so_state = SS_NOFDREF; /*cause connection valid tcp connection termination and socket closing */
#ifdef VBOX_WITH_SLIRP_MT
NSOCK_DEC();
done:
#ifndef VBOX_WITH_SLIRP_MT
#ifndef VBOX_WITHOUT_SLIRP_CLIENT_ETHER
struct ethhdr
struct arphdr
int ar_op;
switch(ar_op)
case ARPOP_REQUEST:
#ifdef VBOX_WITH_NAT_SERVICE
goto arp_ok;
goto arp_ok;
case CTL_DNS:
case CTL_ALIAS:
struct mbuf *m;
int proto;
static bool fWarnedIpv6;
/* @todo vasily: add ether logging routine in debug.c */
switch(proto)
case ETH_P_ARP:
case ETH_P_IP:
case ETH_P_IPV6:
if (!fWarnedIpv6)
fWarnedIpv6 = true;
#ifndef VBOX_WITHOUT_SLIRP_CLIENT_ETHER
goto done;
done:
#ifdef VBOX_WITH_SLIRP_ALIAS
int flags;
int rc;
if (is_udp)
#ifndef VBOX_WITH_SLIRP_ALIAS
int guest_port)
#ifndef VBOX_WITHOUT_SLIRP_CLIENT_ETHER
#if defined(RT_OS_WINDOWS)
if (link_up)
if (time_fasttimo)
if (do_slowtimo)
#ifndef RT_OS_WINDOWS
#ifdef VBOX_WITH_SLIRP_MT
service = 0;
switch (hdport)
#ifdef VBOX_WITH_SLIRP_DNS_PROXY