10193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen/*- 29d0cfcbfd2f5ec18e5d548574951a74374ed1475tuexen * Copyright (c) 2011-2012 Irene Ruengeler 39d0cfcbfd2f5ec18e5d548574951a74374ed1475tuexen * Copyright (c) 2011-2012 Michael Tuexen 40193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * All rights reserved. 50193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * 60193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * Redistribution and use in source and binary forms, with or without 70193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * modification, are permitted provided that the following conditions 80193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * are met: 90193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * 1. Redistributions of source code must retain the above copyright 100193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * notice, this list of conditions and the following disclaimer. 110193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * 2. Redistributions in binary form must reproduce the above copyright 120193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * notice, this list of conditions and the following disclaimer in the 130193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * documentation and/or other materials provided with the distribution. 140193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * 150193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 160193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 170193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 180193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 190193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 200193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 210193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 220193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 230193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 240193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 250193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * SUCH DAMAGE. 260193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen * 270193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen */ 280193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen 29b33f05d9cf94e2a01563a7022af57810135a8f4bruengeler 3064e334d5c39a8fef8d8b12da26baf7724c1b0660t#ifdef _WIN32 31b33f05d9cf94e2a01563a7022af57810135a8f4bruengeler#include <netinet/sctp_pcb.h> 320193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen#include <sys/timeb.h> 3308b01b0fde6a8fd8455be3184b44c9c2f1e2ccb4tuexen#include <iphlpapi.h> 340193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen#pragma comment(lib, "IPHLPAPI.lib") 350193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen#endif 36b33f05d9cf94e2a01563a7022af57810135a8f4bruengeler#include <netinet/sctp_os_userspace.h> 370193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen 3864e334d5c39a8fef8d8b12da26baf7724c1b0660t#ifndef _WIN32 390193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexenint 400193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexensctp_userspace_get_mtu_from_ifn(uint32_t if_index, int af) 410193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen{ 420193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen struct ifreq ifr; 430193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen int fd; 440193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen 450193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if_indextoname(if_index, ifr.ifr_name); 460193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen /* TODO can I use the raw socket here and not have to open a new one with each query? */ 470193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if ((fd = socket(af, SOCK_DGRAM, 0)) < 0) 480193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (0); 490193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) { 500193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen close(fd); 510193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (0); 520193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 530193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen close(fd); 540193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return ifr.ifr_mtu; 550193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen} 560193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen#endif 570193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen 5864e334d5c39a8fef8d8b12da26baf7724c1b0660t#ifdef _WIN32 590193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexenint 600193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexensctp_userspace_get_mtu_from_ifn(uint32_t if_index, int af) 610193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen{ 620193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen PIP_ADAPTER_ADDRESSES pAdapterAddrs, pAdapt; 630193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen DWORD AdapterAddrsSize, Err; 640193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen 650193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen AdapterAddrsSize = 0; 6623273859c39742f09cc5ec7c9bf32ff225661e82tuexen if ((Err = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &AdapterAddrsSize)) != 0) { 670193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if ((Err != ERROR_BUFFER_OVERFLOW) && (Err != ERROR_INSUFFICIENT_BUFFER)) { 68ceb88c41886e539b890402ea3dfef3528dcf4343tuexen SCTPDBG(SCTP_DEBUG_USR, "GetAdaptersAddresses() sizing failed with error code %d, AdapterAddrsSize = %d\n", Err, AdapterAddrsSize); 690193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (-1); 700193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 710193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 720193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if ((pAdapterAddrs = (PIP_ADAPTER_ADDRESSES) GlobalAlloc(GPTR, AdapterAddrsSize)) == NULL) { 73ceb88c41886e539b890402ea3dfef3528dcf4343tuexen SCTPDBG(SCTP_DEBUG_USR, "Memory allocation error!\n"); 740193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (-1); 750193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 7623273859c39742f09cc5ec7c9bf32ff225661e82tuexen if ((Err = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAdapterAddrs, &AdapterAddrsSize)) != ERROR_SUCCESS) { 77ceb88c41886e539b890402ea3dfef3528dcf4343tuexen SCTPDBG(SCTP_DEBUG_USR, "GetAdaptersAddresses() failed with error code %d\n", Err); 780193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (-1); 790193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 800193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen for (pAdapt = pAdapterAddrs; pAdapt; pAdapt = pAdapt->Next) { 810193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if (pAdapt->IfIndex == if_index) 820193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (pAdapt->Mtu); 830193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 840193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (0); 850193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen} 860193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen 87ceb88c41886e539b890402ea3dfef3528dcf4343tuexenvoid 880193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexengetwintimeofday(struct timeval *tv) 890193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen{ 900193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen struct timeb tb; 910193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen 920193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen ftime(&tb); 930193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen tv->tv_sec = tb.time; 94b33f05d9cf94e2a01563a7022af57810135a8f4bruengeler tv->tv_usec = tb.millitm * 1000; 950193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen} 960193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen 970193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexenint 980193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexenWin_getifaddrs(struct ifaddrs** interfaces) 990193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen{ 1006377430fc6bf9f87402ccef28103c25a684dce20t#if defined(INET) || defined(INET6) 1010193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen DWORD Err, AdapterAddrsSize; 1020193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen int count; 1030193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen PIP_ADAPTER_ADDRESSES pAdapterAddrs, pAdapt; 1040193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen struct ifaddrs *ifa; 1056377430fc6bf9f87402ccef28103c25a684dce20t#endif 10623273859c39742f09cc5ec7c9bf32ff225661e82tuexen#if defined(INET) 1070193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen struct sockaddr_in *addr; 10823273859c39742f09cc5ec7c9bf32ff225661e82tuexen#endif 10923273859c39742f09cc5ec7c9bf32ff225661e82tuexen#if defined(INET6) 11023273859c39742f09cc5ec7c9bf32ff225661e82tuexen struct sockaddr_in6 *addr6; 11123273859c39742f09cc5ec7c9bf32ff225661e82tuexen#endif 1126377430fc6bf9f87402ccef28103c25a684dce20t#if defined(INET) || defined(INET6) 11323273859c39742f09cc5ec7c9bf32ff225661e82tuexen count = 0; 1146377430fc6bf9f87402ccef28103c25a684dce20t#endif 11523273859c39742f09cc5ec7c9bf32ff225661e82tuexen#if defined(INET) 1160193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen AdapterAddrsSize = 0; 1170193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if ((Err = GetAdaptersAddresses(AF_INET, 0, NULL, NULL, &AdapterAddrsSize)) != 0) { 1180193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if ((Err != ERROR_BUFFER_OVERFLOW) && (Err != ERROR_INSUFFICIENT_BUFFER)) { 119ceb88c41886e539b890402ea3dfef3528dcf4343tuexen SCTPDBG(SCTP_DEBUG_USR, "GetAdaptersV4Addresses() sizing failed with error code %d and AdapterAddrsSize = %d\n", Err, AdapterAddrsSize); 1200193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (-1); 1210193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 1220193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 1230193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen /* Allocate memory from sizing information */ 1240193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if ((pAdapterAddrs = (PIP_ADAPTER_ADDRESSES) GlobalAlloc(GPTR, AdapterAddrsSize)) == NULL) { 125ceb88c41886e539b890402ea3dfef3528dcf4343tuexen SCTPDBG(SCTP_DEBUG_USR, "Memory allocation error!\n"); 1260193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (-1); 1270193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 1280193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen /* Get actual adapter information */ 1290193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if ((Err = GetAdaptersAddresses(AF_INET, 0, NULL, pAdapterAddrs, &AdapterAddrsSize)) != ERROR_SUCCESS) { 130ceb88c41886e539b890402ea3dfef3528dcf4343tuexen SCTPDBG(SCTP_DEBUG_USR, "GetAdaptersV4Addresses() failed with error code %d\n", Err); 1310193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (-1); 1320193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 1330193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen /* Enumerate through each returned adapter and save its information */ 13423273859c39742f09cc5ec7c9bf32ff225661e82tuexen for (pAdapt = pAdapterAddrs, count; pAdapt; pAdapt = pAdapt->Next, count++) { 1350193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen addr = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in)); 1360193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen ifa = (struct ifaddrs *)malloc(sizeof(struct ifaddrs)); 1370193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen if ((addr == NULL) || (ifa == NULL)) { 138ceb88c41886e539b890402ea3dfef3528dcf4343tuexen SCTPDBG(SCTP_DEBUG_USR, "Can't allocate memory\n"); 1390193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (-1); 1400193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 1410193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen ifa->ifa_name = strdup(pAdapt->AdapterName); 1420193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen ifa->ifa_flags = pAdapt->Flags; 1430193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen ifa->ifa_addr = (struct sockaddr *)addr; 14403b9c0e3f35b2301d0c462a8a0f9f43f3ccd6d93t memcpy(addr, &pAdapt->FirstUnicastAddress->Address.lpSockaddr, sizeof(struct sockaddr_in)); 1450193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen interfaces[count] = ifa; 1460193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen } 14723273859c39742f09cc5ec7c9bf32ff225661e82tuexen#endif 14823273859c39742f09cc5ec7c9bf32ff225661e82tuexen#if defined(INET6) 14974f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler if (SCTP_BASE_VAR(userspace_rawsctp6) != -1) { 15074f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler AdapterAddrsSize = 0; 15174f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler if ((Err = GetAdaptersAddresses(AF_INET6, 0, NULL, NULL, &AdapterAddrsSize)) != 0) { 15274f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler if ((Err != ERROR_BUFFER_OVERFLOW) && (Err != ERROR_INSUFFICIENT_BUFFER)) { 15374f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler SCTPDBG(SCTP_DEBUG_USR, "GetAdaptersV6Addresses() sizing failed with error code %d AdapterAddrsSize = %d\n", Err, AdapterAddrsSize); 15474f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler return (-1); 15574f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler } 15674f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler } 15774f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler /* Allocate memory from sizing information */ 15874f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler if ((pAdapterAddrs = (PIP_ADAPTER_ADDRESSES) GlobalAlloc(GPTR, AdapterAddrsSize)) == NULL) { 15974f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler SCTPDBG(SCTP_DEBUG_USR, "Memory allocation error!\n"); 16023273859c39742f09cc5ec7c9bf32ff225661e82tuexen return (-1); 16123273859c39742f09cc5ec7c9bf32ff225661e82tuexen } 16274f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler /* Get actual adapter information */ 16374f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler if ((Err = GetAdaptersAddresses(AF_INET6, 0, NULL, pAdapterAddrs, &AdapterAddrsSize)) != ERROR_SUCCESS) { 16474f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler SCTPDBG(SCTP_DEBUG_USR, "GetAdaptersV6Addresses() failed with error code %d\n", Err); 16523273859c39742f09cc5ec7c9bf32ff225661e82tuexen return (-1); 16623273859c39742f09cc5ec7c9bf32ff225661e82tuexen } 16774f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler /* Enumerate through each returned adapter and save its information */ 16874f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler for (pAdapt = pAdapterAddrs, count; pAdapt; pAdapt = pAdapt->Next, count++) { 16974f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler addr6 = (struct sockaddr_in6 *)malloc(sizeof(struct sockaddr_in6)); 17074f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler ifa = (struct ifaddrs *)malloc(sizeof(struct ifaddrs)); 17174f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler if ((addr6 == NULL) || (ifa == NULL)) { 17274f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler SCTPDBG(SCTP_DEBUG_USR, "Can't allocate memory\n"); 17374f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler return (-1); 17474f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler } 17574f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler ifa->ifa_name = strdup(pAdapt->AdapterName); 17674f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler ifa->ifa_flags = pAdapt->Flags; 17774f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler ifa->ifa_addr = (struct sockaddr *)addr6; 17803b9c0e3f35b2301d0c462a8a0f9f43f3ccd6d93t memcpy(addr6, &pAdapt->FirstUnicastAddress->Address.lpSockaddr, sizeof(struct sockaddr_in6)); 17974f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler interfaces[count] = ifa; 18074f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler } 18123273859c39742f09cc5ec7c9bf32ff225661e82tuexen } 18223273859c39742f09cc5ec7c9bf32ff225661e82tuexen#endif 1830193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen return (0); 1840193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen} 1854f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler 1864f97bd6fb3661b00b1e3b99b08812fae0627962cruengelerint 1874f97bd6fb3661b00b1e3b99b08812fae0627962cruengelerwin_if_nametoindex(const char *ifname) 1884f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler{ 1894f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler IP_ADAPTER_ADDRESSES *addresses, *addr; 1904f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler ULONG status, size; 1914f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler int index = 0; 1924f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler 1934f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler if (!ifname) { 1944f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler return 0; 1954f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler } 1964f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler 1974f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler size = 0; 1984f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler status = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size); 1994f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler if (status != ERROR_BUFFER_OVERFLOW) { 2004f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler return 0; 2014f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler } 2024f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler addresses = malloc(size); 2034f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler status = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, addresses, &size); 2044f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler if (status == ERROR_SUCCESS) { 2054f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler for (addr = addresses; addr; addr = addr->Next) { 2064f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler if (addr->AdapterName && !strcmp(ifname, addr->AdapterName)) { 2074f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler index = addr->IfIndex; 2084f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler break; 2094f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler } 2104f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler } 2114f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler } 2124f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler 2134f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler free(addresses); 2144f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler return index; 2154f97bd6fb3661b00b1e3b99b08812fae0627962cruengeler} 216a4442f35c4ce4ced0642c564879fea90322aec95iruengeler 21790a73b0be7df08106d158ca7e59cce3ba4ed740diruengeler#if WINVER < 0x0600 218a4442f35c4ce4ced0642c564879fea90322aec95iruengeler/* These functions are written based on the code at 219a4442f35c4ce4ced0642c564879fea90322aec95iruengeler * http://www.cs.wustl.edu/~schmidt/win32-cv-1.html 22008dbbeb81b60a1853c033852723e1354ee8cba46t * Therefore, for the rest of the file the following applies: 22108dbbeb81b60a1853c033852723e1354ee8cba46t * 22208dbbeb81b60a1853c033852723e1354ee8cba46t * 22308dbbeb81b60a1853c033852723e1354ee8cba46t * Copyright and Licensing Information for ACE(TM), TAO(TM), CIAO(TM), 22408dbbeb81b60a1853c033852723e1354ee8cba46t * DAnCE(TM), and CoSMIC(TM) 22508dbbeb81b60a1853c033852723e1354ee8cba46t * 22608dbbeb81b60a1853c033852723e1354ee8cba46t * [1]ACE(TM), [2]TAO(TM), [3]CIAO(TM), DAnCE(TM), and [4]CoSMIC(TM) 22708dbbeb81b60a1853c033852723e1354ee8cba46t * (henceforth referred to as "DOC software") are copyrighted by 22808dbbeb81b60a1853c033852723e1354ee8cba46t * [5]Douglas C. Schmidt and his [6]research group at [7]Washington 22908dbbeb81b60a1853c033852723e1354ee8cba46t * University, [8]University of California, Irvine, and [9]Vanderbilt 23008dbbeb81b60a1853c033852723e1354ee8cba46t * University, Copyright (c) 1993-2012, all rights reserved. Since DOC 23108dbbeb81b60a1853c033852723e1354ee8cba46t * software is open-source, freely available software, you are free to 23208dbbeb81b60a1853c033852723e1354ee8cba46t * use, modify, copy, and distribute--perpetually and irrevocably--the 23308dbbeb81b60a1853c033852723e1354ee8cba46t * DOC software source code and object code produced from the source, as 23408dbbeb81b60a1853c033852723e1354ee8cba46t * well as copy and distribute modified versions of this software. You 23508dbbeb81b60a1853c033852723e1354ee8cba46t * must, however, include this copyright statement along with any code 23608dbbeb81b60a1853c033852723e1354ee8cba46t * built using DOC software that you release. No copyright statement 23708dbbeb81b60a1853c033852723e1354ee8cba46t * needs to be provided if you just ship binary executables of your 23808dbbeb81b60a1853c033852723e1354ee8cba46t * software products. 23908dbbeb81b60a1853c033852723e1354ee8cba46t * 24008dbbeb81b60a1853c033852723e1354ee8cba46t * You can use DOC software in commercial and/or binary software releases 24108dbbeb81b60a1853c033852723e1354ee8cba46t * and are under no obligation to redistribute any of your source code 24208dbbeb81b60a1853c033852723e1354ee8cba46t * that is built using DOC software. Note, however, that you may not 24308dbbeb81b60a1853c033852723e1354ee8cba46t * misappropriate the DOC software code, such as copyrighting it yourself 24408dbbeb81b60a1853c033852723e1354ee8cba46t * or claiming authorship of the DOC software code, in a way that will 24508dbbeb81b60a1853c033852723e1354ee8cba46t * prevent DOC software from being distributed freely using an 24608dbbeb81b60a1853c033852723e1354ee8cba46t * open-source development model. You needn't inform anyone that you're 24708dbbeb81b60a1853c033852723e1354ee8cba46t * using DOC software in your software, though we encourage you to let 24808dbbeb81b60a1853c033852723e1354ee8cba46t * [10]us know so we can promote your project in the [11]DOC software 24908dbbeb81b60a1853c033852723e1354ee8cba46t * success stories. 25008dbbeb81b60a1853c033852723e1354ee8cba46t * 25108dbbeb81b60a1853c033852723e1354ee8cba46t * The [12]ACE, [13]TAO, [14]CIAO, [15]DAnCE, and [16]CoSMIC web sites 25208dbbeb81b60a1853c033852723e1354ee8cba46t * are maintained by the [17]DOC Group at the [18]Institute for Software 25308dbbeb81b60a1853c033852723e1354ee8cba46t * Integrated Systems (ISIS) and the [19]Center for Distributed Object 25408dbbeb81b60a1853c033852723e1354ee8cba46t * Computing of Washington University, St. Louis for the development of 25508dbbeb81b60a1853c033852723e1354ee8cba46t * open-source software as part of the open-source software community. 25608dbbeb81b60a1853c033852723e1354ee8cba46t * Submissions are provided by the submitter ``as is'' with no warranties 25708dbbeb81b60a1853c033852723e1354ee8cba46t * whatsoever, including any warranty of merchantability, noninfringement 25808dbbeb81b60a1853c033852723e1354ee8cba46t * of third party intellectual property, or fitness for any particular 25908dbbeb81b60a1853c033852723e1354ee8cba46t * purpose. In no event shall the submitter be liable for any direct, 26008dbbeb81b60a1853c033852723e1354ee8cba46t * indirect, special, exemplary, punitive, or consequential damages, 26108dbbeb81b60a1853c033852723e1354ee8cba46t * including without limitation, lost profits, even if advised of the 26208dbbeb81b60a1853c033852723e1354ee8cba46t * possibility of such damages. Likewise, DOC software is provided as is 26308dbbeb81b60a1853c033852723e1354ee8cba46t * with no warranties of any kind, including the warranties of design, 26408dbbeb81b60a1853c033852723e1354ee8cba46t * merchantability, and fitness for a particular purpose, 26508dbbeb81b60a1853c033852723e1354ee8cba46t * noninfringement, or arising from a course of dealing, usage or trade 26608dbbeb81b60a1853c033852723e1354ee8cba46t * practice. Washington University, UC Irvine, Vanderbilt University, 26708dbbeb81b60a1853c033852723e1354ee8cba46t * their employees, and students shall have no liability with respect to 26808dbbeb81b60a1853c033852723e1354ee8cba46t * the infringement of copyrights, trade secrets or any patents by DOC 26908dbbeb81b60a1853c033852723e1354ee8cba46t * software or any part thereof. Moreover, in no event will Washington 27008dbbeb81b60a1853c033852723e1354ee8cba46t * University, UC Irvine, or Vanderbilt University, their employees, or 27108dbbeb81b60a1853c033852723e1354ee8cba46t * students be liable for any lost revenue or profits or other special, 27208dbbeb81b60a1853c033852723e1354ee8cba46t * indirect and consequential damages. 27308dbbeb81b60a1853c033852723e1354ee8cba46t * 27408dbbeb81b60a1853c033852723e1354ee8cba46t * DOC software is provided with no support and without any obligation on 27508dbbeb81b60a1853c033852723e1354ee8cba46t * the part of Washington University, UC Irvine, Vanderbilt University, 27608dbbeb81b60a1853c033852723e1354ee8cba46t * their employees, or students to assist in its use, correction, 27708dbbeb81b60a1853c033852723e1354ee8cba46t * modification, or enhancement. A [20]number of companies around the 27808dbbeb81b60a1853c033852723e1354ee8cba46t * world provide commercial support for DOC software, however. DOC 27908dbbeb81b60a1853c033852723e1354ee8cba46t * software is Y2K-compliant, as long as the underlying OS platform is 28008dbbeb81b60a1853c033852723e1354ee8cba46t * Y2K-compliant. Likewise, DOC software is compliant with the new US 28108dbbeb81b60a1853c033852723e1354ee8cba46t * daylight savings rule passed by Congress as "The Energy Policy Act of 28208dbbeb81b60a1853c033852723e1354ee8cba46t * 2005," which established new daylight savings times (DST) rules for 28308dbbeb81b60a1853c033852723e1354ee8cba46t * the United States that expand DST as of March 2007. Since DOC software 28408dbbeb81b60a1853c033852723e1354ee8cba46t * obtains time/date and calendaring information from operating systems 28508dbbeb81b60a1853c033852723e1354ee8cba46t * users will not be affected by the new DST rules as long as they 28608dbbeb81b60a1853c033852723e1354ee8cba46t * upgrade their operating systems accordingly. 28708dbbeb81b60a1853c033852723e1354ee8cba46t * 28808dbbeb81b60a1853c033852723e1354ee8cba46t * The names ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM), CoSMIC(TM), 28908dbbeb81b60a1853c033852723e1354ee8cba46t * Washington University, UC Irvine, and Vanderbilt University, may not 29008dbbeb81b60a1853c033852723e1354ee8cba46t * be used to endorse or promote products or services derived from this 29108dbbeb81b60a1853c033852723e1354ee8cba46t * source without express written permission from Washington University, 29208dbbeb81b60a1853c033852723e1354ee8cba46t * UC Irvine, or Vanderbilt University. This license grants no permission 29308dbbeb81b60a1853c033852723e1354ee8cba46t * to call products or services derived from this source ACE(TM), 29408dbbeb81b60a1853c033852723e1354ee8cba46t * TAO(TM), CIAO(TM), DAnCE(TM), or CoSMIC(TM), nor does it grant 29508dbbeb81b60a1853c033852723e1354ee8cba46t * permission for the name Washington University, UC Irvine, or 29608dbbeb81b60a1853c033852723e1354ee8cba46t * Vanderbilt University to appear in their names. 29708dbbeb81b60a1853c033852723e1354ee8cba46t * 29808dbbeb81b60a1853c033852723e1354ee8cba46t * If you have any suggestions, additions, comments, or questions, please 29908dbbeb81b60a1853c033852723e1354ee8cba46t * let [21]me know. 30008dbbeb81b60a1853c033852723e1354ee8cba46t * 30108dbbeb81b60a1853c033852723e1354ee8cba46t * [22]Douglas C. Schmidt 30208dbbeb81b60a1853c033852723e1354ee8cba46t * 30308dbbeb81b60a1853c033852723e1354ee8cba46t * References 30408dbbeb81b60a1853c033852723e1354ee8cba46t * 30508dbbeb81b60a1853c033852723e1354ee8cba46t * 1. http://www.cs.wustl.edu/~schmidt/ACE.html 30608dbbeb81b60a1853c033852723e1354ee8cba46t * 2. http://www.cs.wustl.edu/~schmidt/TAO.html 30708dbbeb81b60a1853c033852723e1354ee8cba46t * 3. http://www.dre.vanderbilt.edu/CIAO/ 30808dbbeb81b60a1853c033852723e1354ee8cba46t * 4. http://www.dre.vanderbilt.edu/cosmic/ 30908dbbeb81b60a1853c033852723e1354ee8cba46t * 5. http://www.dre.vanderbilt.edu/~schmidt/ 31008dbbeb81b60a1853c033852723e1354ee8cba46t * 6. http://www.cs.wustl.edu/~schmidt/ACE-members.html 31108dbbeb81b60a1853c033852723e1354ee8cba46t * 7. http://www.wustl.edu/ 31208dbbeb81b60a1853c033852723e1354ee8cba46t * 8. http://www.uci.edu/ 31308dbbeb81b60a1853c033852723e1354ee8cba46t * 9. http://www.vanderbilt.edu/ 31408dbbeb81b60a1853c033852723e1354ee8cba46t * 10. mailto:doc_group@cs.wustl.edu 31508dbbeb81b60a1853c033852723e1354ee8cba46t * 11. http://www.cs.wustl.edu/~schmidt/ACE-users.html 31608dbbeb81b60a1853c033852723e1354ee8cba46t * 12. http://www.cs.wustl.edu/~schmidt/ACE.html 31708dbbeb81b60a1853c033852723e1354ee8cba46t * 13. http://www.cs.wustl.edu/~schmidt/TAO.html 31808dbbeb81b60a1853c033852723e1354ee8cba46t * 14. http://www.dre.vanderbilt.edu/CIAO/ 31908dbbeb81b60a1853c033852723e1354ee8cba46t * 15. http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/DAnCE/ 32008dbbeb81b60a1853c033852723e1354ee8cba46t * 16. http://www.dre.vanderbilt.edu/cosmic/ 32108dbbeb81b60a1853c033852723e1354ee8cba46t * 17. http://www.dre.vanderbilt.edu/ 32208dbbeb81b60a1853c033852723e1354ee8cba46t * 18. http://www.isis.vanderbilt.edu/ 32308dbbeb81b60a1853c033852723e1354ee8cba46t * 19. http://www.cs.wustl.edu/~schmidt/doc-center.html 32408dbbeb81b60a1853c033852723e1354ee8cba46t * 20. http://www.cs.wustl.edu/~schmidt/commercial-support.html 32508dbbeb81b60a1853c033852723e1354ee8cba46t * 21. mailto:d.schmidt@vanderbilt.edu 32608dbbeb81b60a1853c033852723e1354ee8cba46t * 22. http://www.dre.vanderbilt.edu/~schmidt/ 32708dbbeb81b60a1853c033852723e1354ee8cba46t * 23. http://www.cs.wustl.edu/ACE.html 328a4442f35c4ce4ced0642c564879fea90322aec95iruengeler */ 32908dbbeb81b60a1853c033852723e1354ee8cba46t 330a4442f35c4ce4ced0642c564879fea90322aec95iruengelervoid 331a4442f35c4ce4ced0642c564879fea90322aec95iruengelerInitializeXPConditionVariable(userland_cond_t *cv) 332a4442f35c4ce4ced0642c564879fea90322aec95iruengeler{ 333a4442f35c4ce4ced0642c564879fea90322aec95iruengeler cv->waiters_count = 0; 334a4442f35c4ce4ced0642c564879fea90322aec95iruengeler InitializeCriticalSection(&(cv->waiters_count_lock)); 335a4442f35c4ce4ced0642c564879fea90322aec95iruengeler cv->events_[C_SIGNAL] = CreateEvent (NULL, FALSE, FALSE, NULL); 336a4442f35c4ce4ced0642c564879fea90322aec95iruengeler cv->events_[C_BROADCAST] = CreateEvent (NULL, TRUE, FALSE, NULL); 337a4442f35c4ce4ced0642c564879fea90322aec95iruengeler} 338a4442f35c4ce4ced0642c564879fea90322aec95iruengeler 3396c804e779f60cdeb134e6a35149e80955286768etvoid 3406c804e779f60cdeb134e6a35149e80955286768etDeleteXPConditionVariable(userland_cond_t *cv) 3416c804e779f60cdeb134e6a35149e80955286768et{ 3426c804e779f60cdeb134e6a35149e80955286768et CloseHandle(cv->events_[C_BROADCAST]); 3436c804e779f60cdeb134e6a35149e80955286768et CloseHandle(cv->events_[C_SIGNAL]); 3446c804e779f60cdeb134e6a35149e80955286768et DeleteCriticalSection(&(cv->waiters_count_lock)); 3456c804e779f60cdeb134e6a35149e80955286768et} 3466c804e779f60cdeb134e6a35149e80955286768et 347a4442f35c4ce4ced0642c564879fea90322aec95iruengelerint 348a4442f35c4ce4ced0642c564879fea90322aec95iruengelerSleepXPConditionVariable(userland_cond_t *cv, userland_mutex_t *mtx) 349a4442f35c4ce4ced0642c564879fea90322aec95iruengeler{ 350a4442f35c4ce4ced0642c564879fea90322aec95iruengeler int result, last_waiter; 351a4442f35c4ce4ced0642c564879fea90322aec95iruengeler 352a4442f35c4ce4ced0642c564879fea90322aec95iruengeler EnterCriticalSection(&cv->waiters_count_lock); 353a4442f35c4ce4ced0642c564879fea90322aec95iruengeler cv->waiters_count++; 354a4442f35c4ce4ced0642c564879fea90322aec95iruengeler LeaveCriticalSection(&cv->waiters_count_lock); 355a4442f35c4ce4ced0642c564879fea90322aec95iruengeler LeaveCriticalSection (mtx); 356a4442f35c4ce4ced0642c564879fea90322aec95iruengeler result = WaitForMultipleObjects(2, cv->events_, FALSE, INFINITE); 357a4442f35c4ce4ced0642c564879fea90322aec95iruengeler if (result==-1) { 358a4442f35c4ce4ced0642c564879fea90322aec95iruengeler result = GetLastError(); 359a4442f35c4ce4ced0642c564879fea90322aec95iruengeler } 360a4442f35c4ce4ced0642c564879fea90322aec95iruengeler EnterCriticalSection(&cv->waiters_count_lock); 361a4442f35c4ce4ced0642c564879fea90322aec95iruengeler cv->waiters_count--; 362a4442f35c4ce4ced0642c564879fea90322aec95iruengeler last_waiter = 363a4442f35c4ce4ced0642c564879fea90322aec95iruengeler result == (C_SIGNAL + C_BROADCAST && (cv->waiters_count == 0)); 364a4442f35c4ce4ced0642c564879fea90322aec95iruengeler LeaveCriticalSection(&cv->waiters_count_lock); 365a4442f35c4ce4ced0642c564879fea90322aec95iruengeler if (last_waiter) 366a4442f35c4ce4ced0642c564879fea90322aec95iruengeler ResetEvent(cv->events_[C_BROADCAST]); 367a4442f35c4ce4ced0642c564879fea90322aec95iruengeler EnterCriticalSection (mtx); 368a4442f35c4ce4ced0642c564879fea90322aec95iruengeler return result; 369a4442f35c4ce4ced0642c564879fea90322aec95iruengeler} 370a4442f35c4ce4ced0642c564879fea90322aec95iruengeler 371a4442f35c4ce4ced0642c564879fea90322aec95iruengelervoid 372a4442f35c4ce4ced0642c564879fea90322aec95iruengelerWakeAllXPConditionVariable(userland_cond_t *cv) 373a4442f35c4ce4ced0642c564879fea90322aec95iruengeler{ 374a4442f35c4ce4ced0642c564879fea90322aec95iruengeler int have_waiters; 375a4442f35c4ce4ced0642c564879fea90322aec95iruengeler EnterCriticalSection(&cv->waiters_count_lock); 376a4442f35c4ce4ced0642c564879fea90322aec95iruengeler have_waiters = cv->waiters_count > 0; 377a4442f35c4ce4ced0642c564879fea90322aec95iruengeler LeaveCriticalSection(&cv->waiters_count_lock); 378a4442f35c4ce4ced0642c564879fea90322aec95iruengeler if (have_waiters) 379a4442f35c4ce4ced0642c564879fea90322aec95iruengeler SetEvent (cv->events_[C_BROADCAST]); 380a4442f35c4ce4ced0642c564879fea90322aec95iruengeler} 381a4442f35c4ce4ced0642c564879fea90322aec95iruengeler#endif 3820193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen#endif 383