VirtualBox

Changeset 107548 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jan 8, 2025 7:54:13 PM (4 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
166619
Message:

Devices/Network: Fixed and added configuration for packets broadcast to NAT adapter's network. Propagated additional parameters from CFGM. Simplified port forwarding a bit and added additional release logging. bugref:10268

File:
1 edited

Legend:

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

    r107225 r107548  
    9292#define DRVNAT_MAXFRAMESIZE (16 * 1024)
    9393#define DRVNAT_DEFAULT_TIMEOUT (3600*1000)
     94#define MAX_IP_ADDRESS_STR_LEN_W_NULL 16
    9495
    9596#define GET_EXTRADATA(pdrvins, node, name, rc, type, type_name, var)                                  \
     
    175176
    176177    SlirpTimer *pTimerHead;
     178    bool fPassDomain;
    177179} SlirpState;
    178180typedef SlirpState *pSlirpState;
     
    263265static DECLCALLBACK(int64_t) drvNAT_ClockGetNsCb(void *opaque);
    264266static DECLCALLBACK(int) drvNAT_GetREventsCb(int idx, void *opaque);
     267static DECLCALLBACK(int) drvNATNotifyApplyPortForwardCommand(PDRVNAT pThis, bool fRemove,
     268                                                              bool fUdp, const char *pHostIp,
     269                                                              uint16_t u16HostPort, const char *pGuestIp, uint16_t u16GuestPort);
    265270
    266271
     
    925930        GET_S32_STRICT(rc, pDrvIns, pNode, "GuestPort", iGuestPort);
    926931
     932        /** @todo r=jack: why are we using IP INADD_ANY for port forward when FE does not do so. */
    927933        /* host address ("BindIP" name is rather unfortunate given "HostPort" to go with it) */
    928         struct in_addr BindIP;
    929         RT_ZERO(BindIP);
    930         GETIP_DEF(rc, pDrvIns, pNode, BindIP, INADDR_ANY);
     934        char mHostIp[MAX_IP_ADDRESS_STR_LEN_W_NULL];
     935        RT_ZERO(mHostIp);
     936        // GETIP_DEF(rc, pDrvIns, pNode, mHostIp, INADDR_ANY);
     937        GET_STRING(rc, pDrvIns, pNode, "BindIP", mHostIp[0], sizeof(mHostIp));
    931938
    932939        /* guest address */
    933         struct in_addr GuestIP;
    934         RT_ZERO(GuestIP);
    935         GETIP_DEF(rc, pDrvIns, pNode, GuestIP, INADDR_ANY);
     940        char mGuestIp[MAX_IP_ADDRESS_STR_LEN_W_NULL];
     941        RT_ZERO(mGuestIp);
     942        // GETIP_DEF(rc, pDrvIns, pNode, mGuestIp, INADDR_ANY);
     943        GET_STRING(rc, pDrvIns, pNode, "GuestIP", mGuestIp[0], sizeof(mGuestIp));
     944
     945        LogRelMax(256, ("Preconfigured port forward rule discovered on startup: "
     946                        "fUdp=%d, pHostIp=%s, u16HostPort=%u, pGuestIp=%s, u16GuestPort=%u\n",
     947                        RT_BOOL(fUDP), mHostIp, iHostPort, mGuestIp, iGuestPort));
    936948
    937949        /*
    938          * Call slirp about it.
     950         * Apply port forward.
    939951         */
    940         if (slirp_add_hostfwd(pThis->pNATState->pSlirp, fUDP, BindIP,
    941                               iHostPort, GuestIP, iGuestPort) < 0)
     952        if (drvNATNotifyApplyPortForwardCommand(pThis, false /* fRemove */, fUDP,
     953                                                mHostIp, iHostPort, mGuestIp, iGuestPort) < 0)
    942954            return PDMDrvHlpVMSetError(pThis->pDrvIns, VERR_NAT_REDIR_SETUP, RT_SRC_POS,
    943955                                       N_("NAT#%d: configuration error: failed to set up "
     
    963975 * @thread  ?
    964976 */
    965 static DECLCALLBACK(void) drvNATNotifyApplyPortForwardCommand(PDRVNAT pThis, bool fRemove,
     977static DECLCALLBACK(int) drvNATNotifyApplyPortForwardCommand(PDRVNAT pThis, bool fRemove,
    966978                                                              bool fUdp, const char *pHostIp,
    967979                                                              uint16_t u16HostPort, const char *pGuestIp, uint16_t u16GuestPort)
     
    972984     */
    973985    struct in_addr guestIp, hostIp;
     986    int rc = VINF_SUCCESS;
    974987
    975988    if (   pHostIp == NULL
     
    982995
    983996    if (fRemove)
    984         slirp_remove_hostfwd(pThis->pNATState->pSlirp, fUdp, hostIp, u16HostPort);
     997        rc = slirp_remove_hostfwd(pThis->pNATState->pSlirp, fUdp, hostIp, u16HostPort);
    985998    else
    986         slirp_add_hostfwd(pThis->pNATState->pSlirp, fUdp, hostIp,
    987                           u16HostPort, guestIp, u16GuestPort);
     999        rc = slirp_add_hostfwd(pThis->pNATState->pSlirp, fUdp, hostIp,
     1000                               u16HostPort, guestIp, u16GuestPort);
     1001
     1002    if (rc < 0)
     1003    {
     1004        LogRelFunc(("Port forward modify FAIL! Details: fRemove=%d, fUdp=%d, pHostIp=%s, u16HostPort=%u, pGuestIp=%s, u16GuestPort=%u\n",
     1005                    RT_BOOL(fRemove), RT_BOOL(fUdp), pHostIp, u16HostPort, pGuestIp, u16GuestPort));
     1006
     1007        return PDMDrvHlpVMSetError(pThis->pDrvIns, VERR_NAT_REDIR_SETUP, RT_SRC_POS,
     1008                                   N_("NAT#%d: configuration error: failed to set up "
     1009                                   "redirection of %d to %d. Probably a conflict with "
     1010                                   "existing services or other rules"), pThis->pDrvIns->iInstance, u16HostPort, u16GuestPort);
     1011    }
     1012
     1013    return rc;
    9881014}
    9891015
     
    9951021                                                        const char *pGuestIp, uint16_t u16GuestPort)
    9961022{
    997     LogFlowFunc(("fRemove=%d, fUdp=%d, pHostIp=%s, u16HostPort=%u, pGuestIp=%s, u16GuestPort=%u\n",
    998                  RT_BOOL(fRemove), RT_BOOL(fUdp), pHostIp, u16HostPort, pGuestIp, u16GuestPort));
     1023    LogRelMax(256, ("New port forwarded added: "
     1024                    "fRemove=%d, fUdp=%d, pHostIp=%s, u16HostPort=%u, pGuestIp=%s, u16GuestPort=%u\n",
     1025                        RT_BOOL(fRemove), RT_BOOL(fUdp), pHostIp, u16HostPort, pGuestIp, u16GuestPort));
    9991026    PDRVNAT pThis = RT_FROM_MEMBER(pInterface, DRVNAT, INetworkNATCfg);
    10001027    /* Execute the command directly if the VM is not running. */
    10011028    int rc;
    10021029    if (pThis->pSlirpThread->enmState != PDMTHREADSTATE_RUNNING)
    1003     {
    1004         drvNATNotifyApplyPortForwardCommand(pThis, fRemove, fUdp, pHostIp,
     1030        rc = drvNATNotifyApplyPortForwardCommand(pThis, fRemove, fUdp, pHostIp,
    10051031                                           u16HostPort, pGuestIp,u16GuestPort);
    1006         rc = VINF_SUCCESS;
    1007     }
    10081032    else
    10091033    {
     
    10351059    AssertReturnVoid(pNATState);
    10361060    AssertReturnVoid(pNATState->pSlirp);
     1061
     1062    if (!pNATState->fPassDomain)
     1063        return;
    10371064
    10381065    LogRel(("NAT: DNS settings changed, triggering update\n"));
     
    15291556                                  "|LocalhostReachable"
    15301557                                  "|HostResolverMappings"
     1558                                  "|ForwardBroadcast"
    15311559                                  , "PortForwarding");
     1560
     1561    LogRel(("These CFGM parameters are currently not supported when using NAT:\n"
     1562        "DNSProxy\n"
     1563        "UseHostResolver\n"
     1564        "AliasMode\n",
     1565        "SockRcv\n"
     1566        "SockSnd\n"
     1567        "TcpRcv\n"
     1568        "TcpSnd\n"
     1569        "ICMPCacheLimit\n"
     1570        "HostResolverMappings\n"
     1571    ));
    15321572
    15331573    /*
     
    15351575     */
    15361576    int  rc;
     1577
    15371578    bool fPassDomain = true;
    15381579    GET_BOOL(rc, pDrvIns, pCfg, "PassDomain", fPassDomain);
     1580    pNATState->fPassDomain = fPassDomain;
     1581
     1582    bool fForwardBroadcast = false;
     1583    GET_BOOL(rc, pDrvIns, pCfg, "ForwardBroadcast", fForwardBroadcast);
    15391584
    15401585    GET_STRING_ALLOC(rc, pDrvIns, pCfg, "TFTPPrefix", pThis->pszTFTPPrefix);
     
    16441689    slirpCfg.vdnssearch = NULL;
    16451690    slirpCfg.vdomainname = NULL;
     1691    slirpCfg.disable_host_loopback = fLocalhostReachable;
     1692    slirpCfg.fForwardBroadcast = fForwardBroadcast;
     1693    slirpCfg.iSoMaxConn = i32SoMaxConn;
    16461694
    16471695    slirpCallbacks.send_packet = &drvNAT_SendPacketCb;
Note: See TracChangeset for help on using the changeset viewer.

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