VirtualBox

Changeset 21004 in vbox


Ignore:
Timestamp:
Jun 27, 2009 5:14:39 AM (15 years ago)
Author:
vboxsync
Message:

NAT: binding sockets to interface (default sockets and port-forwarding)

Location:
trunk/src/VBox/Devices/Network
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r20959 r21004  
    642642         * Validate the port forwarding config.
    643643         */
    644         if (!CFGMR3AreValuesValid(pNode, "Protocol\0UDP\0HostPort\0GuestPort\0GuestIP\0"))
     644        if (!CFGMR3AreValuesValid(pNode, "Protocol\0UDP\0HostPort\0GuestPort\0GuestIP\0BindIP\0"))
    645645            return PDMDRV_SET_ERROR(pThis->pDrvIns, VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES, N_("Unknown configuration in port forwarding"));
    646646
     
    669669            return PDMDrvHlpVMSetError(pThis->pDrvIns, rc, RT_SRC_POS, N_("NAT#%d: configuration query for \"Protocol\" string failed"), iInstance);
    670670
     671#define DOGETIP(rc, status, x)                                                                                                                      \
     672do {                                                                                                                                                \
     673        char    sz##x[32];                                                                                                                          \
     674        rc = CFGMR3QueryString(pNode, #x, &sz ## x[0], sizeof(sz ## x));                                                                            \
     675        if (rc == VERR_CFGM_VALUE_NOT_FOUND)                                                                                                        \
     676            RTStrPrintf(sz ## x, sizeof(sz ## x), "%d.%d.%d.%d",                                                                                    \
     677                        (Network & 0xFF000000) >> 24, (Network & 0xFF0000) >> 16, (Network & 0xFF00) >> 8, (Network & 0xE0) | 15);                  \
     678        else if (RT_FAILURE(rc))                                                                                                                    \
     679            return PDMDrvHlpVMSetError(pThis->pDrvIns, rc, RT_SRC_POS, N_("NAT#%d: configuration query for \"" #x "\" string failed"), iInstance);  \
     680        status = inet_aton(sz ## x, &x);                                                                                                            \
     681}while(0)
     682
     683#define GETIP(x)                                                                                                                                \
     684do                                                                                                                                              \
     685{                                                                                                                                               \
     686    int status = 0;                                                                                                                             \
     687    DOGETIP(rc, status, x);                                                                                                                     \
     688    if (status == 0)                                                                                                                            \
     689        return PDMDrvHlpVMSetError(pThis->pDrvIns, VERR_NAT_REDIR_GUEST_IP, RT_SRC_POS,                                                         \
     690                                   N_("NAT#%d: configuration error: invalid \"" #x "\" inet_aton failed"), iInstance);                          \
     691}while(0)
     692
     693#define GETIP_DEF(x, def)                                                                                                                       \
     694do                                                                                                                                              \
     695{                                                                                                                                               \
     696    int status = 0;                                                                                                                             \
     697    DOGETIP(rc, status, x);                                                                                                                     \
     698    if (status == 0 || rc == VERR_CFGM_VALUE_NOT_FOUND)                                                                                         \
     699        x.s_addr = def;                                                                                                                         \
     700}while(0)
    671701        /* host port */
    672702        int32_t iHostPort;
     
    682712
    683713        /* guest address */
    684         char    szGuestIP[32];
    685         rc = CFGMR3QueryString(pNode, "GuestIP", &szGuestIP[0], sizeof(szGuestIP));
    686         if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    687             RTStrPrintf(szGuestIP, sizeof(szGuestIP), "%d.%d.%d.%d",
    688                         (Network & 0xFF000000) >> 24, (Network & 0xFF0000) >> 16, (Network & 0xFF00) >> 8, (Network & 0xE0) | 15);
    689         else if (RT_FAILURE(rc))
    690             return PDMDrvHlpVMSetError(pThis->pDrvIns, rc, RT_SRC_POS, N_("NAT#%d: configuration query for \"GuestIP\" string failed"), iInstance);
    691714        struct in_addr GuestIP;
    692         if (!inet_aton(szGuestIP, &GuestIP))
    693             return PDMDrvHlpVMSetError(pThis->pDrvIns, VERR_NAT_REDIR_GUEST_IP, RT_SRC_POS,
    694                                        N_("NAT#%d: configuration error: invalid \"GuestIP\"=\"%s\", inet_aton failed"), iInstance, szGuestIP);
     715        GETIP(GuestIP);
    695716
    696717        /*
    697718         * Call slirp about it.
    698719         */
    699         Log(("drvNATConstruct: Redir %d -> %s:%d\n", iHostPort, szGuestIP, iGuestPort));
    700         if (slirp_redir(pThis->pNATState, fUDP, iHostPort, GuestIP, iGuestPort) < 0)
     720        struct in_addr BindIP;
     721        GETIP_DEF(BindIP, INADDR_ANY);
     722        if (slirp_redir(pThis->pNATState, fUDP, BindIP, iHostPort, GuestIP, iGuestPort) < 0)
    701723            return PDMDrvHlpVMSetError(pThis->pDrvIns, VERR_NAT_REDIR_SETUP, RT_SRC_POS,
    702                                        N_("NAT#%d: configuration error: failed to set up redirection of %d to %s:%d. Probably a conflict with existing services or other rules"), iInstance, iHostPort, szGuestIP, iGuestPort);
     724                                       N_("NAT#%d: configuration error: failed to set up redirection of %d to %d. Probably a conflict with existing services or other rules"), iInstance, iHostPort, iGuestPort);
     725#undef GETIP   
    703726    } /* for each redir rule */
    704727
     
    751774     * Validate the config.
    752775     */
    753     if (!CFGMR3AreValuesValid(pCfgHandle, "PassDomain\0TFTPPrefix\0BootFile\0Network\0NextServer\0DNSProxy\0"
     776    if (!CFGMR3AreValuesValid(pCfgHandle, "PassDomain\0TFTPPrefix\0BootFile\0Network"
     777        "\0NextServer\0DNSProxy\0BindIP\0"
    754778        "SocketRcvBuf\0SocketSndBuf\0TcpRcvSpace\0TcpSndSpace\0"))
    755779        return PDMDRV_SET_ERROR(pDrvIns, VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES,
     
    833857        slirp_set_dhcp_next_server(pThis->pNATState, pThis->pszNextServer);
    834858        slirp_set_dhcp_dns_proxy(pThis->pNATState, !!fDNSProxy);
    835 #define SLIRP_SET_TUNING_VALUE(name, setter)            \
     859        char *pszBindIP = NULL;
     860        rc = CFGMR3QueryStringAlloc(pCfgHandle, "BindIP", &pszBindIP);
     861        if (RT_FAILURE(rc) && rc != VERR_CFGM_VALUE_NOT_FOUND)
     862            return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NAT#%d: configuration query for \"BindIP\" string failed"), pDrvIns->iInstance);
     863        rc = slirp_set_binding_address(pThis->pNATState, pszBindIP);
     864        if (rc != 0)
     865            LogRel(("NAT: value of BindIP has been ignored\n"));
     866
     867        if(pszBindIP != NULL)
     868            MMR3HeapFree(pszBindIP);
     869#define SLIRP_SET_TUNING_VALUE(name, setter)                    \
    836870            do                                                  \
    837871            {                                                   \
  • trunk/src/VBox/Devices/Network/slirp/libslirp.h

    r20959 r21004  
    5656void slirp_post_sent(PNATState pData, void *pvArg);
    5757
    58 int slirp_redir(PNATState pData, int is_udp, int host_port,
    59                 struct in_addr guest_addr, int guest_port);
     58int slirp_redir(PNATState pData, int is_udp, struct in_addr host_addr,
     59                int host_port, struct in_addr guest_addr,
     60                int guest_port);
    6061int slirp_add_exec(PNATState pData, int do_pty, const char *args, int addr_low_byte,
    6162                   int guest_port);
     
    6970void slirp_set_tcp_rcvspace(PNATState pData, int kilobytes);
    7071void slirp_set_tcp_sndspace(PNATState pData, int kilobytes);
     72
     73int slirp_set_binding_address(PNATState, char *addr);
    7174
    7275#if defined(RT_OS_WINDOWS)
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r20961 r21004  
    15261526}
    15271527
    1528 int slirp_redir(PNATState pData, int is_udp, int host_port,
     1528int slirp_redir(PNATState pData, int is_udp, struct in_addr host_addr, int host_port,
    15291529                struct in_addr guest_addr, int guest_port)
    15301530{
     
    15431543    if (is_udp)
    15441544    {
    1545         so = udp_listen(pData, htons(host_port), guest_addr.s_addr,
     1545        so = udp_listen(pData, host_addr.s_addr, htons(host_port), guest_addr.s_addr,
    15461546                        htons(guest_port), 0);
    15471547    }
    15481548    else
    15491549    {
    1550         so = solisten(pData, htons(host_port), guest_addr.s_addr,
     1550        so = solisten(pData, host_addr.s_addr, htons(host_port), guest_addr.s_addr,
    15511551                      htons(guest_port), 0);
     1552    }
     1553    if (so == NULL)
     1554    {   
     1555        return -1;
    15521556    }
    15531557#ifndef VBOX_WITH_SLIRP_ALIAS
     
    17051709    else
    17061710        inet_aton(next_server, &pData->tftp_server);
     1711}
     1712
     1713int slirp_set_binding_address(PNATState pData, char *addr)
     1714{
     1715    if (addr == NULL || (inet_aton(addr, &pData->bindIP) == 0))
     1716    {
     1717        pData->bindIP.s_addr = INADDR_ANY;
     1718        return 1;
     1719    }
     1720    return 0;
    17071721}
    17081722
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r20959 r21004  
    135135    char slirp_hostname[33];
    136136    bool fPassDomain;
     137    struct in_addr bindIP;
    137138    /* Stuff from tcp_input.c */
    138139    struct socket tcb;
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r20959 r21004  
    730730 */
    731731struct socket *
    732 solisten(PNATState pData, u_int port, u_int32_t laddr, u_int lport, int flags)
     732solisten(PNATState pData, u_int32_t bind_addr, u_int port, u_int32_t laddr, u_int lport, int flags)
    733733{
    734734    struct sockaddr_in addr;
     
    775775
    776776    addr.sin_family = AF_INET;
    777     addr.sin_addr.s_addr = INADDR_ANY;
     777    addr.sin_addr.s_addr = bind_addr;
    778778    addr.sin_port = port;
    779779
  • trunk/src/VBox/Devices/Network/slirp/socket.h

    r20961 r21004  
    167167void sorecvfrom (PNATState, struct socket *);
    168168int sosendto (PNATState, struct socket *, struct mbuf *);
    169 struct socket * solisten (PNATState, u_int, u_int32_t, u_int, int);
     169struct socket * solisten (PNATState, u_int32_t, u_int, u_int32_t, u_int, int);
    170170void sorwakeup (struct socket *);
    171171void sowwakeup (struct socket *);
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r20959 r21004  
    382382        addr.sin_family = AF_INET;
    383383        addr.sin_port = service_port;
    384         addr.sin_addr.s_addr = INADDR_ANY;
     384        addr.sin_addr.s_addr = pData->bindIP.s_addr;
    385385        fd_nonblock(so->s);
    386386        if (bind(so->s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
     
    718718
    719719struct socket *
    720 udp_listen(PNATState pData, u_int port, u_int32_t laddr, u_int lport, int flags)
     720udp_listen(PNATState pData, u_int32_t bind_addr, u_int port, u_int32_t laddr, u_int lport, int flags)
    721721{
    722722    struct sockaddr_in addr;
     
    744744
    745745    addr.sin_family = AF_INET;
    746     addr.sin_addr.s_addr = INADDR_ANY;
     746    addr.sin_addr.s_addr = bind_addr;
    747747    addr.sin_port = port;
    748748
    749749    if (bind(so->s,(struct sockaddr *)&addr, addrlen) < 0)
    750750    {
     751        LogRel(("NAT: bind to %R[IP4] has been failed\n", &addr.sin_addr));
    751752        udp_detach(pData, so);
    752753        return NULL;
  • trunk/src/VBox/Devices/Network/slirp/udp.h

    r20306 r21004  
    109109u_int8_t udp_tos (struct socket *);
    110110void udp_emu (PNATState, struct socket *, struct mbuf *);
    111 struct socket * udp_listen (PNATState, u_int, u_int32_t, u_int, int);
     111struct socket * udp_listen (PNATState, u_int32_t, u_int, u_int32_t, u_int, int);
    112112int udp_output2(PNATState pData, struct socket *so, struct mbuf *m,
    113113                struct sockaddr_in *saddr, struct sockaddr_in *daddr,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette