proxy.c revision daef40d247c31e2073c0ed0ec55fac77a4b89ac3
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync/* -*- indent-tabs-mode: nil; -*- */
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync#if defined(SOCK_NONBLOCK) && defined(RT_OS_NETBSD) /* XXX: PR kern/47569 */
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync# define __arraycount(a) (sizeof(a)/sizeof(a[0]))
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync/* XXX: for mapping loopbacks to addresses in our network (ip4) */
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * Called on the lwip thread (aka tcpip thread) from tcpip_init() via
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * its "tcpip_init_done" callback. Raw API is ok to use here
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * (e.g. rtadvd), but netconn API is not.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsyncproxy_init(struct netif *proxy_netif, struct proxy_options *opts)
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * XXX: We use stateless DHCPv6 only to report IPv6 address(es) of
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * nameserver(s). Since we don't yet support IPv6 addresses in
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * HostDnsService, there's no point in running DHCPv6.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync errx(EXIT_FAILURE, "failed to initialize poll manager");
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync /* NOTREACHED */
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync pxping_init(proxy_netif, opts->icmpsock4, opts->icmpsock6);
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync errx(EXIT_FAILURE, "failed to create poll manager thread");
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync /* NOTREACHED */
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * Send static callback message from poll manager thread to lwip
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * thread, scheduling a function call in lwip thread context.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * XXX: Existing lwip api only provides non-blocking version for this.
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * It may fail when lwip thread is not running (mbox invalid) or if
deb4998ba50060c48cce222fd18a8eed053918d7vboxsync * post failed (mbox full). How to handle these?
struct tcpip_callback_msg *m;
static SOCKET
SOCKET s;
int stype_and_flags;
int status;
#if defined(SOCK_NONBLOCK)
#if defined(SOCK_NOSIGPIPE)
if (s == INVALID_SOCKET) {
return INVALID_SOCKET;
int sflags;
if (sflags < 0) {
closesocket(s);
return INVALID_SOCKET;
if (status < 0) {
closesocket(s);
return INVALID_SOCKET;
if (status < 0) {
closesocket(s);
return INVALID_SOCKET;
#if defined(RT_OS_WINDOWS)
return INVALID_SOCKET;
void *pdst_addr;
int status;
SOCKET s;
#if HAVE_SA_LEN
#if HAVE_SA_LEN
if (s == INVALID_SOCKET) {
return INVALID_SOCKET;
closesocket(s);
return INVALID_SOCKET;
closesocket(s);
return INVALID_SOCKET;
SOCKET s;
int on;
int status;
if (s == INVALID_SOCKET) {
return INVALID_SOCKET;
sizeof(struct sockaddr_in)
: sizeof(struct sockaddr_in6));
if (status < 0) {
closesocket(s);
return INVALID_SOCKET;
if (status < 0) {
closesocket(s);
return INVALID_SOCKET;
closesocket(s);
struct pbuf *q;
#ifndef RT_OS_WINDOWS
int rc;
int error = 0;
goto out;
#ifndef RT_OS_WINDOWS
if (nsent < 0) {
out:
return error;
static const char *lwiperr[] = {
int e = -error;
return lwiperr[e];
return buf;