Ticket #1: networkservices.diff

File networkservices.diff, 27.6 KB (added by Valery V. Sedletski, 9 years ago)

Network Services

  • \src\VBox\NetworkServices/NAT/fwtcp.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/fwtcp.c vbox-trunk\src\VBox\NetworkServices/NAT/fwtcp.c
    old new  
    2929#include <arpa/inet.h>
    3030#include <stdio.h>
    3131#include <poll.h>
     32#ifdef RT_OS_OS2
     33typedef unsigned long socklen_t;
     34#endif
    3235
    3336#include <err.h>                /* BSD'ism */
    3437#else
     
    214217fwtcp_pmgr_listen(struct pollmgr_handler *handler, SOCKET fd, int revents)
    215218{
    216219    struct fwtcp *fwtcp;
     220#ifdef IPv6
    217221    struct sockaddr_storage ss;
     222#else
     223    struct sockaddr_in ss;
     224#endif
    218225    socklen_t sslen;
    219226    struct pxtcp *pxtcp;
    220227    SOCKET newsock;
     
    233240    LWIP_ASSERT1(sys_mbox_valid(&fwtcp->connmbox));
    234241
    235242    sslen = sizeof(ss);
    236     newsock = accept(fwtcp->sock, (struct sockaddr *)&ss, &sslen);
     243    newsock = accept(fwtcp->sock, (struct sockaddr *)&ss, (int *)&sslen);
    237244    if (newsock == INVALID_SOCKET) {
    238245        return POLLIN;
    239246    }
    240247
    241248
     249#ifdef IPv6
    242250    if (ss.ss_family == PF_INET) {
     251#else
     252    if (ss.sin_family == PF_INET) {
     253#endif
    243254        struct sockaddr_in *peer4 = (struct sockaddr_in *)&ss;
    244255        DPRINTF(("<--- TCP %RTnaipv4:%d\n",
    245256                 peer4->sin_addr.s_addr, ntohs(peer4->sin_port)));
    246257    }
     258#ifdef IPv6
    247259    else { /* PF_INET6 */
    248260        struct sockaddr_in6 *peer6 = (struct sockaddr_in6 *)&ss;
    249261        DPRINTF(("<--- TCP %RTnaipv6:%d\n",
    250262                 &peer6->sin6_addr, ntohs(peer6->sin6_port)));
    251263    }
     264#endif
    252265
    253266    pxtcp = pxtcp_create_forwarded(newsock);
    254267    if (pxtcp == NULL) {
  • \src\VBox\NetworkServices/NAT/fwudp.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/fwudp.c vbox-trunk\src\VBox\NetworkServices/NAT/fwudp.c
    old new  
    2929#include <stdio.h>
    3030#include <string.h>
    3131#include <poll.h>
     32#ifdef RT_OS_OS2
     33typedef unsigned long socklen_t;
     34#endif
    3235
    3336#include <err.h>                /* BSD'ism */
    3437#else
     
    202205    fwudp->sock = sock;
    203206    fwudp->fwspec = *fwspec;    /* struct copy */
    204207
     208#ifdef IPv6
    205209    /* XXX */
    206210    if (fwspec->sdom == PF_INET) {
     211#endif
    207212        struct sockaddr_in *dst4 = &fwspec->dst.sin;
    208213        memcpy(&fwudp->dst_addr.ip4, &dst4->sin_addr, sizeof(ip_addr_t));
    209214        fwudp->dst_port = htons(dst4->sin_port);
     215#ifdef IPv6
    210216    }
    211217    else { /* PF_INET6 */
    212218        struct sockaddr_in6 *dst6 = &fwspec->dst.sin6;
    213219        memcpy(&fwudp->dst_addr.ip6, &dst6->sin6_addr, sizeof(ip6_addr_t));
    214220        fwudp->dst_port = htons(dst6->sin6_port);
    215221    }
     222#endif
    216223
    217224    fwudp->inbuf.bufsize = 256; /* elements  */
    218225    fwudp->inbuf.buf
     
    261268fwudp_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
    262269{
    263270    struct fwudp *fwudp;
     271#ifdef IPv6
    264272    struct sockaddr_storage ss;
     273#else
     274    struct sockaddr_in ss;
     275#endif
    265276    socklen_t sslen = sizeof(ss);
    266277    size_t beg, lim;
    267278    struct fwudp_dgram *dgram;
     
    279290    LWIP_UNUSED_ARG(revents);
    280291
    281292    nread = recvfrom(fwudp->sock, pollmgr_udpbuf, sizeof(pollmgr_udpbuf), 0,
    282                      (struct sockaddr *)&ss, &sslen);
     293                     (struct sockaddr *)&ss, (int *)&sslen);
    283294    if (nread < 0) {
    284295        DPRINTF(("%s: %R[sockerr]\n", __func__, SOCKERRNO()));
    285296        return POLLIN;
     
    308319        return POLLIN;
    309320    }
    310321
     322#ifdef IPv6
    311323    if (ss.ss_family == AF_INET) {
     324#else
     325    if (ss.sin_family == PF_INET) {
     326#endif
    312327        const struct sockaddr_in *peer4 = (const struct sockaddr_in *)&ss;
    313328        dgram->src_port = htons(peer4->sin_port);
    314329    }
     330#ifdef IPv6
    315331    else { /* PF_INET6 */
    316332        const struct sockaddr_in6 *peer6 = (const struct sockaddr_in6 *)&ss;
    317333        dgram->src_port = htons(peer6->sin6_port);
    318334    }
     335#endif
    319336
    320337    p = pbuf_alloc(PBUF_RAW, nread, PBUF_RAM);
    321338    if (p == NULL) {
     
    476493{
    477494    union {
    478495        struct sockaddr_in sin;
     496#ifdef IPv6
    479497        struct sockaddr_in6 sin6;
     498#endif
    480499    } peer;
    481500    socklen_t namelen;
    482501
    483502    memset(&peer, 0, sizeof(peer)); /* XXX: shut up valgrind */
    484503
     504#ifdef IPv6
    485505    if (fwudp->fwspec.sdom == PF_INET) {
     506#endif
    486507        peer.sin.sin_family = AF_INET;
    487508#if HAVE_SA_LEN
    488509        peer.sin.sin_len =
     
    490511        namelen = sizeof(peer.sin);
    491512        pxremap_outbound_ip4((ip_addr_t *)&peer.sin.sin_addr, &pcb->local_ip.ip4);
    492513        peer.sin.sin_port = htons(pcb->local_port);
     514#ifdef IPv6
    493515    }
    494516    else {
    495517        peer.sin6.sin6_family = AF_INET6;
     
    501523        pxremap_outbound_ip6((ip6_addr_t *)&peer.sin6.sin6_addr, &pcb->local_ip.ip6);
    502524        peer.sin6.sin6_port = htons(pcb->local_port);
    503525    }
     526#endif
    504527
    505528    proxy_sendto(fwudp->sock, p, &peer, namelen);
    506529    pbuf_free(p);
  • \src\VBox\NetworkServices/NAT/Makefile.kmk

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/Makefile.kmk vbox-trunk\src\VBox\NetworkServices/NAT/Makefile.kmk
    old new  
    4444VBoxNetLwipNAT_TEMPLATE =
    4545VBoxNetLwipNAT_TEMPLATE := VBOXMAIN$(if-expr defined(VBOX_WITH_HARDENING),DLL,CLIENTEXE)
    4646VBoxNetLwipNAT_NAME = VBoxNetNAT
    47 VBoxNetLwipNAT_DEFS += ${LWIP_DEFS} IPv6
     47VBoxNetLwipNAT_DEFS += ${LWIP_DEFS}
     48ifn1of ($(KBUILD_TARGET), os2)
     49 VBoxNetLwipNAT_DEFS += IPv6
     50endif
    4851# VBoxNetLwipNAT_DEFS.linux += WITH_VALGRIND # instrument lwip memp.c
    4952VBoxNetLwipNAT_DEFS.win += VBOX_COM_OUTOFPROC_MODULE _WIN32_WINNT=0x501 # Windows XP
    5053VBoxNetLwipNAT_SOURCES += VBoxNetLwipNAT.cpp    \
     
    5861VBoxNetLwipNAT_LIBS = \
    5962        $(LIB_RUNTIME)
    6063VBoxNetLwipNAT_LIBS.solaris += socket nsl
     64VBoxNetLwipNAT_LIBS.os2 += socket \
     65        $(PATH_STAGE_LIB)/VBox-os2-poll$(VBOX_SUFF_LIB)
     66VBoxNetLwipNAT_INCS.os2 += $(PATH_SUB_CURRENT)/src/libs/poll-os2
    6167VBoxNetLwipNAT_LDFLAGS.win = /SUBSYSTEM:windows
    6268
    6369# Convince Solaris headers to expose socket stuff we need.
     
    98104    fwtcp.c \
    99105    fwudp.c \
    100106    portfwd.c \
    101     proxy_dhcp6ds.c \
    102107    proxy_tftpd.c
    103108
     109ifn1of ($(KBUILD_TARGET),os2)
     110VBoxNetLwipNAT_SOURCES += \
     111    proxy_dhcp6ds.c
     112endif
     113
    104114ifeq ($(KBUILD_TARGET),win)
    105115 # unprivileged Icmp API
    106116 VBoxNetLwipNAT_SOURCES += pxping_win.c
     
    121131VBoxNetLwipNAT_SOURCES.freebsd += rtmon_bsd.c
    122132VBoxNetLwipNAT_SOURCES.linux   += rtmon_linux.c
    123133VBoxNetLwipNAT_SOURCES.solaris += rtmon_bsd.c
     134VBoxNetLwipNAT_SOURCES.os2     += rtmon_win.c
    124135VBoxNetLwipNAT_SOURCES.win     += rtmon_win.c
    125136
    126137VBoxNetLwipNAT_SOURCES.win += \
  • \src\VBox\NetworkServices/NAT/portfwd.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/portfwd.c vbox-trunk\src\VBox\NetworkServices/NAT/portfwd.c
    old new  
    149149           const char *src_addr_str, uint16_t src_port,
    150150           const char *dst_addr_str, uint16_t dst_port)
    151151{
     152#ifdef IPv6
    152153    struct addrinfo hints;
    153154    struct addrinfo *ai;
     155#endif
    154156    int status;
    155157
     158#ifdef IPv6
    156159    LWIP_ASSERT1(sdom == PF_INET || sdom == PF_INET6);
     160#else
     161    LWIP_ASSERT1(sdom == PF_INET);
     162#endif
    157163    LWIP_ASSERT1(stype == SOCK_STREAM || stype == SOCK_DGRAM);
    158164
    159165    fwspec->sdom = sdom;
    160166    fwspec->stype = stype;
    161167
     168#ifdef IPv6
    162169    memset(&hints, 0, sizeof(hints));
    163170    hints.ai_family = (sdom == PF_INET) ? AF_INET : AF_INET6;
    164171    hints.ai_socktype = stype;
     
    185192    memcpy(&fwspec->dst, ai->ai_addr, ai->ai_addrlen);
    186193    freeaddrinfo(ai);
    187194    ai = NULL;
     195#else
     196    struct hostent *he = gethostbyname(src_addr_str);
     197
     198    if (he == NULL) {
     199        LogRel(("\"%s\": %s\n", src_addr_str, hstrerror(h_errno)));
     200        return -1;
     201    }
     202    LWIP_ASSERT1(he != NULL);
     203    LWIP_ASSERT1(he->h_length <= sizeof(fwspec->src));
     204    memcpy(&fwspec->src, he->h_addr_list, he->h_length);
     205    free(he);
     206    he = NULL;
     207#endif
    188208
    189209    if (sdom == PF_INET) {
    190210        fwspec->src.sin.sin_port = htons(src_port);
    191211        fwspec->dst.sin.sin_port = htons(dst_port);
    192212    }
     213#ifdef IPv6
    193214    else { /* PF_INET6 */
    194215        fwspec->src.sin6.sin6_port = htons(src_port);
    195216        fwspec->dst.sin6.sin6_port = htons(dst_port);
    196217    }
     218#endif
    197219
    198220    return 0;
    199221}
     
    215237            && a->src.sin.sin_addr.s_addr == b->src.sin.sin_addr.s_addr
    216238            && a->dst.sin.sin_addr.s_addr == b->dst.sin.sin_addr.s_addr;
    217239    }
     240#ifdef IPv6
    218241    else { /* PF_INET6 */
    219242        return a->src.sin6.sin6_port == b->src.sin6.sin6_port
    220243            && a->dst.sin6.sin6_port == b->dst.sin6.sin6_port
    221244            && IN6_ARE_ADDR_EQUAL(&a->src.sin6.sin6_addr, &b->src.sin6.sin6_addr)
    222245            && IN6_ARE_ADDR_EQUAL(&a->dst.sin6.sin6_addr, &b->dst.sin6.sin6_addr);
    223246    }
     247#endif
    224248}
    225249
    226250
     
    247271        peerip4.addr = peer4->sin_addr.s_addr;
    248272        mapping = pxremap_inbound_ip4(&fwdsrc->ip4, &peerip4);
    249273    }
     274#ifdef IPv6
    250275    else if (peer->sa_family == AF_INET6) {
    251276        const struct sockaddr_in6 *peer6 = (const struct sockaddr_in6 *)peer;
    252277        ip6_addr_t peerip6;
     
    254279        memcpy(&peerip6, &peer6->sin6_addr, sizeof(ip6_addr_t));
    255280        mapping = pxremap_inbound_ip6(&fwdsrc->ip6, &peerip6);
    256281    }
     282#endif
    257283    else {
    258284        mapping = PXREMAP_FAILED;
    259285    }
  • \src\VBox\NetworkServices/NAT/portfwd.h

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/portfwd.h vbox-trunk\src\VBox\NetworkServices/NAT/portfwd.h
    old new  
    3535    union {
    3636        struct sockaddr sa;
    3737        struct sockaddr_in sin;   /* sdom == PF_INET  */
     38#ifdef IPv6
    3839        struct sockaddr_in6 sin6; /* sdom == PF_INET6 */
     40#endif
    3941    } src;
    4042
    4143    /* forward to */
    4244    union {
    4345        struct sockaddr sa;
    4446        struct sockaddr_in sin;   /* sdom == PF_INET  */
     47#ifdef IPv6
    4548        struct sockaddr_in6 sin6; /* sdom == PF_INET6 */
     49#endif
    4650    } dst;
    4751};
    4852
  • \src\VBox\NetworkServices/NAT/proxy_pollmgr.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/proxy_pollmgr.c vbox-trunk\src\VBox\NetworkServices/NAT/proxy_pollmgr.c
    old new  
    2828#include <err.h>
    2929#include <errno.h>
    3030#include <poll.h>
     31#ifdef RT_OS_OS2
     32typedef unsigned long nfds_t;
     33#endif
    3134#include <stdio.h>
    3235#include <stdlib.h>
    3336#include <string.h>
  • \src\VBox\NetworkServices/NAT/proxy.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/proxy.c vbox-trunk\src\VBox\NetworkServices/NAT/proxy.c
    old new  
    3030
    3131#ifndef RT_OS_WINDOWS
    3232#include <sys/poll.h>
     33#ifdef RT_OS_OS2
     34typedef unsigned long socklen_t;
     35#endif
    3336#include <sys/socket.h>
    3437#include <netinet/in.h>
    3538#include <arpa/inet.h>
     
    407410proxy_connected_socket(int sdom, int stype,
    408411                       ipX_addr_t *dst_addr, u16_t dst_port)
    409412{
     413#ifdef IPv6
    410414    struct sockaddr_in6 dst_sin6;
     415#endif
    411416    struct sockaddr_in dst_sin;
    412417    struct sockaddr *pdst_sa;
    413418    socklen_t dst_sa_len;
     
    422427    LWIP_ASSERT1(stype == SOCK_STREAM || stype == SOCK_DGRAM);
    423428
    424429    DPRINTF(("---> %s ", stype == SOCK_STREAM ? "TCP" : "UDP"));
     430#ifdef IPv6
    425431    if (sdom == PF_INET6) {
    426432        pdst_sa = (struct sockaddr *)&dst_sin6;
    427433        pdst_addr = (void *)&dst_sin6.sin6_addr;
     
    438444        DPRINTF(("[%RTnaipv6]:%d ", &dst_sin6.sin6_addr, dst_port));
    439445    }
    440446    else { /* sdom = PF_INET */
     447#else
     448    {
     449#endif
    441450        pdst_sa = (struct sockaddr *)&dst_sin;
    442451        pdst_addr = (void *)&dst_sin.sin_addr;
    443452
     
    460469    DPRINTF(("socket %d\n", s));
    461470
    462471    /* TODO: needs locking if dynamic modifyvm is allowed */
     472#ifdef IPv6
    463473    if (sdom == PF_INET6) {
    464474        psrc_sa = (const struct sockaddr *)g_proxy_options->src6;
    465475        src_sa_len = sizeof(struct sockaddr_in6);
    466476    }
    467477    else {
     478#else
     479    {
     480#endif
    468481        psrc_sa = (const struct sockaddr *)g_proxy_options->src4;
    469482        src_sa_len = sizeof(struct sockaddr_in);
    470483    }
     
    532545    }
    533546
    534547    status = bind(s, src_addr,
     548#ifdef IPv6
    535549                  sdom == PF_INET ?
    536550                    sizeof(struct sockaddr_in)
    537551                  : sizeof(struct sockaddr_in6));
     552#else
     553    sizeof(struct sockaddr_in));
     554#endif
    538555    if (status == SOCKET_ERROR) {
    539556        sockerr = SOCKERRNO();
    540557        DPRINTF(("bind: %R[sockerr]\n", sockerr));
  • \src\VBox\NetworkServices/NAT/pxdns.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/pxdns.c vbox-trunk\src\VBox\NetworkServices/NAT/pxdns.c
    old new  
    4949
    5050#ifndef RT_OS_WINDOWS
    5151#include <sys/poll.h>
     52#ifdef RT_OS_OS2
     53typedef unsigned long socklen_t;
     54#endif
    5255#include <sys/socket.h>
    5356#include <netinet/in.h>
    5457#include <netdb.h>
     
    6366union sockaddr_inet {
    6467    struct sockaddr sa;
    6568    struct sockaddr_in sin;
     69#ifdef IPv6
    6670    struct sockaddr_in6 sin6;
     71#endif
    6772};
    6873
    6974
     
    312317static void
    313318pxdns_create_resolver_sockaddrs(struct pxdns *pxdns, const char **nameservers)
    314319{
     320#ifdef IPv6
    315321    struct addrinfo hints;
     322#endif
    316323    union sockaddr_inet *resolvers;
    317324    size_t nnames, nresolvers;
    318325    const char **p;
     
    340347        goto update_resolvers;
    341348    }
    342349
     350#ifdef IPv6
    343351    memset(&hints, 0, sizeof(hints));
    344352    hints.ai_family = AF_UNSPEC;
    345353    hints.ai_socktype = SOCK_DGRAM;
     
    377385        ++nresolvers;
    378386    }
    379387
     388#else
     389    for (p = nameservers; *p; ++p) {
     390        const char *name = *p;
     391        struct hostent *he = gethostbyname(name);
     392
     393        if (he == NULL) {
     394            /* failed resolution */
     395            continue;
     396        }
     397
     398        if (he->h_addrtype != AF_INET) {
     399            /* not AF_INET addr type */
     400            free(he);
     401            continue;
     402        }
     403
     404        if (he->h_length > sizeof(struct sockaddr_in)) {
     405            /* IPv6 or other non-IPv4 addr length */
     406            free(he);
     407            continue;
     408        }
     409
     410        memcpy(&resolvers[nresolvers], he->h_addr_list, he->h_length);
     411        free(he);
     412        ++nresolvers;
     413    }
     414#endif
    380415    if (nresolvers == 0) {
    381416        if (resolvers != NULL) {
    382417            free(resolvers);
     
    698733                       &resolver->sa, sizeof(resolver->sin));
    699734
    700735    }
     736#ifdef IPv6
    701737    else if (resolver->sa.sa_family == AF_INET6) {
    702738        if (pxdns->sock6 != INVALID_SOCKET) {
    703739            nsent = sendto(pxdns->sock6, req->data, req->size, 0,
     
    708744            return 0;
    709745        }
    710746    }
     747#endif
    711748    else {
    712749        /* shouldn't happen, we should have weeded out unsupported families */
    713750        return 0;
     
    782819        int status;
    783820
    784821        status = getsockopt(fd, SOL_SOCKET,
    785                             SO_ERROR, (char *)&sockerr, &optlen);
     822                            SO_ERROR, (char *)&sockerr, (int *)&optlen);
    786823        if (status < 0) {
    787824            DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n",
    788825                     __func__, fd, SOCKERRNO()));
  • \src\VBox\NetworkServices/NAT/pxping.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/pxping.c vbox-trunk\src\VBox\NetworkServices/NAT/pxping.c
    old new  
    3232#endif
    3333#include <netinet/in.h>
    3434#include <poll.h>
     35#ifdef RT_OS_OS2
     36typedef unsigned long socklen_t;
     37#endif
    3538#include <stdint.h>
    3639#include <stdio.h>
    3740#include <stdlib.h>
     
    8588struct pxping {
    8689    SOCKET sock4;
    8790
    88 #if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS)
     91#if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS) || defined(RT_OS_OS2)
    8992#   define DF_WITH_IP_HDRINCL
    9093    int hdrincl;
    9194#else
     
    159162
    160163    union {
    161164        struct sockaddr_in sin;
     165#ifdef IPv6
    162166        struct sockaddr_in6 sin6;
     167#endif
    163168    } peer;
    164169};
    165170
     
    197202static int pxping_init_windows(struct pxping *pxping);
    198203#endif
    199204static void pxping_recv4(void *arg, struct pbuf *p);
     205#ifdef IPv6
    200206static void pxping_recv6(void *arg, struct pbuf *p);
     207#endif
    201208
    202209static void pxping_timer(void *arg);
    203210static void pxping_timer_needed(struct pxping *pxping);
     
    224231                                   u16_t iplen, struct sockaddr_in *peer);
    225232static void pxping_pmgr_icmp4_error(struct pxping *pxping,
    226233                                    u16_t iplen, struct sockaddr_in *peer);
     234#ifdef IPv6
    227235static void pxping_pmgr_icmp6(struct pxping *pxping);
    228236static void pxping_pmgr_icmp6_echo(struct pxping *pxping,
    229237                                   ip6_addr_t *src, ip6_addr_t *dst,
     
    232240                                    ip6_addr_t *src, ip6_addr_t *dst,
    233241                                    int hopl, int tclass, u16_t icmplen);
    234242
     243#endif
    235244static void pxping_pmgr_forward_inbound(struct pxping *pxping, u16_t iplen);
    236245static void pxping_pcb_forward_inbound(void *arg);
    237246
     247#ifdef IPv6
    238248static void pxping_pmgr_forward_inbound6(struct pxping *pxping,
    239249                                         ip6_addr_t *src, ip6_addr_t *dst,
    240250                                         u8_t hopl, u8_t tclass,
    241251                                         u16_t icmplen);
    242252static void pxping_pcb_forward_inbound6(void *arg);
    243253
     254#endif
    244255/*
    245256 * NB: This is not documented except in RTFS.
    246257 *
     
    300311        ping_proxy_accept(pxping_recv4, &g_pxping);
    301312    }
    302313
     314#ifdef IPv6
    303315    g_pxping.sock6 = sock6;
    304316#ifdef RT_OS_WINDOWS
    305317    /* we need recvmsg */
     
    344356
    345357        ping6_proxy_accept(pxping_recv6, &g_pxping);
    346358    }
     359#endif
    347360
    348361    status = RTStrFormatTypeRegister("ping_pcb", pxping_pcb_rtstrfmt, NULL);
    349362    AssertRC(status);
     
    663676}
    664677
    665678
     679#ifdef IPv6
    666680/**
    667681 * ICMPv6 Echo Request in pbuf "p" is to be proxied.
    668682 */
     
    768782    pbuf_free(p);
    769783}
    770784
     785#endif
    771786
    772787/**
    773788 * Formatter for %R[ping_pcb].
     
    792807        return RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, "(null)");
    793808    }
    794809
     810#ifdef IPv6
    795811    /* XXX: %RTnaipv4 takes the value, but %RTnaipv6 takes the pointer */
    796812    if (pcb->is_ipv6) {
    797813        cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
     
    802818        }
    803819    }
    804820    else {
     821#else
     822    {
     823#endif
    805824        cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
    806825                          "%RTnaipv4 -> %RTnaipv4",
    807826                          ip4_addr_get_u32(ipX_2_ip(&pcb->src)),
     
    949968        pcb->pprev_timeout = NULL;
    950969        pcb->next_timeout = NULL;
    951970
     971#ifdef IPv6
    952972        if (is_ipv6) {
    953973            pcb->peer.sin6.sin6_family = AF_INET6;
    954974#if HAVE_SA_LEN
     
    960980                                          ipX_2_ip6(&pcb->dst));
    961981        }
    962982        else {
     983#else
     984    {
     985#endif
    963986            pcb->peer.sin.sin_family = AF_INET;
    964987#if HAVE_SA_LEN
    965988            pcb->peer.sin.sin_len = sizeof(pcb->peer.sin);
     
    11001123        int status;
    11011124
    11021125        status = getsockopt(fd, SOL_SOCKET,
    1103                             SO_ERROR, (char *)&sockerr, &optlen);
     1126                            SO_ERROR, (char *)&sockerr, (int *)&optlen);
    11041127        if (status < 0) {
    11051128            DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n",
    11061129                     __func__, fd, SOCKERRNO()));
     
    11181141    if (fd == pxping->sock4) {
    11191142        pxping_pmgr_icmp4(pxping);
    11201143    }
     1144#ifdef IPv6
    11211145    else /* fd == pxping->sock6 */ {
    11221146        pxping_pmgr_icmp6(pxping);
    11231147    }
    11241148
     1149#endif
    11251150    return POLLIN;
    11261151}
    11271152
     
    14931518}
    14941519
    14951520
     1521#ifdef IPv6
    14961522/**
    14971523 * Process incoming ICMPv6 message for the host.
    14981524 * NB: we will get a lot of spam here and have to sift through it.
     
    18581884                                 hopl, tclass, icmplen);
    18591885}
    18601886
     1887#endif
    18611888
    18621889/**
    18631890 * Hand off ICMP datagram to the lwip thread where it will be
     
    19271954}
    19281955
    19291956
     1957#ifdef IPv6
    19301958static void
    19311959pxping_pmgr_forward_inbound6(struct pxping *pxping,
    19321960                             ip6_addr_t *src, ip6_addr_t *dst,
     
    19952023    pbuf_free(msg->p);
    19962024    free(msg);
    19972025}
     2026#endif
  • \src\VBox\NetworkServices/NAT/pxtcp.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/pxtcp.c vbox-trunk\src\VBox\NetworkServices/NAT/pxtcp.c
    old new  
    3838#include <stdio.h>
    3939#include <string.h>
    4040#include <poll.h>
     41#ifdef RT_OS_OS2
     42# define SHUT_RD SO_RCV_SHUTDOWN
     43# define SHUT_WR SO_SND_SHUTDOWN
     44# define SHUT_RDWR (SO_RCV_SHUTDOWN | SO_SND_SHUTDOWN)
     45typedef unsigned long nfds_t;
     46typedef unsigned long socklen_t;
     47#endif
    4148
    4249#include <err.h>                /* BSD'ism */
    4350#else
     
    11331140        SOCKET s;
    11341141
    11351142        status = getsockopt(pxtcp->sock, SOL_SOCKET, SO_ERROR,
    1136                             (char *)&pxtcp->sockerr, &optlen);
     1143                            (char *)&pxtcp->sockerr, (int *)&optlen);
    11371144        if (RT_UNLIKELY(status == SOCKET_ERROR)) { /* should not happen */
    11381145            DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n",
    11391146                     __func__, fd, SOCKERRNO()));
     
    12451252void
    12461253pxtcp_pcb_connect(struct pxtcp *pxtcp, const struct fwspec *fwspec)
    12471254{
     1255#ifdef IPv6
    12481256    struct sockaddr_storage ss;
     1257#else
     1258    struct sockaddr_in ss;
     1259#endif
    12491260    socklen_t sslen;
    1250     struct tcp_pcb *pcb;
     1261    struct tcp_pcb *pcb = NULL;
    12511262    ipX_addr_t src_addr, dst_addr;
    12521263    u16_t src_port, dst_port;
    12531264    int status;
     
    12661277    pxtcp_pcb_associate(pxtcp, pcb);
    12671278
    12681279    sslen = sizeof(ss);
    1269     status = getpeername(pxtcp->sock, (struct sockaddr *)&ss, &sslen);
     1280    status = getpeername(pxtcp->sock, (struct sockaddr *)&ss, (int *)&sslen);
    12701281    if (status  == SOCKET_ERROR) {
    12711282        goto reset;
    12721283    }
     
    12791290        goto reset;
    12801291    }
    12811292
     1293#ifdef IPv6
    12821294    if (ss.ss_family == PF_INET) {
     1295#else
     1296    if (ss.sin_family == PF_INET) {
     1297#endif
    12831298        const struct sockaddr_in *peer4 = (const struct sockaddr_in *)&ss;
    12841299
    12851300        src_port = peer4->sin_port;
     
    12871302        memcpy(&dst_addr.ip4, &fwspec->dst.sin.sin_addr, sizeof(ip_addr_t));
    12881303        dst_port = fwspec->dst.sin.sin_port;
    12891304    }
     1305#ifdef IPv6
    12901306    else { /* PF_INET6 */
    12911307        const struct sockaddr_in6 *peer6 = (const struct sockaddr_in6 *)&ss;
    12921308        ip_set_v6(pcb, 1);
     
    12971313        dst_port = fwspec->dst.sin6.sin6_port;
    12981314    }
    12991315
     1316#endif
    13001317    /* lwip port arguments are in host order */
    13011318    src_port = ntohs(src_port);
    13021319    dst_port = ntohs(dst_port);
     
    16871704        socklen_t optlen = (socklen_t)sizeof(sockerr);
    16881705
    16891706        status = getsockopt(pxtcp->sock, SOL_SOCKET, SO_ERROR,
    1690                             (char *)&sockerr, &optlen);
     1707                            (char *)&sockerr, (int *)&optlen);
    16911708        if (status == SOCKET_ERROR) { /* should not happen */
    16921709            DPRINTF(("sock %d: SO_ERROR failed: %R[sockerr]\n",
    16931710                     fd, SOCKERRNO()));
  • \src\VBox\NetworkServices/NAT/pxudp.c

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/pxudp.c vbox-trunk\src\VBox\NetworkServices/NAT/pxudp.c
    old new  
    3333#include <stdint.h>
    3434#include <stdio.h>
    3535#include <poll.h>
     36#ifdef RT_OS_OS2
     37typedef unsigned long socklen_t;
     38#endif
    3639
    3740#include <err.h>                /* BSD'ism */
    3841#else
     
    657660            }
    658661        }
    659662    }
     663#ifdef IPv6
    660664    else { /* IPv6 */
    661665        const struct ip6_hdr *iph = ip6_current_header();
    662666        int ttl;
     
    679683        }
    680684    }
    681685
     686#endif
    682687    if (pxudp->pcb->local_port == 53) {
    683688        ++pxudp->count;
    684689    }
     
    743748        int status;
    744749
    745750        status = getsockopt(pxudp->sock, SOL_SOCKET,
    746                             SO_ERROR, (char *)&sockerr, &optlen);
     751                            SO_ERROR, (char *)&sockerr, (int *)&optlen);
    747752        if (status < 0) {
    748753            DPRINTF(("%s: sock %d: SO_ERROR failed:%R[sockerr]\n",
    749754                     __func__, pxudp->sock, SOCKERRNO()));
  • \src\VBox\NetworkServices/NAT/VBoxNetLwipNAT.cpp

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NAT/VBoxNetLwipNAT.cpp vbox-trunk\src\VBox\NetworkServices/NAT/VBoxNetLwipNAT.cpp
    old new  
    6868# ifdef RT_OS_LINUX
    6969#  include <linux/icmp.h>       /* ICMP_FILTER */
    7070# endif
     71# ifdef IPv6
    7172# include <netinet/icmp6.h>
     73# endif
    7274#endif
    7375
    7476#include <map>
     
    153155   private:
    154156    struct proxy_options m_ProxyOptions;
    155157    struct sockaddr_in m_src4;
     158#ifdef IPv6
    156159    struct sockaddr_in6 m_src6;
     160#endif
    157161    /**
    158162     * place for registered local interfaces.
    159163     */
     
    646650    m_ProxyOptions.icmpsock6 = icmpsock6;
    647651    m_ProxyOptions.tftp_root = NULL;
    648652    m_ProxyOptions.src4 = NULL;
    649     m_ProxyOptions.src6 = NULL;
    650653    RT_ZERO(m_src4);
    651     RT_ZERO(m_src6);
    652654    m_src4.sin_family = AF_INET;
     655#ifdef IPv6
     656    m_ProxyOptions.src6 = NULL;
     657    RT_ZERO(m_src6);
    653658    m_src6.sin6_family = AF_INET6;
     659#endif
    654660#if HAVE_SA_LEN
    655661    m_src4.sin_len = sizeof(m_src4);
     662#ifdef IPv6
    656663    m_src6.sin6_len = sizeof(m_src6);
    657664#endif
     665#endif
    658666    m_ProxyOptions.nameservers = NULL;
    659667
    660668    m_LwipNetIf.name[0] = 'N';
     
    10851093
    10861094    SOCKET icmpsock4 = INVALID_SOCKET;
    10871095    SOCKET icmpsock6 = INVALID_SOCKET;
    1088 #ifndef RT_OS_DARWIN
     1096#if !defined(RT_OS_DARWIN) && !defined(RT_OS_OS2)
    10891097    const int icmpstype = SOCK_RAW;
    10901098#else
    10911099    /* on OS X it's not privileged */
     
    11211129#endif
    11221130    }
    11231131
     1132#ifdef IPv6
    11241133    icmpsock6 = socket(AF_INET6, icmpstype, IPPROTO_ICMPV6);
    11251134    if (icmpsock6 == INVALID_SOCKET)
    11261135    {
     
    11551164        }
    11561165#endif
    11571166    }
     1167#endif
    11581168
    11591169    HRESULT hrc = com::Initialize();
    11601170    if (FAILED(hrc))
     
    12911301{
    12921302    HRESULT hrc;
    12931303    com::SafeArray<BSTR> rules;
     1304#ifdef IPv6
    12941305    if (fIsIPv6)
    12951306        hrc = nat->COMGETTER(PortForwardRules6)(ComSafeArrayAsOutParam(rules));
    12961307    else
     1308#endif
    12971309        hrc = nat->COMGETTER(PortForwardRules4)(ComSafeArrayAsOutParam(rules));
    12981310    AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
    12991311
  • \src\VBox\NetworkServices/NetLib/VBoxPortForwardString.h

    diff -urN vbox-trunk-bk\src\VBox\NetworkServices/NetLib/VBoxPortForwardString.h vbox-trunk\src\VBox\NetworkServices/NetLib/VBoxPortForwardString.h
    old new  
    2323
    2424RT_C_DECLS_BEGIN
    2525
     26#ifdef RT_OS_OS2
     27#include <netinet/in.h>
     28#define INET6_ADDRSTRLEN 65
     29#endif
     30
    2631#define PF_NAMELEN 64
    2732/*
    2833 * TBD: Here is shared implementation of parsing port-forward string