VirtualBox

Changeset 107548 in vbox


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

Location:
trunk
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/settings.h

    r107508 r107548  
    881881    bool                    fAliasUseSamePorts;
    882882    bool                    fLocalhostReachable;
     883    bool                    fForwardBroadcast;
    883884    NATRulesMap             mapRules;
    884885};
  • 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;
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp

    r107435 r107548  
    146146    MODIFYVM_NATDNSHOSTRESOLVER,
    147147    MODIFYVM_NATLOCALHOSTREACHABLE,
     148    MODIFYVM_NATFORWARDBROADCAST,
    148149    MODIFYVM_MACADDRESS,
    149150    MODIFYVM_HIDPTR,
     
    381382    OPT2("--nat-dns-host-resolver",         "--natdnshostresolver",     MODIFYVM_NATDNSHOSTRESOLVER,        RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX),
    382383    OPT2("--nat-localhostreachable",        "--natlocalhostreachable",  MODIFYVM_NATLOCALHOSTREACHABLE,     RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX),
     384    OPT2("--nat-forward-broadcast",         "--natforwardbroadcast",    MODIFYVM_NATFORWARDBROADCAST,       RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX),
    383385    OPT2("--mac-address",                   "--macaddress",             MODIFYVM_MACADDRESS,                RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX),
    384386    OPT1("--mouse",                                                     MODIFYVM_HIDPTR,                    RTGETOPT_REQ_STRING),
     
    23882390            }
    23892391
     2392            case MODIFYVM_NATFORWARDBROADCAST:
     2393            {
     2394                if (!parseNum(GetOptState.uIndex, NetworkAdapterCount, "NIC"))
     2395                    break;
     2396
     2397                ComPtr<INetworkAdapter> nic;
     2398                CHECK_ERROR_BREAK(sessionMachine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
     2399                ASSERT(nic);
     2400
     2401                ComPtr<INATEngine> engine;
     2402                CHECK_ERROR(nic, COMGETTER(NATEngine)(engine.asOutParam()));
     2403
     2404                CHECK_ERROR(engine, COMSETTER(ForwardBroadcast)(ValueUnion.f));
     2405                break;
     2406            }
     2407
    23902408            case MODIFYVM_MACADDRESS:
    23912409            {
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r107524 r107548  
    2646126461    wsmap="managed"
    2646226462    rest="managed"
    26463     reservedMethods="4" reservedAttributes="8"
     26463    reservedMethods="4" reservedAttributes="7"
    2646426464    >
    2646526465    <desc>Interface for managing a NAT engine which is used with a virtual machine. This
     
    2651026510      <desc>Whether traffic from the guest directed to 10.0.2.2 will reach the
    2651126511        host's loopback interface, i.e. localhost or 127.0.0.1.</desc>
     26512    </attribute>
     26513    <attribute name="forwardBroadcast" type="boolean">
     26514      <desc>Forwards broadcast packets sent by the guest to the host machine as
     26515        such. IP address will show to host as 255.255.255.255.</desc>
    2651226516    </attribute>
    2651326517    <method name="setNetworkSettings">
  • trunk/src/VBox/Main/include/NATEngineImpl.h

    r106061 r107548  
    7575    HRESULT setLocalhostReachable(BOOL fLocalhostReachable);
    7676    HRESULT getLocalhostReachable(BOOL *pfLocalhostReachable);
     77    HRESULT setForwardBroadcast(BOOL fForwardBroadcast);
     78    HRESULT getForwardBroadcast(BOOL *pfForwardBroadcast);
    7779    /* TFTP properties */
    7880    HRESULT setTFTPPrefix(const com::Utf8Str &aTFTPPrefix);
  • trunk/src/VBox/Main/src-client/ConsoleImplConfigCommon.cpp

    r107448 r107548  
    23232323                hrc = natEngine->COMGETTER(LocalhostReachable)(&fLocalhostReachable);       H();
    23242324                InsertConfigInteger(pCfg, "LocalhostReachable", fLocalhostReachable);
     2325
     2326                /* forward broadcast packets */
     2327                BOOL fForwardBroadcast;
     2328                hrc = natEngine->COMGETTER(ForwardBroadcast)(&fForwardBroadcast);                   H();
     2329                InsertConfigInteger(pCfg, "ForwardBroadcast", fForwardBroadcast);
    23252330
    23262331                /* port-forwarding */
  • trunk/src/VBox/Main/src-server/NATEngineImpl.cpp

    r106061 r107548  
    199199
    200200    mData->m->fLocalhostReachable = false; /* Applies to new VMs only, see @bugref{9896} */
     201    mData->m->fForwardBroadcast = false;       /* Applies to new VMs only. see @bugref{10268} */
    201202}
    202203
     
    464465}
    465466
     467HRESULT NATEngine::setForwardBroadcast(BOOL fForwardBroadcast)
     468{
     469    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     470
     471    if (mData->m->fForwardBroadcast != RT_BOOL(fForwardBroadcast))
     472    {
     473        mData->m.backup();
     474        mData->m->fForwardBroadcast = RT_BOOL(fForwardBroadcast);
     475        mParent->i_setModified(Machine::IsModified_NetworkAdapters);
     476    }
     477    return S_OK;
     478}
     479
     480HRESULT NATEngine::getForwardBroadcast(BOOL *pfForwardBroadcast)
     481{
     482    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     483    *pfForwardBroadcast = mData->m->fForwardBroadcast;
     484    return S_OK;
     485}
     486
    466487HRESULT NATEngine::setTFTPPrefix(const com::Utf8Str &aTFTPPrefix)
    467488{
  • trunk/src/VBox/Main/xml/VirtualBox-settings.xsd

    r106065 r107548  
    11201120  <xsd:attribute name="tcpsnd" type="xsd:unsignedInt"/>
    11211121  <xsd:attribute name="localhost-reachable" type="xsd:boolean" default="true"/>
     1122  <xsd:attribute name="forward-broadcast" type="xsd:boolean" default="false" />
    11221123</xsd:complexType>
    11231124
  • trunk/src/libs/libslirp-4.8.0/include/glib.h

    r106935 r107548  
    3535
    3636#ifndef INCLUDED_glib_h
     37#define INCLUDED_glib_h
    3738#ifndef RT_WITHOUT_PRAGMA_ONCE
    3839# pragma once
  • trunk/src/libs/libslirp-4.8.0/src/libslirp.h

    r105726 r107548  
    210210     */
    211211    uint8_t oob_eth_addr[6];
     212#ifdef VBOX
     213    /*
     214     * Allow for network broadcasts to be sent out of internal NAT network.
     215     * When true, all devices on host's network would receive broadcasts if
     216     * host's network configuration allows.
     217     */
     218    bool fForwardBroadcast;
     219
     220    /*
     221     * Set a maximum number of pending socket connections to be passeed to
     222     * the backlog parameter of listen().
     223     */
     224    int iSoMaxConn;
     225#endif
    212226} SlirpConfig;
    213227
  • trunk/src/libs/libslirp-4.8.0/src/slirp.c

    r105726 r107548  
    699699    }
    700700
     701#ifdef VBOX
     702    slirp->fForwardBroadcast = cfg->fForwardBroadcast;
     703    slirp->iSoMaxConn = cfg->iSoMaxConn;
     704#endif
     705
    701706    ip6_post_init(slirp);
    702707    return slirp;
  • trunk/src/libs/libslirp-4.8.0/src/slirp.h

    r105533 r107548  
    218218    struct sockaddr_in6 *outbound_addr6;
    219219    bool disable_dns; /* slirp will not redirect/serve any DNS packet */
     220
     221#ifdef VBOX
     222    bool fForwardBroadcast;
     223    int iSoMaxConn;
     224#endif
    220225};
    221226
  • trunk/src/libs/libslirp-4.8.0/src/socket.c

    r105533 r107548  
    656656        DEBUG_MISC(" did recvfrom %d, errno = %d-%s", m->m_len, errno,
    657657                   strerror(errno));
    658         if (m->m_len < 0) {     
     658        if (m->m_len < 0) {
    659659            if (errno == ENOTCONN) {
    660660                /*
     
    868868        (slirp_socket_set_fast_reuse(s) < 0) ||
    869869        (bind(s, haddr, haddrlen) < 0) ||
     870#ifdef VBOX
     871        (listen(s, slirp->iSoMaxConn) < 0)) {
     872#else
    870873        (listen(s, 1) < 0)) {
     874#endif
    871875        int tmperrno = errno; /* Don't clobber the real reason we failed */
    872876        if (s >= 0) {
     
    973977
    974978    if (so->so_faddr.s_addr == s->vhost_addr.s_addr ||
    975         so->so_faddr.s_addr == 0xffffffff) {
     979#ifdef VBOX
     980        so->so_faddr.s_addr == 0xffffffff ||
     981        so->so_faddr.s_addr ==
     982            (s->vnetwork_addr.s_addr|~s->vnetwork_mask.s_addr)) {
     983#else
     984        so->so_faddr.s_addr == 0xffffffff {
     985#endif
     986
    976987        if (s->disable_host_loopback) {
    977988            return false;
    978989        }
    979990
    980         sin->sin_addr = loopback_addr;
     991#ifdef VBOX
     992        if (s->fForwardBroadcast)
     993            sin->sin_addr.s_addr = 0xffffffff;
     994        else
     995#endif
     996            sin->sin_addr = loopback_addr;
    981997    }
    982998
  • trunk/src/libs/libslirp-4.8.0/src/udp.c

    r105533 r107548  
    222222    }
    223223    setsockopt(so->s, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
     224#ifdef VBOX
     225    if (    slirp->fForwardBroadcast
     226        && (   so->so_faddr.s_addr == (slirp->vnetwork_addr.s_addr|~slirp->vnetwork_mask.s_addr)
     227            || so->so_faddr.s_addr == 0xffffffff)   )
     228        setsockopt(so->s, SOL_SOCKET, SO_BROADCAST, &(int){1}, sizeof(int));
     229#endif
    224230
    225231    /*
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