Changeset 107548 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Jan 8, 2025 7:54:13 PM (4 months ago)
- svn:sync-xref-src-repo-rev:
- 166619
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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;
Note:
See TracChangeset
for help on using the changeset viewer.