Changeset 107548 in vbox
- Timestamp:
- Jan 8, 2025 7:54:13 PM (4 months ago)
- svn:sync-xref-src-repo-rev:
- 166619
- Location:
- trunk
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/settings.h
r107508 r107548 881 881 bool fAliasUseSamePorts; 882 882 bool fLocalhostReachable; 883 bool fForwardBroadcast; 883 884 NATRulesMap mapRules; 884 885 }; -
trunk/src/VBox/Devices/Network/DrvNATlibslirp.cpp
r107225 r107548 92 92 #define DRVNAT_MAXFRAMESIZE (16 * 1024) 93 93 #define DRVNAT_DEFAULT_TIMEOUT (3600*1000) 94 #define MAX_IP_ADDRESS_STR_LEN_W_NULL 16 94 95 95 96 #define GET_EXTRADATA(pdrvins, node, name, rc, type, type_name, var) \ … … 175 176 176 177 SlirpTimer *pTimerHead; 178 bool fPassDomain; 177 179 } SlirpState; 178 180 typedef SlirpState *pSlirpState; … … 263 265 static DECLCALLBACK(int64_t) drvNAT_ClockGetNsCb(void *opaque); 264 266 static DECLCALLBACK(int) drvNAT_GetREventsCb(int idx, void *opaque); 267 static DECLCALLBACK(int) drvNATNotifyApplyPortForwardCommand(PDRVNAT pThis, bool fRemove, 268 bool fUdp, const char *pHostIp, 269 uint16_t u16HostPort, const char *pGuestIp, uint16_t u16GuestPort); 265 270 266 271 … … 925 930 GET_S32_STRICT(rc, pDrvIns, pNode, "GuestPort", iGuestPort); 926 931 932 /** @todo r=jack: why are we using IP INADD_ANY for port forward when FE does not do so. */ 927 933 /* 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)); 931 938 932 939 /* 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)); 936 948 937 949 /* 938 * Call slirp about it.950 * Apply port forward. 939 951 */ 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) 942 954 return PDMDrvHlpVMSetError(pThis->pDrvIns, VERR_NAT_REDIR_SETUP, RT_SRC_POS, 943 955 N_("NAT#%d: configuration error: failed to set up " … … 963 975 * @thread ? 964 976 */ 965 static DECLCALLBACK( void) drvNATNotifyApplyPortForwardCommand(PDRVNAT pThis, bool fRemove,977 static DECLCALLBACK(int) drvNATNotifyApplyPortForwardCommand(PDRVNAT pThis, bool fRemove, 966 978 bool fUdp, const char *pHostIp, 967 979 uint16_t u16HostPort, const char *pGuestIp, uint16_t u16GuestPort) … … 972 984 */ 973 985 struct in_addr guestIp, hostIp; 986 int rc = VINF_SUCCESS; 974 987 975 988 if ( pHostIp == NULL … … 982 995 983 996 if (fRemove) 984 slirp_remove_hostfwd(pThis->pNATState->pSlirp, fUdp, hostIp, u16HostPort);997 rc = slirp_remove_hostfwd(pThis->pNATState->pSlirp, fUdp, hostIp, u16HostPort); 985 998 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; 988 1014 } 989 1015 … … 995 1021 const char *pGuestIp, uint16_t u16GuestPort) 996 1022 { 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)); 999 1026 PDRVNAT pThis = RT_FROM_MEMBER(pInterface, DRVNAT, INetworkNATCfg); 1000 1027 /* Execute the command directly if the VM is not running. */ 1001 1028 int rc; 1002 1029 if (pThis->pSlirpThread->enmState != PDMTHREADSTATE_RUNNING) 1003 { 1004 drvNATNotifyApplyPortForwardCommand(pThis, fRemove, fUdp, pHostIp, 1030 rc = drvNATNotifyApplyPortForwardCommand(pThis, fRemove, fUdp, pHostIp, 1005 1031 u16HostPort, pGuestIp,u16GuestPort); 1006 rc = VINF_SUCCESS;1007 }1008 1032 else 1009 1033 { … … 1035 1059 AssertReturnVoid(pNATState); 1036 1060 AssertReturnVoid(pNATState->pSlirp); 1061 1062 if (!pNATState->fPassDomain) 1063 return; 1037 1064 1038 1065 LogRel(("NAT: DNS settings changed, triggering update\n")); … … 1529 1556 "|LocalhostReachable" 1530 1557 "|HostResolverMappings" 1558 "|ForwardBroadcast" 1531 1559 , "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 )); 1532 1572 1533 1573 /* … … 1535 1575 */ 1536 1576 int rc; 1577 1537 1578 bool fPassDomain = true; 1538 1579 GET_BOOL(rc, pDrvIns, pCfg, "PassDomain", fPassDomain); 1580 pNATState->fPassDomain = fPassDomain; 1581 1582 bool fForwardBroadcast = false; 1583 GET_BOOL(rc, pDrvIns, pCfg, "ForwardBroadcast", fForwardBroadcast); 1539 1584 1540 1585 GET_STRING_ALLOC(rc, pDrvIns, pCfg, "TFTPPrefix", pThis->pszTFTPPrefix); … … 1644 1689 slirpCfg.vdnssearch = NULL; 1645 1690 slirpCfg.vdomainname = NULL; 1691 slirpCfg.disable_host_loopback = fLocalhostReachable; 1692 slirpCfg.fForwardBroadcast = fForwardBroadcast; 1693 slirpCfg.iSoMaxConn = i32SoMaxConn; 1646 1694 1647 1695 slirpCallbacks.send_packet = &drvNAT_SendPacketCb; -
trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
r107435 r107548 146 146 MODIFYVM_NATDNSHOSTRESOLVER, 147 147 MODIFYVM_NATLOCALHOSTREACHABLE, 148 MODIFYVM_NATFORWARDBROADCAST, 148 149 MODIFYVM_MACADDRESS, 149 150 MODIFYVM_HIDPTR, … … 381 382 OPT2("--nat-dns-host-resolver", "--natdnshostresolver", MODIFYVM_NATDNSHOSTRESOLVER, RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX), 382 383 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), 383 385 OPT2("--mac-address", "--macaddress", MODIFYVM_MACADDRESS, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX), 384 386 OPT1("--mouse", MODIFYVM_HIDPTR, RTGETOPT_REQ_STRING), … … 2388 2390 } 2389 2391 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 2390 2408 case MODIFYVM_MACADDRESS: 2391 2409 { -
trunk/src/VBox/Main/idl/VirtualBox.xidl
r107524 r107548 26461 26461 wsmap="managed" 26462 26462 rest="managed" 26463 reservedMethods="4" reservedAttributes=" 8"26463 reservedMethods="4" reservedAttributes="7" 26464 26464 > 26465 26465 <desc>Interface for managing a NAT engine which is used with a virtual machine. This … … 26510 26510 <desc>Whether traffic from the guest directed to 10.0.2.2 will reach the 26511 26511 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> 26512 26516 </attribute> 26513 26517 <method name="setNetworkSettings"> -
trunk/src/VBox/Main/include/NATEngineImpl.h
r106061 r107548 75 75 HRESULT setLocalhostReachable(BOOL fLocalhostReachable); 76 76 HRESULT getLocalhostReachable(BOOL *pfLocalhostReachable); 77 HRESULT setForwardBroadcast(BOOL fForwardBroadcast); 78 HRESULT getForwardBroadcast(BOOL *pfForwardBroadcast); 77 79 /* TFTP properties */ 78 80 HRESULT setTFTPPrefix(const com::Utf8Str &aTFTPPrefix); -
trunk/src/VBox/Main/src-client/ConsoleImplConfigCommon.cpp
r107448 r107548 2323 2323 hrc = natEngine->COMGETTER(LocalhostReachable)(&fLocalhostReachable); H(); 2324 2324 InsertConfigInteger(pCfg, "LocalhostReachable", fLocalhostReachable); 2325 2326 /* forward broadcast packets */ 2327 BOOL fForwardBroadcast; 2328 hrc = natEngine->COMGETTER(ForwardBroadcast)(&fForwardBroadcast); H(); 2329 InsertConfigInteger(pCfg, "ForwardBroadcast", fForwardBroadcast); 2325 2330 2326 2331 /* port-forwarding */ -
trunk/src/VBox/Main/src-server/NATEngineImpl.cpp
r106061 r107548 199 199 200 200 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} */ 201 202 } 202 203 … … 464 465 } 465 466 467 HRESULT 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 480 HRESULT NATEngine::getForwardBroadcast(BOOL *pfForwardBroadcast) 481 { 482 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 483 *pfForwardBroadcast = mData->m->fForwardBroadcast; 484 return S_OK; 485 } 486 466 487 HRESULT NATEngine::setTFTPPrefix(const com::Utf8Str &aTFTPPrefix) 467 488 { -
trunk/src/VBox/Main/xml/VirtualBox-settings.xsd
r106065 r107548 1120 1120 <xsd:attribute name="tcpsnd" type="xsd:unsignedInt"/> 1121 1121 <xsd:attribute name="localhost-reachable" type="xsd:boolean" default="true"/> 1122 <xsd:attribute name="forward-broadcast" type="xsd:boolean" default="false" /> 1122 1123 </xsd:complexType> 1123 1124 -
trunk/src/libs/libslirp-4.8.0/include/glib.h
r106935 r107548 35 35 36 36 #ifndef INCLUDED_glib_h 37 #define INCLUDED_glib_h 37 38 #ifndef RT_WITHOUT_PRAGMA_ONCE 38 39 # pragma once -
trunk/src/libs/libslirp-4.8.0/src/libslirp.h
r105726 r107548 210 210 */ 211 211 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 212 226 } SlirpConfig; 213 227 -
trunk/src/libs/libslirp-4.8.0/src/slirp.c
r105726 r107548 699 699 } 700 700 701 #ifdef VBOX 702 slirp->fForwardBroadcast = cfg->fForwardBroadcast; 703 slirp->iSoMaxConn = cfg->iSoMaxConn; 704 #endif 705 701 706 ip6_post_init(slirp); 702 707 return slirp; -
trunk/src/libs/libslirp-4.8.0/src/slirp.h
r105533 r107548 218 218 struct sockaddr_in6 *outbound_addr6; 219 219 bool disable_dns; /* slirp will not redirect/serve any DNS packet */ 220 221 #ifdef VBOX 222 bool fForwardBroadcast; 223 int iSoMaxConn; 224 #endif 220 225 }; 221 226 -
trunk/src/libs/libslirp-4.8.0/src/socket.c
r105533 r107548 656 656 DEBUG_MISC(" did recvfrom %d, errno = %d-%s", m->m_len, errno, 657 657 strerror(errno)); 658 if (m->m_len < 0) { 658 if (m->m_len < 0) { 659 659 if (errno == ENOTCONN) { 660 660 /* … … 868 868 (slirp_socket_set_fast_reuse(s) < 0) || 869 869 (bind(s, haddr, haddrlen) < 0) || 870 #ifdef VBOX 871 (listen(s, slirp->iSoMaxConn) < 0)) { 872 #else 870 873 (listen(s, 1) < 0)) { 874 #endif 871 875 int tmperrno = errno; /* Don't clobber the real reason we failed */ 872 876 if (s >= 0) { … … 973 977 974 978 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 976 987 if (s->disable_host_loopback) { 977 988 return false; 978 989 } 979 990 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; 981 997 } 982 998 -
trunk/src/libs/libslirp-4.8.0/src/udp.c
r105533 r107548 222 222 } 223 223 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 224 230 225 231 /*
Note:
See TracChangeset
for help on using the changeset viewer.