Lines Matching defs:pData

145        if (pData->icmp_socket.s != -1)             \
285 static int slirpVerifyAndFreeSocket(PNATState pData, struct socket *pSocket)
287 AssertPtrReturn(pData, 0);
293 sofree(pData, pSocket);
305 PNATState pData;
309 pData = RTMemAllocZ(RT_ALIGN_Z(sizeof(NATState), sizeof(uint64_t)));
310 *ppData = pData;
311 if (!pData)
313 pData->fPassDomain = !fUseHostResolver ? fPassDomain : false;
314 pData->fUseHostResolver = fUseHostResolver;
315 pData->fUseHostResolverPermanent = fUseHostResolver;
316 pData->pvUser = pvUser;
317 pData->netmask = u32Netmask;
319 rc = RTCritSectRwInit(&pData->CsRwHandlerChain);
324 pData->socket_rcv = 64 * _1K;
325 pData->socket_snd = 64 * _1K;
333 pData->soMaxConn = 10;
345 rc = RTLdrGetSymbol(hLdrMod, "GetAdaptersAddresses", (void **)&pData->pfGetAdaptersAddresses);
352 pData->phEvents[VBOX_SOCKET_EVENT_INDEX] = CreateEvent(NULL, FALSE, FALSE, NULL);
355 rc = bootp_dhcp_init(pData);
359 RTMemFree(pData);
363 debug_init(pData);
364 if_init(pData);
365 ip_init(pData);
366 icmp_init(pData, iIcmpCacheLimit);
369 mbuf_init(pData);
371 pData->special_addr.s_addr = u32NetAddr;
372 pData->slirp_ethaddr = &special_ethaddr[0];
373 alias_addr.s_addr = pData->special_addr.s_addr | RT_H2N_U32_C(CTL_ALIAS);
379 rc = slirpTftpInit(pData);
387 pData->i32AliasMode = i32AliasMode;
388 getouraddr(pData);
392 pData->proxy_alias = LibAliasInit(pData, NULL);
393 if (pData->proxy_alias == NULL)
398 flags = LibAliasSetMode(pData->proxy_alias, 0, 0);
402 flags |= pData->i32AliasMode; /* do transparent proxying */
403 flags = LibAliasSetMode(pData->proxy_alias, flags, ~0);
404 proxy_addr.s_addr = RT_H2N_U32(RT_N2H_U32(pData->special_addr.s_addr) | CTL_ALIAS);
405 LibAliasSetAddress(pData->proxy_alias, proxy_addr);
406 ftp_alias_load(pData);
407 nbt_alias_load(pData);
408 if (pData->fUseHostResolver)
409 dns_alias_load(pData);
413 pData->pInSockAddrHomeAddress = RTMemAllocZ(sizeof(struct sockaddr));
414 pData->cInHomeAddressSize = 1;
415 inet_aton("192.168.1.25", &pData->pInSockAddrHomeAddress[0].sin_addr);
416 pData->pInSockAddrHomeAddress[0].sin_family = AF_INET;
418 pData->pInSockAddrHomeAddress[0].sin_len = sizeof(struct sockaddr_in);
422 slirp_link_up(pData);
429 void slirp_register_statistics(PNATState pData, PPDMDRVINS pDrvIns)
432 # define PROFILE_COUNTER(name, dsc) REGISTER_COUNTER(name, pData, STAMTYPE_PROFILE, STAMUNIT_TICKS_PER_CALL, dsc)
433 # define COUNTING_COUNTER(name, dsc) REGISTER_COUNTER(name, pData, STAMTYPE_COUNTER, STAMUNIT_COUNT, dsc)
437 * ipstats(pData); tcpstats(pData); udpstats(pData); icmpstats(pData);
438 * mbufstats(pData); sockstats(pData); */
440 NOREF(pData);
448 void slirp_deregister_statistics(PNATState pData, PPDMDRVINS pDrvIns)
450 if (pData == NULL)
453 # define PROFILE_COUNTER(name, dsc) DEREGISTER_COUNTER(name, pData)
454 # define COUNTING_COUNTER(name, dsc) DEREGISTER_COUNTER(name, pData)
457 NOREF(pData);
465 void slirp_link_up(PNATState pData)
474 if (!pData->fUseHostResolverPermanent)
475 slirpInitializeDnsSettings(pData);
477 if (LIST_EMPTY(&pData->arp_cache))
480 LIST_FOREACH(ac, &pData->arp_cache, list)
482 activate_port_forwarding(pData, ac->ether);
489 void slirp_link_down(PNATState pData)
497 slirpReleaseDnsSettings(pData);
505 sofree(pData, so);
507 tcp_close(pData, sototcpcb(so));
511 udp_detach(pData, so);
517 LIST_FOREACH(rule, &pData->port_forward_rule_head, list)
521 pData->cRedirectionsActive = 0;
529 void slirp_term(PNATState pData)
531 if (pData == NULL)
533 icmp_finit(pData);
535 slirp_link_down(pData);
536 ftp_alias_unload(pData);
537 nbt_alias_unload(pData);
538 if (pData->fUseHostResolver)
540 dns_alias_unload(pData);
542 while (!LIST_EMPTY(&pData->DNSMapHead))
544 PDNSMAPPINGENTRY pDnsEntry = LIST_FIRST(&pData->DNSMapHead);
557 while (!LIST_EMPTY(&pData->arp_cache))
559 struct arp_cache_entry *ac = LIST_FIRST(&pData->arp_cache);
563 slirpTftpTerm(pData);
564 bootp_dhcp_fini(pData);
565 m_fini(pData);
574 ipstats(pData);
575 tcpstats(pData);
576 udpstats(pData);
577 icmpstats(pData);
578 mbufstats(pData);
579 sockstats(pData);
584 RTCritSectRwDelete(&pData->CsRwHandlerChain);
585 RTMemFree(pData);
595 static void updtime(PNATState pData)
615 void slirp_select_fill(PNATState pData, int *pnfds)
617 void slirp_select_fill(PNATState pData, int *pnfds, struct pollfd *polls)
630 STAM_PROFILE_START(&pData->StatFill, a);
662 pData->icmp_socket.so_poll_index = -1;
664 ICMP_ENGAGE_EVENT(&pData->icmp_socket, readfds);
666 STAM_COUNTER_RESET(&pData->StatTCP);
667 STAM_COUNTER_RESET(&pData->StatTCPHot);
675 STAM_COUNTER_INC(&pData->StatTCP);
702 STAM_COUNTER_INC(&pData->StatTCPHot);
713 STAM_COUNTER_INC(&pData->StatTCPHot);
727 STAM_COUNTER_INC(&pData->StatTCPHot);
743 STAM_COUNTER_INC(&pData->StatTCPHot);
752 STAM_COUNTER_RESET(&pData->StatUDP);
753 STAM_COUNTER_RESET(&pData->StatUDPHot);
759 STAM_COUNTER_INC(&pData->StatUDP);
777 so->so_timeout(pData, so, so->so_timeout_arg);
784 UDP_DETACH(pData, so, so_next);
805 STAM_COUNTER_INC(&pData->StatUDPHot);
819 STAM_PROFILE_STOP(&pData->StatFill, a);
828 static bool slirpConnectOrWrite(PNATState pData, struct socket *so, bool fConnectOnly)
868 TCP_INPUT(pData, (struct mbuf *)NULL, sizeof(struct ip), so);
873 SOWRITE(ret, pData, so);
892 void slirp_select_poll(PNATState pData, int fTimeout)
894 void slirp_select_poll(PNATState pData, struct pollfd *polls, int ndfs)
905 STAM_PROFILE_START(&pData->StatPoll, a);
908 updtime(pData);
917 STAM_PROFILE_START(&pData->StatFastTimer, b);
918 tcp_fasttimo(pData);
920 STAM_PROFILE_STOP(&pData->StatFastTimer, b);
924 STAM_PROFILE_START(&pData->StatSlowTimer, c);
925 ip_slowtimo(pData);
926 tcp_slowtimo(pData);
928 STAM_PROFILE_STOP(&pData->StatSlowTimer, c);
942 icmpwin_process(pData);
944 if ( (pData->icmp_socket.s != -1)
945 && CHECK_FD_SET(&pData->icmp_socket, ignored, readfds))
946 sorecvfrom(pData, &pData->icmp_socket);
959 if (slirpVerifyAndFreeSocket(pData, so))
1019 tcp_fconnect_failed(pData, so, sockerr);
1020 ret = slirpVerifyAndFreeSocket(pData, so);
1053 sorecvoob(pData, so);
1054 if (slirpVerifyAndFreeSocket(pData, so))
1070 bool fRet = slirpConnectOrWrite(pData, so, true);
1072 if (slirpVerifyAndFreeSocket(pData, so))
1081 TCP_CONNECT(pData, so);
1082 if (slirpVerifyAndFreeSocket(pData, so))
1091 ret = soread(pData, so);
1092 if (slirpVerifyAndFreeSocket(pData, so))
1096 TCP_OUTPUT(pData, sototcpcb(so));
1098 if (slirpVerifyAndFreeSocket(pData, so))
1113 && !slirpVerifyAndFreeSocket(pData, so);)
1115 ret = soread(pData, so);
1116 if (slirpVerifyAndFreeSocket(pData, so))
1120 TCP_OUTPUT(pData, sototcpcb(so));
1154 int fConnectOrWriteSuccess = slirpConnectOrWrite(pData, so, false);
1158 if (slirpVerifyAndFreeSocket(pData, so))
1212 if (!slirpVerifyAndFreeSocket(pData, so))
1230 if(slirpVerifyAndFreeSocket(pData, so));
1241 SORECVFROM(pData, so);
1248 STAM_PROFILE_STOP(&pData->StatPoll, a);
1270 static void arp_output(PNATState pData, const uint8_t *pcu8EtherSource, const struct arphdr *pcARPHeaderSource, uint32_t ip4TargetAddress)
1282 pMbufResponse = m_getcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR);
1299 if (!slirpMbufTagService(pData, pMbufResponse, (uint8_t)(ip4TargetAddressInHostFormat & ~pData->netmask)))
1305 (uint8_t)(ip4TargetAddressInHostFormat & ~pData->netmask)));
1309 pARPHeaderResponse->ar_sha[5] = (uint8_t)(ip4TargetAddressInHostFormat & ~pData->netmask);
1314 if_encap(pData, ETH_P_ARP, pMbufResponse, ETH_ENCAP_URG);
1319 static void arp_input(PNATState pData, struct mbuf *m)
1338 arp_output(pData, pEtherHeader->h_source, pARPHeader, ip4TargetAddress);
1355 slirp_arp_cache_update_or_add(pData, *(uint32_t *)pARPHeader->ar_sip, &pARPHeader->ar_sha[0]);
1360 slirp_arp_cache_update_or_add(pData, *(uint32_t *)pARPHeader->ar_sip, &pARPHeader->ar_sha[0]);
1367 m_freem(pData, m);
1376 void slirp_input(PNATState pData, struct mbuf *m, size_t cbBuf)
1387 m_freem(pData, m);
1398 arp_input(pData, m);
1404 updtime(pData);
1408 ip_input(pData, m);
1412 m_freem(pData, m);
1422 m_freem(pData, m);
1426 if (pData->cRedirectionsActive != pData->cRedirectionsStored)
1427 activate_port_forwarding(pData, au8Ether);
1435 void if_encap(PNATState pData, uint16_t eth_proto, struct mbuf *m, int flags)
1440 STAM_PROFILE_START(&pData->StatIF_encap, a);
1441 LogFlowFunc(("ENTER: pData:%p, eth_proto:%RX16, m:%p, flags:%d\n",
1442 pData, eth_proto, m, flags));
1462 m_freem(pData, m);
1480 m_freem(pData, m);
1487 slirp_urg_output(pData->pvUser, m, mbuf, mlen);
1489 slirp_output(pData->pvUser, m, mbuf, mlen);
1491 STAM_PROFILE_STOP(&pData->StatIF_encap, a);
1499 static uint32_t find_guest_ip(PNATState pData, const uint8_t *eth_addr)
1511 rc = slirp_arp_lookup_ip_by_ether(pData, eth_addr, &ip);
1515 bootp_cache_lookup_ip_by_ether(pData, eth_addr, &ip);
1526 static void activate_port_forwarding(PNATState pData, const uint8_t *h_source)
1532 LIST_FOREACH_SAFE(rule, &pData->port_forward_rule_head, list, tmp)
1544 guest_addr = find_guest_ip(pData, pu8EthSource);
1563 so = udp_listen(pData, rule->bind_ip.s_addr, RT_H2N_U16(rule->host_port), guest_addr,
1566 so = solisten(pData, rule->bind_ip.s_addr, RT_H2N_U16(rule->host_port), guest_addr,
1584 pData->cRedirectionsActive++;
1593 pData->cRedirectionsStored--;
1610 int slirp_add_redirect(PNATState pData, int is_udp, struct in_addr host_addr, int host_port,
1614 LIST_FOREACH(rule, &pData->port_forward_rule_head, list)
1637 LIST_INSERT_HEAD(&pData->port_forward_rule_head, rule, list);
1638 pData->cRedirectionsStored++;
1642 activate_port_forwarding(pData, ethaddr);
1646 int slirp_remove_redirect(PNATState pData, int is_udp, struct in_addr host_addr, int host_port,
1650 LIST_FOREACH(rule, &pData->port_forward_rule_head, list)
1665 udp_detach(pData, rule->so);
1667 tcp_close(pData, sototcpcb(rule->so));
1670 pData->cRedirectionsStored--;
1678 void slirp_set_ethaddr_and_activate_port_forwarding(PNATState pData, const uint8_t *ethaddr, uint32_t GuestIP)
1683 slirp_arp_cache_update_or_add(pData, GuestIP, ethaddr);
1684 activate_port_forwarding(pData, ethaddr);
1689 HANDLE *slirp_get_events(PNATState pData)
1691 return pData->phEvents;
1693 void slirp_register_external_event(PNATState pData, HANDLE hEvent, int index)
1695 pData->phEvents[index] = hEvent;
1699 unsigned int slirp_get_timeout_ms(PNATState pData)
1712 int slirp_get_nsock(PNATState pData)
1714 return pData->nsock;
1721 void slirp_post_sent(PNATState pData, void *pvArg)
1724 m_freem(pData, m);
1727 void slirp_set_dhcp_TFTP_prefix(PNATState pData, const char *tftpPrefix)
1733 void slirp_set_dhcp_TFTP_bootfile(PNATState pData, const char *bootFile)
1739 void slirp_set_dhcp_next_server(PNATState pData, const char *next_server)
1743 pData->tftp_server.s_addr = RT_H2N_U32(RT_N2H_U32(pData->special_addr.s_addr) | CTL_TFTP);
1745 inet_aton(next_server, &pData->tftp_server);
1748 int slirp_set_binding_address(PNATState pData, char *addr)
1750 if (addr == NULL || (inet_aton(addr, &pData->bindIP) == 0))
1752 pData->bindIP.s_addr = INADDR_ANY;
1758 void slirp_set_dhcp_dns_proxy(PNATState pData, bool fDNSProxy)
1760 if (!pData->fUseHostResolver)
1763 pData->fUseDnsProxy = fDNSProxy;
1781 void slirp_set_somaxconn(PNATState pData, int iSoMaxConn)
1793 LogRel(("NAT: proposed value(%d) of somaxconn is invalid, default value is used (%d)\n", iSoMaxConn, pData->soMaxConn));
1799 if (pData->soMaxConn != iSoMaxConn)
1802 pData->soMaxConn, iSoMaxConn));
1803 pData->soMaxConn = iSoMaxConn;
1809 void slirp_set_rcvbuf(PNATState pData, int kilobytes)
1812 pData->socket_rcv = kilobytes;
1814 void slirp_set_sndbuf(PNATState pData, int kilobytes)
1817 pData->socket_snd = kilobytes * _1K;
1819 void slirp_set_tcp_rcvspace(PNATState pData, int kilobytes)
1824 void slirp_set_tcp_sndspace(PNATState pData, int kilobytes)
1835 int slirp_arp_lookup_ether_by_ip(PNATState pData, uint32_t ip, uint8_t *ether)
1842 if (LIST_EMPTY(&pData->arp_cache))
1845 LIST_FOREACH(ac, &pData->arp_cache, list)
1862 int slirp_arp_lookup_ip_by_ether(PNATState pData, const uint8_t *ether, uint32_t *ip)
1867 if (LIST_EMPTY(&pData->arp_cache))
1870 LIST_FOREACH(ac, &pData->arp_cache, list)
1881 void slirp_arp_who_has(PNATState pData, uint32_t dst)
1906 m = m_getcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR);
1924 *(uint32_t *)ahdr->ar_sip = RT_H2N_U32(RT_N2H_U32(pData->special_addr.s_addr) | CTL_ALIAS);
1931 if_encap(pData, ETH_P_ARP, m, ETH_ENCAP_URG);
1935 void slirp_add_host_resolver_mapping(PNATState pData, const char *pszHostName, const char *pszHostNamePattern, uint32_t u32HostIP)
1966 LIST_INSERT_HEAD(&pData->DNSMapHead, pDnsMapping, MapList);
1980 static inline int slirp_arp_cache_update(PNATState pData, uint32_t dst, const uint8_t *mac)
1985 LIST_FOREACH(ac, &pData->arp_cache, list)
2000 static inline void slirp_arp_cache_add(PNATState pData, uint32_t ip, const uint8_t *ether)
2013 LIST_INSERT_HEAD(&pData->arp_cache, ac, list);
2020 int slirp_arp_cache_update_or_add(PNATState pData, uint32_t dst, const uint8_t *mac)
2034 if (slirp_arp_cache_update(pData, dst, mac))
2035 slirp_arp_cache_add(pData, dst, mac);
2041 void slirp_set_mtu(PNATState pData, int mtu)
2056 void slirp_info(PNATState pData, const void *pvArg, const char *pszArgs)
2078 LIST_FOREACH(ac, &pData->arp_cache, list)
2084 LIST_FOREACH(rule, &pData->port_forward_rule_head, list)
2098 int slirp_host_network_configuration_change_strategy_selector(const PNATState pData)
2100 if (pData->fUseHostResolverPermanent)
2103 if (pData->fUseDnsProxy) {
2112 rc, LIST_EMPTY(&pData->pDomainList)
2114 : LIST_FIRST(&pData->pDomainList)->dd_pszDomain,
2117 || LIST_EMPTY(&pData->pDomainList))
2121 && strcmp(rcp_state.rcps_domain, LIST_FIRST(&pData->pDomainList)->dd_pszDomain) == 0)