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;
1440193f57e8e1f9ec2711104e85815fe43a6e5e5adtuexen		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;
17874f15c7c217bab653c67d0b891c6f3e3f04a3dddiruengeler			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