/** * (C) 2007-21 - ntop.org and contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not see see * */ #ifdef WIN32 #include "edge_utils_win32.h" /* ************************************** */ static DWORD* tunReadThread (LPVOID lpArg) { struct tunread_arg *arg = (struct tunread_arg*)lpArg; while(*arg->keep_running) { edge_read_from_tap(arg->eee); } return((DWORD*)NULL); } /* ************************************** */ /** Start a second thread in Windows because TUNTAP interfaces do not expose * file descriptors. */ HANDLE startTunReadThread (struct tunread_arg *arg) { DWORD dwThreadId; return(CreateThread(NULL, /* security attributes */ 0, /* use default stack size */ (LPTHREAD_START_ROUTINE)tunReadThread, /* thread function */ (void*)arg, /* argument to thread function */ 0, /* thread creation flags */ &dwThreadId)); /* thread id out */ } int get_best_interface_ip(n2n_edge_t * eee, dec_ip_str_t ip_addr){ DWORD interface_index = -1; DWORD dwRetVal = 0; PIP_ADAPTER_INFO pAdapterInfo = NULL, pAdapter = NULL; macstr_t mac_buf; ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); dwRetVal = GetBestInterface(*(IPAddr*)(&eee->curr_sn->sock.addr.v4), &interface_index); if(dwRetVal != NO_ERROR) return -1; pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulOutBufLen); if (pAdapterInfo == NULL) { traceEvent(TRACE_INFO, "Error allocating memory needed to call GetAdaptersInfo\n"); return -1; } dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); if(dwRetVal == ERROR_BUFFER_OVERFLOW){ pAdapterInfo = (PIP_ADAPTER_INFO)realloc(pAdapterInfo, ulOutBufLen); if (pAdapterInfo == NULL) { traceEvent(TRACE_INFO, "Error allocating memory needed to call GetAdaptersInfo\n"); return -1; } } dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); // hexdump((uint8_t*)pAdapterInfo, ulOutBufLen); if (dwRetVal == NO_ERROR) { for(pAdapter = pAdapterInfo; pAdapter != NULL; pAdapter = pAdapter->Next){ if (pAdapter->Index != interface_index) continue; traceEvent(TRACE_DEBUG, "Adapter Index: %ld\n", pAdapter->Index); traceEvent(TRACE_DEBUG, "Combo Index: %ld\n", pAdapter->ComboIndex); traceEvent(TRACE_DEBUG, "Adapter Name: %s\n", pAdapter->AdapterName); traceEvent(TRACE_DEBUG, "Adapter Desc: %s\n", pAdapter->Description); traceEvent(TRACE_DEBUG, "Adapter Type: %u\n", pAdapter->Type); macaddr_str(mac_buf, pAdapter->Address); traceEvent(TRACE_DEBUG, "Adapter Addr: %s\n", mac_buf); traceEvent(TRACE_DEBUG, "DHCP Enabled: %u\n", pAdapter->DhcpEnabled); traceEvent(TRACE_DEBUG, "DHCP Server: %s\n", pAdapter->DhcpServer.IpAddress.String); traceEvent(TRACE_DEBUG, "IP Address: %s\n", pAdapter->IpAddressList.IpAddress.String); traceEvent(TRACE_DEBUG, "IP Mask: %s\n", pAdapter->IpAddressList.IpMask.String); traceEvent(TRACE_DEBUG, "Gateway: %s\n", pAdapter->GatewayList.IpAddress.String); strncpy(ip_addr, pAdapter->IpAddressList.IpAddress.String, sizeof(dec_ip_str_t)-1); } } else { traceEvent(TRACE_WARNING, "GetAdaptersInfo failed with error: %d\n", dwRetVal); } if (pAdapterInfo != NULL){ free(pAdapterInfo); pAdapterInfo = NULL; } return 0; } #endif