17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*- 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Copyright (c) 2006-2007, by Cisco Systems, Inc. All rights reserved. 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Copyright (c) 2008-2011, by Brad Penoff. All rights reserved. 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * modification, are permitted provided that the following conditions are met: 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * a) Redistributions of source code must retain the above copyright notice, 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * this list of conditions and the following disclaimer. 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * b) Redistributions in binary form must reproduce the above copyright 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * the documentation and/or other materials provided with the distribution. 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * c) Neither the name of Cisco Systems, Inc. nor the names of its 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * contributors may be used to endorse or promote products derived 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * from this software without specific prior written permission. 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE. 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef __sctp_os_userspace_h__ 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define __sctp_os_userspace_h__ 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Userspace includes 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * All the opt_xxx.h files are placed in the kernel build directory. 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * We will place them in userspace stack build directory. 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <errno.h> 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_Windows) 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <winsock2.h> 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <ws2tcpip.h> 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <iphlpapi.h> 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <Mswsock.h> 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <Windows.h> 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "user_environment.h" 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef CRITICAL_SECTION userland_mutex_t; 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if WINVER < 0x0600 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)enum { 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) C_SIGNAL = 0, 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) C_BROADCAST = 1, 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) C_MAX_EVENTS = 2 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef struct 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){ 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_int waiters_count; 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CRITICAL_SECTION waiters_count_lock; 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) HANDLE events_[C_MAX_EVENTS]; 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} userland_cond_t; 643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid InitializeXPConditionVariable(userland_cond_t *); 653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid DeleteXPConditionVariable(userland_cond_t *); 663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochint SleepXPConditionVariable(userland_cond_t *, userland_mutex_t *); 673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WakeAllXPConditionVariable(userland_cond_t *); 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define InitializeConditionVariable(cond) InitializeXPConditionVariable(cond) 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define DeleteConditionVariable(cond) DeleteXPConditionVariable(cond) 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SleepConditionVariableCS(cond, mtx, time) SleepXPConditionVariable(cond, mtx) 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define WakeAllConditionVariable(cond) WakeAllXPConditionVariable(cond) 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define DeleteConditionVariable(cond) 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef CONDITION_VARIABLE userland_cond_t; 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef HANDLE userland_thread_t; 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ADDRESS_FAMILY unsigned __int8 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IPVERSION 4 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAXTTL 255 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define uint64_t unsigned __int64 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define u_long unsigned __int64 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define u_int unsigned __int32 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define uint32_t unsigned __int32 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define u_int32_t unsigned __int32 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define int32_t __int32 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define int16_t __int16 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define uint16_t unsigned __int16 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define u_int16_t unsigned __int16 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define uint8_t unsigned __int8 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define u_int8_t unsigned __int8 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define int8_t __int8 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define u_char unsigned char 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define n_short unsigned __int16 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define u_short unsigned __int16 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ssize_t __int64 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define size_t __int32 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define in_addr_t unsigned __int32 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define in_port_t unsigned __int16 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define n_time unsigned __int32 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define sa_family_t unsigned __int8 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IFNAMSIZ 64 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define __func__ __FUNCTION__ 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EWOULDBLOCK 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EWOULDBLOCK WSAEWOULDBLOCK 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EINPROGRESS 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EINPROGRESS WSAEINPROGRESS 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EALREADY 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EALREADY WSAEALREADY 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ENOTSOCK 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ENOTSOCK WSAENOTSOCK 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EDESTADDRREQ 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EDESTADDRREQ WSAEDESTADDRREQ 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EMSGSIZE 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EMSGSIZE WSAEMSGSIZE 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EPROTOTYPE 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EPROTOTYPE WSAEPROTOTYPE 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ENOPROTOOPT 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ENOPROTOOPT WSAENOPROTOOPT 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EPROTONOSUPPORT 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EPROTONOSUPPORT WSAEPROTONOSUPPORT 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ESOCKTNOSUPPORT 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EOPNOTSUPP 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EOPNOTSUPP WSAEOPNOTSUPP 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ENOTSUP 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ENOTSUP WSAEOPNOTSUPP 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EPFNOSUPPORT 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EPFNOSUPPORT WSAEPFNOSUPPORT 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EAFNOSUPPORT 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EAFNOSUPPORT WSAEAFNOSUPPORT 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EADDRINUSE 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EADDRINUSE WSAEADDRINUSE 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EADDRNOTAVAIL 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EADDRNOTAVAIL WSAEADDRNOTAVAIL 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ENETDOWN 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ENETDOWN WSAENETDOWN 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ENETUNREACH 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ENETUNREACH WSAENETUNREACH 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ENETRESET 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ENETRESET WSAENETRESET 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ECONNABORTED 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ECONNABORTED WSAECONNABORTED 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ECONNRESET 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ECONNRESET WSAECONNRESET 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ENOBUFS 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ENOBUFS WSAENOBUFS 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EISCONN 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EISCONN WSAEISCONN 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ENOTCONN 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ENOTCONN WSAENOTCONN 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ESHUTDOWN 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ESHUTDOWN WSAESHUTDOWN 1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ETOOMANYREFS 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ETOOMANYREFS WSAETOOMANYREFS 1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ETIMEDOUT 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ETIMEDOUT WSAETIMEDOUT 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ECONNREFUSED 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ECONNREFUSED WSAECONNREFUSED 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ELOOP 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ELOOP WSAELOOP 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EHOSTDOWN 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EHOSTDOWN WSAEHOSTDOWN 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EHOSTUNREACH 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EHOSTUNREACH WSAEHOSTUNREACH 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EPROCLIM 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EPROCLIM WSAEPROCLIM 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EUSERS 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EUSERS WSAEUSERS 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EDQUOT 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EDQUOT WSAEDQUOT 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ESTALE 2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ESTALE WSAESTALE 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef EREMOTE 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define EREMOTE WSAEREMOTE 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef char* caddr_t; 2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochint Win_getifaddrs(struct ifaddrs**); 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define getifaddrs(interfaces) (int)Win_getifaddrs(interfaces) 2173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochint win_if_nametoindex(const char *); 2183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#define if_nametoindex(x) win_if_nametoindex(x) 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define bzero(buf, len) memset(buf, 0, len) 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define bcopy(srcKey, dstKey, len) memcpy(dstKey, srcKey, len) 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define snprintf(data, size, format, name) _snprintf_s(data, size, _TRUNCATE, format, name) 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define inline __inline 2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define __inline__ __inline 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define random() rand() 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define srandom(s) srand(s) 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MSG_EOR 0x8 /* data completes record */ 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef CMSG_DATA 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#undef CMSG_DATA 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CMSG_DATA(x) WSA_CMSG_DATA(x) 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CMSG_ALIGN(x) WSA_CMSGDATA_ALIGN(x) 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if WINVER < 0x0600 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CMSG_FIRSTHDR(x) WSA_CMSG_FIRSTHDR(x) 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CMSG_NXTHDR(x, y) WSA_CMSG_NXTHDR(x, y) 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CMSG_SPACE(x) WSA_CMSG_SPACE(x) 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CMSG_LEN(x) WSA_CMSG_LEN(x) 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/**** from sctp_os_windows.h ***************/ 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IFN_IS_IFT_LOOP(ifn) ((ifn)->ifn_type == IFT_LOOP) 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ROUTE_IS_REAL_LOOP(ro) ((ro)->ro_rt && (ro)->ro_rt->rt_ifa && (ro)->ro_rt->rt_ifa->ifa_ifp && (ro)->ro_rt->rt_ifa->ifa_ifp->if_type == IFT_LOOP) 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Access to IFN's to help with src-addr-selection 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* This could return VOID if the index works but for BSD we provide both. */ 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GET_IFN_VOID_FROM_ROUTE(ro) \ 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ((ro)->ro_rt != NULL ? (ro)->ro_rt->rt_ifp : NULL) 2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ROUTE_HAS_VALID_IFN(ro) \ 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ((ro)->ro_rt && (ro)->ro_rt->rt_ifp) 2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/******************************************/ 2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GET_IF_INDEX_FROM_ROUTE(ro) 1 /* compiles... TODO use routing socket to determine */ 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define timeradd(tvp, uvp, vvp) \ 2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) do { \ 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((vvp)->tv_usec >= 1000000) { \ 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (vvp)->tv_sec++; \ 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (vvp)->tv_usec -= 1000000; \ 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } \ 2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while (0) 2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define timersub(tvp, uvp, vvp) \ 2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) do { \ 2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((vvp)->tv_usec < 0) { \ 2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (vvp)->tv_sec--; \ 2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (vvp)->tv_usec += 1000000; \ 2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } \ 2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while (0) 2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define BIG_ENDIAN 1 2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define LITTLE_ENDIAN 0 2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef WORDS_BIGENDIAN 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define BYTE_ORDER BIG_ENDIAN 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define BYTE_ORDER LITTLE_ENDIAN 2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct iovec { 2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ULONG len; 2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHAR FAR *buf; 2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define iov_base buf 2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define iov_len len 2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct ifa_msghdr { 2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned __int16 ifam_msglen; 2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned char ifam_version; 2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned char ifam_type; 2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) __int32 ifam_addrs; 2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) __int32 ifam_flags; 3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned __int16 ifam_index; 3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) __int32 ifam_metric; 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct ifdevmtu { 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifdm_current; 3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifdm_min; 3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifdm_max; 3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct ifkpi { 3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned int ifk_module_id; 3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned int ifk_type; 3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) union { 3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void *ifk_ptr; 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifk_value; 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } ifk_data; 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct ifreq { 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) char ifr_name[16]; 3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) union { 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct sockaddr ifru_addr; 3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct sockaddr ifru_dstaddr; 3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct sockaddr ifru_broadaddr; 3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) short ifru_flags; 3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifru_metric; 3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifru_mtu; 3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifru_phys; 3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifru_media; 3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int ifru_intval; 3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) char* ifru_data; 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct ifdevmtu ifru_devmtu; 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct ifkpi ifru_kpi; 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned __int32 ifru_wake_flags; 3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } ifr_ifru; 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_addr ifr_ifru.ifru_addr 3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_dstaddr ifr_ifru.ifru_dstaddr 3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_broadaddr ifr_ifru.ifru_broadaddr 3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_flags ifr_ifru.ifru_flags[0] 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_prevflags ifr_ifru.ifru_flags[1] 3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_metric ifr_ifru.ifru_metric 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_mtu ifr_ifru.ifru_mtu 3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_phys ifr_ifru.ifru_phys 3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_media ifr_ifru.ifru_media 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_data ifr_ifru.ifru_data 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_devmtu ifr_ifru.ifru_devmtu 3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_intval ifr_ifru.ifru_intval 3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_kpi ifr_ifru.ifru_kpi 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ifr_wake_flags ifr_ifru.ifru_wake_flags 3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*#include <packon.h> 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#pragma pack(push, 1)*/ 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct ip { 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_char ip_hl:4, ip_v:4; 3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_char ip_tos; 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_short ip_len; 3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_short ip_id; 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_short ip_off; 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IP_RP 0x8000 3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IP_DF 0x4000 3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IP_MF 0x2000 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IP_OFFMASK 0x1fff 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_char ip_ttl; 3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_char ip_p; 3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_short ip_sum; 3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct in_addr ip_src, ip_dst; 3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct ifaddrs { 3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct ifaddrs *ifa_next; 3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) char *ifa_name; 3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned int ifa_flags; 3747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct sockaddr *ifa_addr; 3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct sockaddr *ifa_netmask; 3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct sockaddr *ifa_dstaddr; 3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void *ifa_data; 3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct udphdr { 3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned __int16 uh_sport; 3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned __int16 uh_dport; 3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned __int16 uh_ulen; 3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) unsigned __int16 uh_sum; 3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else /* !defined(Userspace_os_Windows) */ 3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/cdefs.h> /* needed? added from old __FreeBSD__ */ 3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/socket.h> 3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_OpenBSD) 3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <pthread.h> 3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef pthread_mutex_t userland_mutex_t; 3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef pthread_cond_t userland_cond_t; 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef pthread_t userland_thread_t; 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define mtx_lock(arg1) 3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define mtx_unlock(arg1) 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define mtx_assert(arg1,arg2) 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MA_OWNED 7 /* sys/mutex.h typically on FreeBSD */ 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__Userspace_os_FreeBSD) 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct mtx {int dummy;}; 4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct selinfo {int dummy;}; 4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct sx {int dummy;}; 4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <stdio.h> 4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string.h> 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/param.h> in FreeBSD defines MSIZE */ 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/ktr.h> */ 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/systm.h> */ 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_Windows) 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <user_queue.h> 4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/queue.h> 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include <user_malloc.h> 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/kernel.h> */ 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/sysctl.h> */ 4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/protosw.h> */ 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* on FreeBSD, this results in a redefintion of SOCK(BUF)_(UN)LOCK and 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * uknown type of struct mtx for sb_mtx in struct sockbuf */ 4243240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "user_socketvar.h" /* MALLOC_DECLARE's M_PCB. Replacement for sys/socketvar.h */ 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/jail.h> */ 4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/sysctl.h> */ 4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <user_environment.h> 4283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include <user_atomic.h> 4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <user_mbuf.h> 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/uio.h> */ 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/lock.h> */ 4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__FreeBSD__) && __FreeBSD_version > 602000 4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/rwlock.h> 4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/kthread.h> */ 4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__FreeBSD__) && __FreeBSD_version > 602000 4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/priv.h> 4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/random.h> */ 4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <sys/limits.h> */ 4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <machine/cpu.h> */ 4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_Darwin) 4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* was a 0 byte file. needed for structs if_data(64) and net_event_data */ 4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <net/if_var.h> 4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_FreeBSD) 4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <net/if_types.h> 4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <net/if_var.h> was a 0 byte file. causes struct mtx redefinition */ 4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* OOTB only - dummy route used at the moment. should we port route to 4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * userspace as well? */ 4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* on FreeBSD, this results in a redefintion of struct route */ 4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <net/route.h> */ 4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__Userspace_os_Windows) 4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <net/if.h> 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/in.h> 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/in_systm.h> 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/ip.h> 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/ip_icmp.h> 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <user_ip_icmp.h> 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <netinet/in_pcb.h> ported to userspace */ 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <user_inpcb.h> 4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* for getifaddrs */ 4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/types.h> 4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__Userspace_os_Windows) 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <ifaddrs.h> 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* for ioctl */ 4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/ioctl.h> 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* for close, etc. */ 4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <unistd.h> 4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* lots of errno's used and needed in userspace */ 4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* for offsetof */ 4827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <stddef.h> 4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(SCTP_PROCESS_LEVEL_LOCKS) && !defined(__Userspace_os_Windows) 4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* for pthread_mutex_lock, pthread_mutex_unlock, etc. */ 4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <pthread.h> 4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef IPSEC 4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netipsec/ipsec.h> 4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netipsec/key.h> 4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif /* IPSEC */ 4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef INET6 4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_FreeBSD) 4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/domain.h> 4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef IPSEC 4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netipsec/ipsec6.h> 5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__Userspace_os_Windows) 5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/ip6.h> 5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/icmp6.h> 5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_Linux) || defined(__Userspace_os_Darwin) || defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_OpenBSD) ||defined(__Userspace_os_Windows) 5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "user_ip6_var.h" 5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 5087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet6/ip6_var.h> 5097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_FreeBSD) 5117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet6/in6_pcb.h> 5127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet6/ip6protosw.h> 5137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #include <netinet6/nd6.h> was a 0 byte file */ 5147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet6/scope6_var.h> 5157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif /* INET6 */ 5177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(HAVE_SCTP_PEELOFF_SOCKOPT) 5197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/file.h> 5207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/filedesc.h> 5217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if __FreeBSD_version >= 700000 5247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/ip_options.h> 5257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_PRINTF(...) \ 5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (SCTP_BASE_VAR(debug_printf)) { \ 5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SCTP_BASE_VAR(debug_printf)(__VA_ARGS__); \ 5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__FreeBSD__) 5337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef in6pcb 5347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define in6pcb inpcb 5357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Declare all the malloc names for all the various mallocs */ 5387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_MAP); 5397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_STRMI); 5407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_STRMO); 5417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_ASC_ADDR); 5427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_ASC_IT); 5437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_AUTH_CL); 5447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_AUTH_KY); 5457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_AUTH_HL); 5467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_AUTH_IF); 5477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_STRESET); 5487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_CMSG); 5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_COPYAL); 5507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_VRF); 5517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_IFA); 5527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_IFN); 5537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_TIMW); 5547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_MVRF); 5557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_ITER); 5567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)MALLOC_DECLARE(SCTP_M_SOCKOPT); 5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(SCTP_LOCAL_TRACE_BUF) 5597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GET_CYCLECOUNT get_cyclecount() 5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_CTR6 sctp_log_trace 5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 5647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_CTR6 CTR6 5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Empty ktr statement for _Userspace__ (similar to what is done for mac) */ 5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CTR6(m, d, p1, p2, p3, p4, p5, p6) 5697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BASE_INFO(__m) system_base_info.sctppcbinfo.__m 5737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BASE_STATS system_base_info.sctpstat 5747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BASE_STAT(__m) system_base_info.sctpstat.__m 5757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BASE_SYSCTL(__m) system_base_info.sctpsysctl.__m 5767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BASE_VAR(__m) system_base_info.__m 5777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * 5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 5817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__Userspace_os_Darwin) 5827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define USER_ADDR_NULL (NULL) /* FIX ME: temp */ 5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(SCTP_DEBUG) 5867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/sctp_constants.h> 5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTPDBG(level, ...) \ 5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){ \ 5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) do { \ 5907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (SCTP_BASE_SYSCTL(sctp_debug_on) & level) { \ 5917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SCTP_PRINTF(__VA_ARGS__); \ 5927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } \ 5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while (0); \ 5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTPDBG_ADDR(level, addr) \ 5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){ \ 5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) do { \ 5987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (SCTP_BASE_SYSCTL(sctp_debug_on) & level ) { \ 5997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) sctp_print_address(addr); \ 6007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } \ 6017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while (0); \ 6027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 6047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTPDBG(level, ...) 6057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTPDBG_ADDR(level, addr) 6067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 6077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef SCTP_LTRACE_CHUNKS 6097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_LTRACE_CHK(a, b, c, d) if(sctp_logging_level & SCTP_LTRACE_CHUNK_ENABLE) CTR6(KTR_SUBSYS, "SCTP:%d[%d]:%x-%x-%x-%x", SCTP_LOG_CHUNK_PROC, 0, a, b, c, d) 6107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 6117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_LTRACE_CHK(a, b, c, d) 6127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef SCTP_LTRACE_ERRORS 6157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, file, err) \ 6167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (sctp_logging_level & SCTP_LTRACE_ERROR_ENABLE) \ 6177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SCTP_PRINTF("mbuf:%p inp:%p stcb:%p net:%p file:%x line:%d error:%d\n", \ 6187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (void *)m, (void *)inp, (void *)stcb, (void *)net, file, __LINE__, err); 6197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err) \ 6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (sctp_logging_level & SCTP_LTRACE_ERROR_ENABLE) \ 6217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SCTP_PRINTF("inp:%p stcb:%p net:%p file:%x line:%d error:%d\n", \ 6227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (void *)inp, (void *)stcb, (void *)net, file, __LINE__, err); 6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 6247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, file, err) 6257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err) 6267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 6277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 6307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Local address and interface list handling 6317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_MAX_VRF_ID 0 6337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SIZE_OF_VRF_HASH 3 6347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IFNAMSIZ IFNAMSIZ 6357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_DEFAULT_VRFID 0 6367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_VRF_ADDR_HASH_SIZE 16 6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_VRF_IFN_HASH_SIZE 3 6387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_INIT_VRF_TABLEID(vrf) 6397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__Userspace_os_Windows) 6417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IFN_IS_IFT_LOOP(ifn) (strncmp((ifn)->ifn_name, "lo", 2) == 0) 6427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* BSD definition */ 6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #define SCTP_ROUTE_IS_REAL_LOOP(ro) ((ro)->ro_rt && (ro)->ro_rt->rt_ifa && (ro)->ro_rt->rt_ifa->ifa_ifp && (ro)->ro_rt->rt_ifa->ifa_ifp->if_type == IFT_LOOP) */ 6447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* only used in IPv6 scenario, which isn't supported yet */ 6457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ROUTE_IS_REAL_LOOP(ro) 0 6467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 6487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Access to IFN's to help with src-addr-selection 6497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 6507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* This could return VOID if the index works but for BSD we provide both. */ 6517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GET_IFN_VOID_FROM_ROUTE(ro) (void *)ro->ro_rt->rt_ifp 6527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GET_IF_INDEX_FROM_ROUTE(ro) 1 /* compiles... TODO use routing socket to determine */ 6537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ROUTE_HAS_VALID_IFN(ro) ((ro)->ro_rt && (ro)->ro_rt->rt_ifp) 6547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 6557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 6577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * general memory allocation 6587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 6597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_MALLOC(var, type, size, name) \ 6607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) do { \ 6617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MALLOC(var, type, size, name, M_NOWAIT); \ 6627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while (0) 6637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_FREE(var, type) FREE(var, type) 6657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_MALLOC_SONAME(var, type, size) \ 6677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) do { \ 6687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MALLOC(var, type, size, M_SONAME, (M_WAITOK | M_ZERO)); \ 6697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while (0) 6707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_FREE_SONAME(var) FREE(var, M_SONAME) 6727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_PROCESS_STRUCT struct proc * 6747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 6767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * zone allocation functions 6777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 6787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(SCTP_SIMPLE_ALLOCATOR) 6817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*typedef size_t sctp_zone_t;*/ 6827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZONE_INIT(zone, name, size, number) { \ 6837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) zone = size; \ 6847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* __Userspace__ SCTP_ZONE_GET: allocate element from the zone */ 6877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZONE_GET(zone, type) \ 6887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (type *)malloc(zone); 6897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* __Userspace__ SCTP_ZONE_FREE: free element from the zone */ 6927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZONE_FREE(zone, element) { \ 6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) free(element); \ 6947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZONE_DESTROY(zone) 6977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 6987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*__Userspace__ 6997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Compiling & linking notes: Needs libumem, which has been placed in ./user_lib 7007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) All userspace header files are in ./user_include. Makefile will need the 7017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) following. 7027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CFLAGS = -I./ -Wall 7037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LDFLAGS = -L./user_lib -R./user_lib -lumem 7047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)*/ 7057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "user_include/umem.h" 7067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* __Userspace__ SCTP_ZONE_INIT: initialize the zone */ 7087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 7097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) __Userspace__ 7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) No equivalent function to uma_zone_set_max added yet. (See SCTP_ZONE_INIT in sctp_os_bsd.h 7117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for reference). It may not be required as mentioned in 7127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) http://nixdoc.net/man-pages/FreeBSD/uma_zalloc.9.html that 7137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) max limits may not enforced on systems with more than one CPU. 7147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)*/ 7157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZONE_INIT(zone, name, size, number) { \ 7167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) zone = umem_cache_create(name, size, 0, NULL, NULL, NULL, NULL, NULL, 0); \ 7177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 7187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* __Userspace__ SCTP_ZONE_GET: allocate element from the zone */ 7207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZONE_GET(zone, type) \ 7217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (type *)umem_cache_alloc(zone, UMEM_DEFAULT); 7227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* __Userspace__ SCTP_ZONE_FREE: free element from the zone */ 7257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZONE_FREE(zone, element) \ 7267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) umem_cache_free(zone, element); 7277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* __Userspace__ SCTP_ZONE_DESTROY: destroy the zone */ 7307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZONE_DESTROY(zone) \ 7317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) umem_cache_destroy(zone); 7327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 7337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* global struct ifaddrs used in sctp_init_ifns_for_vrf getifaddrs call 7357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * but references to fields are needed to persist as the vrf is queried. 7367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * getifaddrs allocates memory that needs to be freed with a freeifaddrs 7377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * call; this global is used to call freeifaddrs upon in sctp_pcb_finish 7387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 7397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)extern struct ifaddrs *g_interfaces; 7407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 7437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * __Userspace__ Defining sctp_hashinit_flags() and sctp_hashdestroy() for userland. 7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 7457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void *sctp_hashinit_flags(int elements, struct malloc_type *type, 7467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) u_long *hashmask, int flags); 7477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void 7487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)sctp_hashdestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask); 7497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void 7517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)sctp_hashfreedestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask); 7527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define HASH_NOWAIT 0x00000001 7557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define HASH_WAITOK 0x00000002 7567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* M_PCB is MALLOC_DECLARE'd in sys/socketvar.h */ 7587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_HASH_INIT(size, hashmark) sctp_hashinit_flags(size, M_PCB, hashmark, HASH_NOWAIT) 7597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_HASH_FREE(table, hashmark) sctp_hashdestroy(table, M_PCB, hashmark) 7617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_HASH_FREE_DESTROY(table, hashmark) sctp_hashfreedestroy(table, M_PCB, hashmark) 7637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_M_COPYM m_copym 7647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * timers 7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 7687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* __Userspace__ 7697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * user_sctp_callout.h has typedef struct sctp_callout sctp_os_timer_t; 7707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * which is used in the timer related functions such as 7717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * SCTP_OS_TIMER_INIT etc. 7727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)*/ 7737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/sctp_callout.h> 7747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* __Userspace__ Creating a receive thread */ 7767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <user_recv_thread.h> 7777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*__Userspace__ defining KTR_SUBSYS 1 as done in sctp_os_macosx.h */ 7797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define KTR_SUBSYS 1 7807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define sctp_get_tick_count() (ticks) 7827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* The packed define for 64 bit platforms */ 7847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__Userspace_os_Windows) 7857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_PACKED __attribute__((packed)) 7867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_UNUSED __attribute__((unused)) 7877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 7887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_PACKED 7897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_UNUSED 7907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 7917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 7937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * Functions 7947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 7957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Mbuf manipulation and access macros */ 7967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_LEN(m) (m->m_len) 7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_NEXT(m) (m->m_next) 7987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_NEXT_PKT(m) (m->m_nextpkt) 7997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_RESV_UF(m, size) m->m_data += size 8007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_AT(m, size) m->m_data + size 8017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_IS_EXTENDED(m) (m->m_flags & M_EXT) 8027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_EXTEND_SIZE(m) (m->m_ext.ext_size) 8037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_TYPE(m) (m->m_type) 8047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_RECVIF(m) (m->m_pkthdr.rcvif) 8057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_PREPEND M_PREPEND 8067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ALIGN_TO_END(m, len) if(m->m_flags & M_PKTHDR) { \ 8087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MH_ALIGN(m, len); \ 8097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else if ((m->m_flags & M_EXT) == 0) { \ 8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) M_ALIGN(m, len); \ 8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* We make it so if you have up to 4 threads 8147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * writting based on the default size of 8157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * the packet log 65 k, that would be 8167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * 4 16k packets before we would hit 8177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * a problem. 8187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 8197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_PKTLOG_WRITERS_NEED_LOCK 3 8207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 8237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * routes, output, etc. 8247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 8257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef struct sctp_route sctp_route_t; 8277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef struct sctp_rtentry sctp_rtentry_t; 8287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static inline void sctp_userspace_rtalloc(sctp_route_t *ro) 8307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){ 8317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (ro->ro_rt != NULL) { 8327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ro->ro_rt->rt_refcnt++; 8337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 8347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 8357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ro->ro_rt = (sctp_rtentry_t *) malloc(sizeof(sctp_rtentry_t)); 8377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (ro->ro_rt == NULL) 8387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* initialize */ 8417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) memset(ro->ro_rt, 0, sizeof(sctp_rtentry_t)); 8427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ro->ro_rt->rt_refcnt = 1; 8437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* set MTU */ 8457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* TODO set this based on the ro->ro_dst, looking up MTU with routing socket */ 8467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if 0 8477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (userspace_rawroute == -1) { 8487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) userspace_rawroute = socket(AF_ROUTE, SOCK_RAW, 0); 8497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (userspace_rawroute == -1) 8507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 8517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 8527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 8537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ro->ro_rt->rt_rmx.rmx_mtu = 1500; /* FIXME temporary solution */ 8547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* TODO enable the ability to obtain interface index of route for 8567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * SCTP_GET_IF_INDEX_FROM_ROUTE macro. 8577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 8587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_RTALLOC(ro, vrf_id) sctp_userspace_rtalloc((sctp_route_t *)ro) 8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* dummy rtfree needed once user_route.h is included */ 8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)static inline void sctp_userspace_rtfree(sctp_rtentry_t *rt) 8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){ 8647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if(rt == NULL) { 8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if(--rt->rt_refcnt > 0) { 8687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 8697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 8707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) free(rt); 8717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rt = NULL; 8727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 8737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define rtfree(arg1) sctp_userspace_rtfree(arg1) 8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*************************/ 8777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* MTU */ 8787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*************************/ 8797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int sctp_userspace_get_mtu_from_ifn(uint32_t if_index, int af); 8807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index, af) sctp_userspace_get_mtu_from_ifn(ifn_index, af) 8827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GATHER_MTU_FROM_ROUTE(sctp_ifa, sa, rt) ((rt != NULL) ? rt->rt_rmx.rmx_mtu : 0) 8847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GATHER_MTU_FROM_INTFC(sctp_ifn) sctp_userspace_get_mtu_from_ifn(if_nametoindex(((struct ifaddrs *) (sctp_ifn))->ifa_name), AF_INET) 8867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SET_MTU_OF_ROUTE(sa, rt, mtu) do { \ 8887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (rt != NULL) \ 8897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rt->rt_rmx.rmx_mtu = mtu; \ 8907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while(0) 8917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* (de-)register interface event notifications */ 8937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_REGISTER_INTERFACE(ifhandle, af) 8947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_DEREGISTER_INTERFACE(ifhandle, af) 8957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 8977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*************************/ 8987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* These are for logging */ 8997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/*************************/ 9007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* return the base ext data pointer */ 9017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_EXTEND_BASE(m) (m->m_ext.ext_buf) 9027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) /* return the refcnt of the data pointer */ 9037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_EXTEND_REFCNT(m) (*m->m_ext.ref_cnt) 9047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* return any buffer related flags, this is 9057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * used beyond logging for apple only. 9067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 9077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_BUF_GET_FLAGS(m) (m->m_flags) 9087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* For BSD this just accesses the M_PKTHDR length 9107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * so it operates on an mbuf with hdr flag. Other 9117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * O/S's may have seperate packet header and mbuf 9127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * chain pointers.. thus the macro. 9137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 9147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_HEADER_TO_CHAIN(m) (m) 9157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_DETACH_HEADER_FROM_CHAIN(m) 9167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_HEADER_LEN(m) ((m)->m_pkthdr.len) 9177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GET_HEADER_FOR_OUTPUT(o_pak) 0 9187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_RELEASE_HEADER(m) 9197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_RELEASE_PKT(m) sctp_m_freem(m) 9207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* UDP __Userspace__ - dummy definition */ 9217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ENABLE_UDP_CSUM(m) m=m 9227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* BSD definition */ 9237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #define SCTP_ENABLE_UDP_CSUM(m) do { \ */ 9247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* m->m_pkthdr.csum_flags = CSUM_UDP; \ */ 9257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum); \ */ 9267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* } while (0) */ 9277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GET_PKT_VRFID(m, vrf_id) ((vrf_id = SCTP_DEFAULT_VRFID) != SCTP_DEFAULT_VRFID) 9297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Attach the chain of data into the sendable packet. */ 9337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ATTACH_CHAIN(pak, m, packet_length) do { \ 9347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pak = m; \ 9357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pak->m_pkthdr.len = packet_length; \ 9367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while(0) 9377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Other m_pkthdr type things */ 9397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* FIXME need real definitions */ 9407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IS_IT_BROADCAST(dst, m) 0 9417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* OOTB only #define SCTP_IS_IT_BROADCAST(dst, m) ((m->m_flags & M_PKTHDR) ? in_broadcast(dst, m->m_pkthdr.rcvif) : 0) BSD def */ 9427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IS_IT_LOOPBACK(m) 0 9437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* OOTB ONLY #define SCTP_IS_IT_LOOPBACK(m) ((m->m_flags & M_PKTHDR) && ((m->m_pkthdr.rcvif == NULL) || (m->m_pkthdr.rcvif->if_type == IFT_LOOP))) BSD def */ 9447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* This converts any input packet header 9477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * into the chain of data holders, for BSD 9487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * its a NOP. 9497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 9507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* get the v6 hop limit */ 9527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_GET_HLIM(inp, ro) 128 /* As done for __Windows__ */ 9537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IPv6_HOP_LIMIT 128 9547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* is the endpoint v6only? */ 9567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IPV6_V6ONLY(inp) (((struct inpcb *)inp)->inp_flags & IN6P_IPV6_V6ONLY) 9577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* is the socket non-blocking? */ 9587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SO_IS_NBIO(so) ((so)->so_state & SS_NBIO) 9597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SET_SO_NBIO(so) ((so)->so_state |= SS_NBIO) 9607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_CLEAR_SO_NBIO(so) ((so)->so_state &= ~SS_NBIO) 9617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* get the socket type */ 9627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SO_TYPE(so) ((so)->so_type) 9637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* reserve sb space for a socket */ 9657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SORESERVE(so, send, recv) soreserve(so, send, recv) 9667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* wakeup a socket */ 9687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SOWAKEUP(so) wakeup(&(so)->so_timeo, so) 9697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* clear the socket buffer state */ 9707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SB_CLEAR(sb) \ 9717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (sb).sb_cc = 0; \ 9727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (sb).sb_mb = NULL; \ 9737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (sb).sb_mbcnt = 0; 9747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SB_LIMIT_RCV(so) so->so_rcv.sb_hiwat 9767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_SB_LIMIT_SND(so) so->so_snd.sb_hiwat 9777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Future zero copy wakeup/send function */ 9797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZERO_COPY_EVENT(inp, so) 9807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* This is re-pulse ourselves for sendbuf */ 9817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_ZERO_COPY_SENDQ_EVENT(inp, so) 9827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 9857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * SCTP AUTH 9867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 9877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* USE_SCTP_SHA1 is defined if you need sctp_sha1.[ch]. SHA1_* functions are defined 9887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * there. On Linux, they are also defined in libcrypto.a once you install 9897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * the libssl-dev package (on Ubuntu, at least). 9907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 9917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #define USE_SCTP_SHA1 */ 9927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* #define HAVE_SHA2 sha2.h exists on Linux? */ 9947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_READ_RANDOM(buf, len) read_random(buf, len) 9977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/sctp_sha1.h> 10003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 10017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(HAVE_SHA2) 10037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <crypto/sha2/sha2.h> 10047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 10057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if 0 10067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* going to have to port so generic across OS's... */ 10077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if 1 /* openssl header files on FreeBSD 6.3 on Emulab and libssl-dev for Ubuntu */ 10087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <openssl/md5.h> 10097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <openssl/sha.h> 10107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* libssl-dev calls this SHA_CTX, but it's refered to as SHA1_CTX within the 10117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * SCTP stack code so here we typedef (or macro?) to equate the two. 10127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 10137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef SHA_CTX SHA1_CTX; 10147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else /* only _KERNEL? */ 10167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <sys/md5.h> 10187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* map standard crypto API names */ 10197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MD5_Init MD5Init 10207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MD5_Update MD5Update 10217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MD5_Final MD5Final 10227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 10237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 10247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* start OOTB only stuff */ 10277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* TODO IFT_LOOP is in net/if_types.h on Linux */ 10307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IFT_LOOP 0x18 10317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* sctp_pcb.h */ 10337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* typedef int SHA1_CTX; */ 10347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* typedef int MD5_CTX; */ 10357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef HAVE_SHA2 10367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef int SHA256_CTX; 10377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef int SHA384_CTX; 10387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)typedef int SHA512_CTX; 10397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 10407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_Windows) 10427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SHUT_RD 1 10437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SHUT_WR 2 10447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SHUT_RDWR 3 10457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 10467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define PRU_FLUSH_RD SHUT_RD 10477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define PRU_FLUSH_WR SHUT_WR 10487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define PRU_FLUSH_RDWR SHUT_RDWR 10497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* netinet/ip_var.h defintions are behind an if defined for _KERNEL on FreeBSD */ 10517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define IP_RAWOUTPUT 0x2 10527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* end OOTB only stuff */ 10557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AF_CONN 123 10577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct sockaddr_conn { 10587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef HAVE_SCONN_LEN 10597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) uint8_t sconn_len; 10607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 10617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) uint8_t sconn_family; 10627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) uint16_t sconn_port; 10637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void *sconn_addr; 10647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 10657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* 10677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * IP output routines 10687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 10697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* Defining SCTP_IP_ID macro. 10717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) In netinet/ip_output.c, we have u_short ip_id; 10727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) In netinet/ip_var.h, we have extern u_short ip_id; (enclosed within _KERNEL_) 10737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) See static __inline uint16_t ip_newid(void) in netinet/ip_var.h 10747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 10757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IP_ID(inp) (ip_id) 10767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* need sctphdr to get port in SCTP_IP_OUTPUT. sctphdr defined in sctp.h */ 10787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <netinet/sctp.h> 10797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)extern void sctp_userspace_ip_output(int *result, struct mbuf *o_pak, 10807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) sctp_route_t *ro, void *stcb, 10817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) uint32_t vrf_id); 10827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IP_OUTPUT(result, o_pak, ro, stcb, vrf_id) sctp_userspace_ip_output(&result, o_pak, ro, stcb, vrf_id); 10847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(INET6) 10867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)extern void sctp_userspace_ip6_output(int *result, struct mbuf *o_pak, 10877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct route_in6 *ro, void *stcb, 10887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) uint32_t vrf_id); 10897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IP6_OUTPUT(result, o_pak, ro, ifp, stcb, vrf_id) sctp_userspace_ip6_output(&result, o_pak, ro, stcb, vrf_id); 10907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 10917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if 0 10957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define SCTP_IP6_OUTPUT(result, o_pak, ro, ifp, stcb, vrf_id) \ 10967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles){ \ 10977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (stcb && stcb->sctp_ep) \ 10987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) result = ip6_output(o_pak, \ 10997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ((struct in6pcb *)(stcb->sctp_ep))->in6p_outputopts, \ 11007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (ro), 0, 0, ifp, NULL); \ 11017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else \ 11027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) result = ip6_output(o_pak, NULL, (ro), 0, 0, ifp, NULL); \ 11037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 11057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct mbuf * 11077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)sctp_get_mbuf_for_msg(unsigned int space_needed, int want_header, int how, int allonebuf, int type); 11087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* with the current included files, this is defined in Linux but 11117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * in FreeBSD, it is behind a _KERNEL in sys/socket.h ... 11127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */ 11137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_OpenBSD) 11147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/* stolen from /usr/include/sys/socket.h */ 11157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CMSG_ALIGN(n) _ALIGN(n) 11167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#elif defined(__Userspace_os_Darwin) 11177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__DARWIN_ALIGNBYTES) 11187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define __DARWIN_ALIGNBYTES (sizeof(__darwin_size_t) - 1) 11197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 11207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__DARWIN_ALIGN) 11227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define __DARWIN_ALIGN(p) ((__darwin_size_t)((char *)(uintptr_t)(p) + __DARWIN_ALIGNBYTES) &~ __DARWIN_ALIGNBYTES) 11237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 11247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__DARWIN_ALIGNBYTES32) 11267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define __DARWIN_ALIGNBYTES32 (sizeof(__uint32_t) - 1) 11277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 11287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(__DARWIN_ALIGN32) 11307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define __DARWIN_ALIGN32(p) ((__darwin_size_t)((char *)(uintptr_t)(p) + __DARWIN_ALIGNBYTES32) &~ __DARWIN_ALIGNBYTES32) 11317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 11327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CMSG_ALIGN(n) __DARWIN_ALIGN32(n) 11337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 11347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define I_AM_HERE \ 11357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) do { \ 11367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SCTP_PRINTF("%s:%d at %s\n", __FILE__, __LINE__ , __FUNCTION__); \ 11377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while (0) 11387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef timevalsub 11407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define timevalsub(tp1, tp2) \ 11417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) do { \ 11427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (tp1)->tv_sec -= (tp2)->tv_sec; \ 11437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (tp1)->tv_usec -= (tp2)->tv_usec; \ 11447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((tp1)->tv_usec < 0) { \ 11457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (tp1)->tv_sec--; \ 11467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (tp1)->tv_usec += 1000000; \ 11477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } \ 11487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } while (0) 11497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 11507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(__Userspace_os_Linux) 11527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ 11537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for ((var) = ((head)->tqh_first); \ 11547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ 11557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (var) = (tvar)) 11567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define LIST_FOREACH_SAFE(var, head, field, tvar) \ 11587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for ((var) = ((head)->lh_first); \ 11597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (var) && ((tvar) = LIST_NEXT((var), field), 1); \ 11607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (var) = (tvar)) 11617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 11627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 1163