285
285
ret = pData->pfGetAdaptersAddresses(AF_INET, 0, NULL /* reserved */, pAdapterAddr, &size);
286
286
if (ret != ERROR_BUFFER_OVERFLOW)
288
LogRel(("NAT: error %lu occurred on capacity detection operation\n", ret));
288
Log(("NAT: error %lu occurred on capacity detection operation\n", ret));
293
LogRel(("NAT: Win socket API returns non capacity\n"));
293
Log(("NAT: Win socket API returns non capacity\n"));
297
297
pAdapterAddr = RTMemAllocZ(size);
298
298
if (!pAdapterAddr)
300
LogRel(("NAT: No memory available \n"));
300
Log(("NAT: No memory available\n"));
303
303
ret = pData->pfGetAdaptersAddresses(AF_INET, 0, NULL /* reserved */, pAdapterAddr, &size);
304
304
if (ret != ERROR_SUCCESS)
306
LogRel(("NAT: error %lu occurred on fetching adapters info\n", ret));
306
Log(("NAT: error %lu occurred on fetching adapters info\n", ret));
307
307
RTMemFree(pAdapterAddr);
329
329
pDns = RTMemAllocZ(sizeof(struct dns_entry));
332
LogRel(("NAT: Can't allocate buffer for DNS entry\n"));
332
Log(("NAT: Can't allocate buffer for DNS entry\n"));
333
333
RTMemFree(pAdapterAddr);
334
334
return VERR_NO_MEMORY;
337
LogRel(("NAT: adding %R[IP4] to DNS server list\n", &InAddr));
337
Log(("NAT: adding %R[IP4] to DNS server list\n", &InAddr));
338
338
if ((InAddr.s_addr & RT_H2N_U32_C(IN_CLASSA_NET)) == RT_N2H_U32_C(INADDR_LOOPBACK & IN_CLASSA_NET))
339
339
pDns->de_addr.s_addr = RT_H2N_U32(RT_N2H_U32(pData->special_addr.s_addr) | CTL_ALIAS);
369
369
pDomain = RTMemAllocZ(sizeof(struct dns_domain_entry));
372
LogRel(("NAT: not enough memory\n"));
372
Log(("NAT: not enough memory\n"));
373
373
RTStrFree(pszSuffix);
374
374
RTMemFree(pAdapterAddr);
375
375
return VERR_NO_MEMORY;
377
377
pDomain->dd_pszDomain = pszSuffix;
378
LogRel(("NAT: adding domain name %s to search list\n", pDomain->dd_pszDomain));
378
Log(("NAT: adding domain name %s to search list\n", pDomain->dd_pszDomain));
379
379
LIST_INSERT_HEAD(&pData->pDomainList, pDomain, dd_list);
474
474
struct dns_entry *pDns = NULL;
475
475
if ( cNameserversFound == 4
476
&& fWarnTooManyDnsServers == 0
476
&& !fWarnTooManyDnsServers
477
477
&& sscanf(buff, "nameserver%*[ \t]%255s", buff2) == 1)
479
fWarnTooManyDnsServers = 1;
479
fWarnTooManyDnsServers = true;
480
480
LogRel(("NAT: too many nameservers registered.\n"));
482
482
if ( sscanf(buff, "nameserver%*[ \t]%255s", buff2) == 1
523
523
pDomain = RTMemAllocZ(sizeof(struct dns_domain_entry));
526
LogRel(("NAT: not enought memory to add domain list\n"));
526
Log(("NAT: not enought memory to add domain list\n"));
527
527
return VERR_NO_MEMORY;
529
529
pDomain->dd_pszDomain = RTStrDup(tok);
530
LogRel(("NAT: adding domain name %s to search list\n", pDomain->dd_pszDomain));
530
Log(("NAT: adding domain name %s to search list\n", pDomain->dd_pszDomain));
531
531
LIST_INSERT_HEAD(&pData->pDomainList, pDomain, dd_list);
644
644
if (i32AliasMode & ~(PKT_ALIAS_LOG|PKT_ALIAS_SAME_PORTS|PKT_ALIAS_PROXY_ONLY))
646
LogRel(("NAT: alias mode %x is ignored\n", i32AliasMode));
646
Log(("NAT: alias mode %x is ignored\n", i32AliasMode));
647
647
i32AliasMode = 0;
649
649
pData->i32AliasMode = i32AliasMode;
654
654
pData->proxy_alias = LibAliasInit(pData, NULL);
655
655
if (pData->proxy_alias == NULL)
657
LogRel(("NAT: LibAlias default rule wasn't initialized\n"));
657
Log(("NAT: LibAlias default rule wasn't initialized\n"));
658
658
AssertMsgFailed(("NAT: LibAlias default rule wasn't initialized\n"));
660
660
flags = LibAliasSetMode(pData->proxy_alias, 0, 0);
937
939
* Set for writing if we are connected, can send more, and
938
940
* we have something to send
940
if (CONN_CANFSEND(so) && so->so_rcv.sb_cc)
942
if (CONN_CANFSEND(so) && SBUF_LEN(&so->so_rcv))
942
944
STAM_COUNTER_INC(&pData->StatTCPHot);
943
945
TCP_ENGAGE_EVENT1(so, writefds);
947
949
* Set for reading (and urgent data) if we are connected, can
948
950
* receive more, and we have room for it XXX /2 ?
950
if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2)))
952
/* @todo: vvl - check which predicat here will be more useful here in rerm of new sbufs. */
953
if (CONN_CANFRCV(so) && (SBUF_LEN(&so->so_snd) < (SBUF_SIZE(&so->so_snd)/2)))
952
955
STAM_COUNTER_INC(&pData->StatTCPHot);
953
956
TCP_ENGAGE_EVENT2(so, readfds, xfds);
1192
1195
TCP_OUTPUT(pData, sototcpcb(so));
1195
Log2(("%R[natsock] errno %d:%s\n", so, errno, strerror(errno)));
1198
Log2(("%R[natsock] errno %d (%s)\n", so, errno, strerror(errno)));
1383
1386
AssertCompileSize(struct arphdr, 28);
1386
* @note This function will free m!
1389
* @note This function will free m!
1388
1391
static void arp_input(PNATState pData, struct mbuf *m)
1412
1415
mr->m_data += ETH_HLEN;
1413
1416
rah = mtod(mr, struct arphdr *);
1414
1417
mr->m_len = sizeof(struct arphdr);
1416
1418
memcpy(reh->h_source, eh->h_source, ETH_ALEN); /* XXX: if_encap will swap src and dst*/
1418
1420
#ifdef VBOX_WITH_NAT_SERVICE
1564
mlen = m_length(m, NULL);
1565
buf = RTMemAlloc(mlen);
1569
* we're processing the chain, that isn't not expected.
1571
Assert((!m->m_next));
1568
LogRel(("NAT: Can't alloc memory for outgoing buffer\n"));
1574
Log(("NAT: if_encap's recived the chain, dropping...\n"));
1569
1575
m_freem(pData, m);
1578
mbuf = mtod(m, uint8_t *);
1572
1579
eh->h_proto = RT_H2N_U16(eth_proto);
1573
m_copydata(m, 0, mlen, (char *)buf);
1574
1580
if (flags & ETH_ENCAP_URG)
1575
slirp_urg_output(pData->pvUser, m, buf, mlen);
1581
slirp_urg_output(pData->pvUser, m, mbuf, mlen);
1577
slirp_output(pData->pvUser, m, buf, mlen);
1583
slirp_output(pData->pvUser, m, mbuf, mlen);
1579
1585
STAM_PROFILE_STOP(&pData->StatIF_encap, a);
1651
1657
#if !defined(VBOX_WITH_NAT_SERVICE)
1652
if (rule->guest_addr.s_addr != guest_addr)
1658
if ( rule->guest_addr.s_addr != guest_addr
1659
&& rule->guest_addr.s_addr != INADDR_ANY)
1661
if (rule->guest_addr.s_addr == INADDR_ANY)
1662
rule->guest_addr.s_addr = guest_addr;
1656
1665
LogRel(("NAT: set redirect %s host port %d => guest port %d @ %R[IP4]\n",
1657
(rule->proto == IPPROTO_UDP?"UDP":"TCP"),
1658
rule->host_port, rule->guest_port, &guest_addr));
1666
rule->proto == IPPROTO_UDP ? "UDP" : "TCP", rule->host_port, rule->guest_port, &guest_addr));
1660
1668
if (rule->proto == IPPROTO_UDP)
1661
1669
so = udp_listen(pData, rule->bind_ip.s_addr, RT_H2N_U16(rule->host_port), guest_addr,
1719
1728
* could get it from VM configuration in DrvNAT or Service, the idea is activating
1720
1729
* corresponding port-forwarding
1722
int slirp_redir(PNATState pData, int is_udp, struct in_addr host_addr, int host_port,
1731
int slirp_add_redirect(PNATState pData, int is_udp, struct in_addr host_addr, int host_port,
1723
1732
struct in_addr guest_addr, int guest_port, const uint8_t *ethaddr)
1725
1734
struct port_forward_rule *rule = NULL;
1726
Assert(memcmp(ethaddr, zerro_ethaddr, ETH_ALEN) == 0);
1736
LIST_FOREACH(rule, &pData->port_forward_rule_head, list)
1738
if ( rule->proto == (is_udp ? IPPROTO_UDP : IPPROTO_TCP)
1739
&& rule->host_port == host_port
1740
&& rule->bind_ip.s_addr == host_addr.s_addr
1741
&& rule->guest_port == guest_port
1742
#ifndef VBOX_WITH_NAT_SERVICE
1743
&& rule->guest_addr.s_addr == guest_addr.s_addr
1746
return 0; /* rule has been already registered */
1728
1749
rule = RTMemAllocZ(sizeof(struct port_forward_rule));
1729
1750
if (rule == NULL)
1740
1761
/* @todo add mac address */
1741
1762
LIST_INSERT_HEAD(&pData->port_forward_rule_head, rule, list);
1742
1763
pData->cRedirectionsStored++;
1764
/* activate port-forwarding if guest has already got assigned IP */
1765
if (memcmp(ethaddr, zerro_ethaddr, ETH_ALEN))
1766
activate_port_forwarding(pData, ethaddr);
1770
int slirp_remove_redirect(PNATState pData, int is_udp, struct in_addr host_addr, int host_port,
1771
struct in_addr guest_addr, int guest_port)
1773
struct port_forward_rule *rule = NULL;
1774
LIST_FOREACH(rule, &pData->port_forward_rule_head, list)
1776
if ( rule->proto == (is_udp ? IPPROTO_UDP : IPPROTO_TCP)
1777
&& rule->host_port == host_port
1778
&& rule->guest_port == guest_port
1779
&& rule->bind_ip.s_addr == host_addr.s_addr
1780
#ifndef VBOX_WITH_NAT_SERVICE
1781
&& rule->guest_addr.s_addr == guest_addr.s_addr
1785
LogRel(("NAT: remove redirect %s host port %d => guest port %d @ %R[IP4]\n",
1786
rule->proto == IPPROTO_UDP ? "UDP" : "TCP", rule->host_port, rule->guest_port, &guest_addr));
1788
LibAliasUninit(rule->so->so_la);
1790
udp_detach(pData, rule->so);
1792
tcp_close(pData, sototcpcb(rule->so));
1793
LIST_REMOVE(rule, list);
1795
pData->cRedirectionsStored--;
1809
1866
void slirp_set_dhcp_TFTP_prefix(PNATState pData, const char *tftpPrefix)
1811
Log2(("tftp_prefix:%s\n", tftpPrefix));
1868
Log2(("tftp_prefix: %s\n", tftpPrefix));
1812
1869
tftp_prefix = tftpPrefix;
1815
1872
void slirp_set_dhcp_TFTP_bootfile(PNATState pData, const char *bootFile)
1817
Log2(("bootFile:%s\n", bootFile));
1874
Log2(("bootFile: %s\n", bootFile));
1818
1875
bootp_filename = bootFile;
1821
1878
void slirp_set_dhcp_next_server(PNATState pData, const char *next_server)
1823
Log2(("next_server:%s\n", next_server));
1880
Log2(("next_server: %s\n", next_server));
1824
1881
if (next_server == NULL)
1825
1882
pData->tftp_server.s_addr = RT_H2N_U32(RT_N2H_U32(pData->special_addr.s_addr) | CTL_TFTP);
1942
1999
m = m_getcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR);
1945
LogRel(("NAT: Can't alloc mbuf for ARP request\n"));
2002
Log(("NAT: Can't alloc mbuf for ARP request\n"));
1948
2005
ehdr = mtod(m, struct ethhdr *);
2011
2068
LogRel(("NAT: mtu(%d) is out of range (20;16000] mtu forcely assigned to 1500\n", mtu));
2071
/* MTU is maximum transition unit on */
2079
void slirp_info(PNATState pData, PCDBGFINFOHLP pHlp, const char *pszArgs)
2081
struct socket *so, *so_next;
2082
struct arp_cache_entry *ac;
2083
struct port_forward_rule *rule;
2085
pHlp->pfnPrintf(pHlp, "NAT parameters: MTU=%d\n", if_mtu);
2086
pHlp->pfnPrintf(pHlp, "NAT TCP ports:\n");
2087
QSOCKET_FOREACH(so, so_next, tcp)
2089
pHlp->pfnPrintf(pHlp, " %R[natsock]\n", so);
2092
pHlp->pfnPrintf(pHlp, "NAT UDP ports:\n");
2093
QSOCKET_FOREACH(so, so_next, udp)
2095
pHlp->pfnPrintf(pHlp, " %R[natsock]\n", so);
2098
pHlp->pfnPrintf(pHlp, "NAT ARP cache:\n");
2099
LIST_FOREACH(ac, &pData->arp_cache, list)
2101
pHlp->pfnPrintf(pHlp, " %R[IP4] %R[ether]\n", &ac->ip, &ac->ether);
2104
pHlp->pfnPrintf(pHlp, "NAT rules:\n");
2105
LIST_FOREACH(rule, &pData->port_forward_rule_head, list)
2107
pHlp->pfnPrintf(pHlp, " %s %d => %R[IP4]:%d %c\n",
2108
rule->proto == IPPROTO_UDP ? "UDP" : "TCP",
2109
rule->host_port, &rule->guest_addr.s_addr, rule->guest_port,
2110
rule->activated ? ' ' : '*');