18c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*- 28c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Copyright (c) 2006-2007, by Cisco Systems, Inc. All rights reserved. 38c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Copyright (c) 2008-2011, by Randall Stewart. All rights reserved. 48c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Copyright (c) 2008-2011, by Michael Tuexen. All rights reserved. 58c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Copyright (c) 2008-2011, by Brad Penoff. All rights reserved. 68c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 74c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * Redistribution and use in source and binary forms, with or without 88c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * modification, are permitted provided that the following conditions are met: 94c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * 104c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * a) Redistributions of source code must retain the above copyright notice, 118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * this list of conditions and the following disclaimer. 128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 134c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * b) Redistributions in binary form must reproduce the above copyright 144c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * notice, this list of conditions and the following disclaimer in 158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the documentation and/or other materials provided with the distribution. 168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 174c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * c) Neither the name of Cisco Systems, Inc. nor the names of its 184c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * contributors may be used to endorse or promote products derived 198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * from this software without specific prior written permission. 208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 214c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 254c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 274c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 294c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 304c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * THE POSSIBILITY OF SUCH DAMAGE. 328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifndef __sctp_os_userspace_h__ 358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define __sctp_os_userspace_h__ 368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Userspace includes 388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * All the opt_xxx.h files are placed in the kernel build directory. 398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * We will place them in userspace stack build directory. 408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 41da496d4dbde3fd5e6cd24702f9339f2774202e53tuexen 42da496d4dbde3fd5e6cd24702f9339f2774202e53tuexen#include <errno.h> 43da496d4dbde3fd5e6cd24702f9339f2774202e53tuexen 440612043f643c9b26245564c05defca64d472060etuexen#if defined(__Userspace_os_Windows) 4581616c6a3e184f46276632dd15aa489cd06d94dftuexen#include <winsock2.h> 4681616c6a3e184f46276632dd15aa489cd06d94dftuexen#include <ws2tcpip.h> 4781616c6a3e184f46276632dd15aa489cd06d94dftuexen#include <iphlpapi.h> 4881616c6a3e184f46276632dd15aa489cd06d94dftuexen#include <Mswsock.h> 4981616c6a3e184f46276632dd15aa489cd06d94dftuexen#include <Windows.h> 5081616c6a3e184f46276632dd15aa489cd06d94dftuexen#include "user_environment.h" 5181616c6a3e184f46276632dd15aa489cd06d94dftuexentypedef CRITICAL_SECTION userland_mutex_t; 5290a73b0be7df08106d158ca7e59cce3ba4ed740diruengeler#if WINVER < 0x0600 53a4442f35c4ce4ced0642c564879fea90322aec95iruengelerenum { 54a4442f35c4ce4ced0642c564879fea90322aec95iruengeler C_SIGNAL = 0, 55a4442f35c4ce4ced0642c564879fea90322aec95iruengeler C_BROADCAST = 1, 56a4442f35c4ce4ced0642c564879fea90322aec95iruengeler C_MAX_EVENTS = 2 57a4442f35c4ce4ced0642c564879fea90322aec95iruengeler}; 58a4442f35c4ce4ced0642c564879fea90322aec95iruengelertypedef struct 59a4442f35c4ce4ced0642c564879fea90322aec95iruengeler{ 60a4442f35c4ce4ced0642c564879fea90322aec95iruengeler u_int waiters_count; 61a4442f35c4ce4ced0642c564879fea90322aec95iruengeler CRITICAL_SECTION waiters_count_lock; 62a4442f35c4ce4ced0642c564879fea90322aec95iruengeler HANDLE events_[C_MAX_EVENTS]; 63a4442f35c4ce4ced0642c564879fea90322aec95iruengeler} userland_cond_t; 64a9fe9b74d5514164e56c06a5ab9b1a2a9d9a36a3tvoid InitializeXPConditionVariable(userland_cond_t *); 65a9fe9b74d5514164e56c06a5ab9b1a2a9d9a36a3tvoid DeleteXPConditionVariable(userland_cond_t *); 66a9fe9b74d5514164e56c06a5ab9b1a2a9d9a36a3tint SleepXPConditionVariable(userland_cond_t *, userland_mutex_t *); 67a9fe9b74d5514164e56c06a5ab9b1a2a9d9a36a3tvoid WakeAllXPConditionVariable(userland_cond_t *); 68a4442f35c4ce4ced0642c564879fea90322aec95iruengeler#define InitializeConditionVariable(cond) InitializeXPConditionVariable(cond) 696c804e779f60cdeb134e6a35149e80955286768et#define DeleteConditionVariable(cond) DeleteXPConditionVariable(cond) 70a4442f35c4ce4ced0642c564879fea90322aec95iruengeler#define SleepConditionVariableCS(cond, mtx, time) SleepXPConditionVariable(cond, mtx) 71a4442f35c4ce4ced0642c564879fea90322aec95iruengeler#define WakeAllConditionVariable(cond) WakeAllXPConditionVariable(cond) 72a4442f35c4ce4ced0642c564879fea90322aec95iruengeler#else 736c804e779f60cdeb134e6a35149e80955286768et#define DeleteConditionVariable(cond) 7481616c6a3e184f46276632dd15aa489cd06d94dftuexentypedef CONDITION_VARIABLE userland_cond_t; 75a4442f35c4ce4ced0642c564879fea90322aec95iruengeler#endif 7681616c6a3e184f46276632dd15aa489cd06d94dftuexentypedef HANDLE userland_thread_t; 7781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ADDRESS_FAMILY unsigned __int8 7881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define IPVERSION 4 7981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define MAXTTL 255 80070aba521fc0aeb95c421171aecbd12ca134f7fat/* VS2010 comes with stdint.h */ 81070aba521fc0aeb95c421171aecbd12ca134f7fat#if _MSC_VER >= 1600 82070aba521fc0aeb95c421171aecbd12ca134f7fat#include <stdint.h> 83070aba521fc0aeb95c421171aecbd12ca134f7fat#else 8481616c6a3e184f46276632dd15aa489cd06d94dftuexen#define uint64_t unsigned __int64 85070aba521fc0aeb95c421171aecbd12ca134f7fat#define uint32_t unsigned __int32 86070aba521fc0aeb95c421171aecbd12ca134f7fat#define int32_t __int32 87070aba521fc0aeb95c421171aecbd12ca134f7fat#define uint16_t unsigned __int16 88070aba521fc0aeb95c421171aecbd12ca134f7fat#define int16_t __int16 89070aba521fc0aeb95c421171aecbd12ca134f7fat#define uint8_t unsigned __int8 90070aba521fc0aeb95c421171aecbd12ca134f7fat#define int8_t __int8 91070aba521fc0aeb95c421171aecbd12ca134f7fat#endif 92070aba521fc0aeb95c421171aecbd12ca134f7fat#ifndef _SIZE_T_DEFINED 93070aba521fc0aeb95c421171aecbd12ca134f7fat#define size_t __int32 94070aba521fc0aeb95c421171aecbd12ca134f7fat#endif 9581616c6a3e184f46276632dd15aa489cd06d94dftuexen#define u_long unsigned __int64 9681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define u_int unsigned __int32 9781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define u_int32_t unsigned __int32 9881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define u_int16_t unsigned __int16 9981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define u_int8_t unsigned __int8 10081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define u_char unsigned char 10181616c6a3e184f46276632dd15aa489cd06d94dftuexen#define n_short unsigned __int16 10281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define u_short unsigned __int16 10381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define n_time unsigned __int32 10481616c6a3e184f46276632dd15aa489cd06d94dftuexen#define sa_family_t unsigned __int8 105070aba521fc0aeb95c421171aecbd12ca134f7fat#define ssize_t __int64 10681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define IFNAMSIZ 64 10781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define __func__ __FUNCTION__ 10881616c6a3e184f46276632dd15aa489cd06d94dftuexen 10907c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EWOULDBLOCK 11081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EWOULDBLOCK WSAEWOULDBLOCK 11107c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 11207c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EINPROGRESS 11381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EINPROGRESS WSAEINPROGRESS 11407c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 11507c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EALREADY 11681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EALREADY WSAEALREADY 11707c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 11807c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ENOTSOCK 11981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ENOTSOCK WSAENOTSOCK 12007c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 12107c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EDESTADDRREQ 12281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EDESTADDRREQ WSAEDESTADDRREQ 12307c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 12407c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EMSGSIZE 12581616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EMSGSIZE WSAEMSGSIZE 12607c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 12707c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EPROTOTYPE 12881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EPROTOTYPE WSAEPROTOTYPE 12907c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 13007c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ENOPROTOOPT 13181616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ENOPROTOOPT WSAENOPROTOOPT 13207c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 13307c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EPROTONOSUPPORT 13481616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EPROTONOSUPPORT WSAEPROTONOSUPPORT 13507c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 13607c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ESOCKTNOSUPPORT 13781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT 13807c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 13907c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EOPNOTSUPP 14081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EOPNOTSUPP WSAEOPNOTSUPP 14107c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 14207c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ENOTSUP 14381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ENOTSUP WSAEOPNOTSUPP 14407c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 14507c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EPFNOSUPPORT 14681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EPFNOSUPPORT WSAEPFNOSUPPORT 14707c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 14807c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EAFNOSUPPORT 14981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EAFNOSUPPORT WSAEAFNOSUPPORT 15007c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 15107c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EADDRINUSE 15281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EADDRINUSE WSAEADDRINUSE 15307c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 15407c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EADDRNOTAVAIL 15581616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EADDRNOTAVAIL WSAEADDRNOTAVAIL 15607c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 15707c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ENETDOWN 15881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ENETDOWN WSAENETDOWN 15907c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 16007c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ENETUNREACH 16181616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ENETUNREACH WSAENETUNREACH 16207c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 16307c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ENETRESET 16481616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ENETRESET WSAENETRESET 16507c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 16607c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ECONNABORTED 16781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ECONNABORTED WSAECONNABORTED 16807c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 16907c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ECONNRESET 17081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ECONNRESET WSAECONNRESET 17107c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 17207c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ENOBUFS 17381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ENOBUFS WSAENOBUFS 17407c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 17507c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EISCONN 17681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EISCONN WSAEISCONN 17707c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 17807c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ENOTCONN 17981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ENOTCONN WSAENOTCONN 18007c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 18107c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ESHUTDOWN 18281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ESHUTDOWN WSAESHUTDOWN 18307c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 18407c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ETOOMANYREFS 18581616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ETOOMANYREFS WSAETOOMANYREFS 18607c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 18707c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ETIMEDOUT 18881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ETIMEDOUT WSAETIMEDOUT 18907c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 19007c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ECONNREFUSED 19181616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ECONNREFUSED WSAECONNREFUSED 19207c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 19307c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ELOOP 19481616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ELOOP WSAELOOP 19507c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 19607c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EHOSTDOWN 19781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EHOSTDOWN WSAEHOSTDOWN 19807c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 19907c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EHOSTUNREACH 20081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EHOSTUNREACH WSAEHOSTUNREACH 20107c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 20207c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EPROCLIM 20381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EPROCLIM WSAEPROCLIM 20407c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 20507c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EUSERS 20681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EUSERS WSAEUSERS 20707c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 20807c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EDQUOT 20981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EDQUOT WSAEDQUOT 21007c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 21107c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef ESTALE 21281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ESTALE WSAESTALE 21307c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 21407c41148e85b5b9e84b6e3605268227eb2f619cftuexen#ifndef EREMOTE 21581616c6a3e184f46276632dd15aa489cd06d94dftuexen#define EREMOTE WSAEREMOTE 21607c41148e85b5b9e84b6e3605268227eb2f619cftuexen#endif 21781616c6a3e184f46276632dd15aa489cd06d94dftuexen 21881616c6a3e184f46276632dd15aa489cd06d94dftuexentypedef char* caddr_t; 21981616c6a3e184f46276632dd15aa489cd06d94dftuexen 22081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define bzero(buf, len) memset(buf, 0, len) 22181616c6a3e184f46276632dd15aa489cd06d94dftuexen#define bcopy(srcKey, dstKey, len) memcpy(dstKey, srcKey, len) 22208245541310fc8c27b1cacc9924e8b6f6ab6c1f8t#define snprintf(data, size, format, ...) _snprintf_s(data, size, _TRUNCATE, format, __VA_ARGS__) 22381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define inline __inline 22481616c6a3e184f46276632dd15aa489cd06d94dftuexen#define __inline__ __inline 22581616c6a3e184f46276632dd15aa489cd06d94dftuexen#define random() rand() 22681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define srandom(s) srand(s) 22781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define MSG_EOR 0x8 /* data completes record */ 228c5b6e5ac6bf2bc69bea9fae9825590d1c0523f18t#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ 229c5b6e5ac6bf2bc69bea9fae9825590d1c0523f18t 230ec3179fe5bb2526187fbac3dd195bcba85f017c1t#ifdef CMSG_DATA 23181616c6a3e184f46276632dd15aa489cd06d94dftuexen#undef CMSG_DATA 23281616c6a3e184f46276632dd15aa489cd06d94dftuexen#endif 233a8588899c953fbff2c7fef98245037099202e6f5t/* 234a8588899c953fbff2c7fef98245037099202e6f5t * The following definitions should apply iff WINVER < 0x0600 235a8588899c953fbff2c7fef98245037099202e6f5t * but that check doesn't work in all cases. So be more pedantic... 236a8588899c953fbff2c7fef98245037099202e6f5t */ 2372e9986e0a84ab51dee01167310708e598b5b9994t#define CMSG_DATA(x) WSA_CMSG_DATA(x) 2382e9986e0a84ab51dee01167310708e598b5b9994t#define CMSG_ALIGN(x) WSA_CMSGDATA_ALIGN(x) 239a8588899c953fbff2c7fef98245037099202e6f5t#ifndef CMSG_FIRSTHDR 2402e9986e0a84ab51dee01167310708e598b5b9994t#define CMSG_FIRSTHDR(x) WSA_CMSG_FIRSTHDR(x) 241a8588899c953fbff2c7fef98245037099202e6f5t#endif 242a8588899c953fbff2c7fef98245037099202e6f5t#ifndef CMSG_NXTHDR 24322ad79301f9763cc4ecdd9dc6b67bf9756085349t#define CMSG_NXTHDR(x, y) WSA_CMSG_NXTHDR(x, y) 244a8588899c953fbff2c7fef98245037099202e6f5t#endif 245a8588899c953fbff2c7fef98245037099202e6f5t#ifndef CMSG_SPACE 2462e9986e0a84ab51dee01167310708e598b5b9994t#define CMSG_SPACE(x) WSA_CMSG_SPACE(x) 247a8588899c953fbff2c7fef98245037099202e6f5t#endif 248a8588899c953fbff2c7fef98245037099202e6f5t#ifndef CMSG_LEN 2492e9986e0a84ab51dee01167310708e598b5b9994t#define CMSG_LEN(x) WSA_CMSG_LEN(x) 250ec3179fe5bb2526187fbac3dd195bcba85f017c1t#endif 25181616c6a3e184f46276632dd15aa489cd06d94dftuexen 25281616c6a3e184f46276632dd15aa489cd06d94dftuexen/**** from sctp_os_windows.h ***************/ 25381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define SCTP_IFN_IS_IFT_LOOP(ifn) ((ifn)->ifn_type == IFT_LOOP) 25481616c6a3e184f46276632dd15aa489cd06d94dftuexen#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) 25581616c6a3e184f46276632dd15aa489cd06d94dftuexen 25681616c6a3e184f46276632dd15aa489cd06d94dftuexen/* 25781616c6a3e184f46276632dd15aa489cd06d94dftuexen * Access to IFN's to help with src-addr-selection 25881616c6a3e184f46276632dd15aa489cd06d94dftuexen */ 25981616c6a3e184f46276632dd15aa489cd06d94dftuexen/* This could return VOID if the index works but for BSD we provide both. */ 26081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define SCTP_GET_IFN_VOID_FROM_ROUTE(ro) \ 26181616c6a3e184f46276632dd15aa489cd06d94dftuexen ((ro)->ro_rt != NULL ? (ro)->ro_rt->rt_ifp : NULL) 26281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define SCTP_ROUTE_HAS_VALID_IFN(ro) \ 26381616c6a3e184f46276632dd15aa489cd06d94dftuexen ((ro)->ro_rt && (ro)->ro_rt->rt_ifp) 26481616c6a3e184f46276632dd15aa489cd06d94dftuexen/******************************************/ 26581616c6a3e184f46276632dd15aa489cd06d94dftuexen 26681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define SCTP_GET_IF_INDEX_FROM_ROUTE(ro) 1 /* compiles... TODO use routing socket to determine */ 26781616c6a3e184f46276632dd15aa489cd06d94dftuexen 26881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define timeradd(tvp, uvp, vvp) \ 26981616c6a3e184f46276632dd15aa489cd06d94dftuexen do { \ 27081616c6a3e184f46276632dd15aa489cd06d94dftuexen (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ 27181616c6a3e184f46276632dd15aa489cd06d94dftuexen (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ 27281616c6a3e184f46276632dd15aa489cd06d94dftuexen if ((vvp)->tv_usec >= 1000000) { \ 27381616c6a3e184f46276632dd15aa489cd06d94dftuexen (vvp)->tv_sec++; \ 27481616c6a3e184f46276632dd15aa489cd06d94dftuexen (vvp)->tv_usec -= 1000000; \ 27581616c6a3e184f46276632dd15aa489cd06d94dftuexen } \ 27681616c6a3e184f46276632dd15aa489cd06d94dftuexen } while (0) 27781616c6a3e184f46276632dd15aa489cd06d94dftuexen 27881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define timersub(tvp, uvp, vvp) \ 27981616c6a3e184f46276632dd15aa489cd06d94dftuexen do { \ 28081616c6a3e184f46276632dd15aa489cd06d94dftuexen (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 28181616c6a3e184f46276632dd15aa489cd06d94dftuexen (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 28281616c6a3e184f46276632dd15aa489cd06d94dftuexen if ((vvp)->tv_usec < 0) { \ 28381616c6a3e184f46276632dd15aa489cd06d94dftuexen (vvp)->tv_sec--; \ 28481616c6a3e184f46276632dd15aa489cd06d94dftuexen (vvp)->tv_usec += 1000000; \ 28581616c6a3e184f46276632dd15aa489cd06d94dftuexen } \ 28681616c6a3e184f46276632dd15aa489cd06d94dftuexen } while (0) 28781616c6a3e184f46276632dd15aa489cd06d94dftuexen 28881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define BIG_ENDIAN 1 28981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define LITTLE_ENDIAN 0 290638af7e18165586e24ffc74628bd5f6f79672363t#ifdef WORDS_BIGENDIAN 291638af7e18165586e24ffc74628bd5f6f79672363t#define BYTE_ORDER BIG_ENDIAN 292638af7e18165586e24ffc74628bd5f6f79672363t#else 29381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define BYTE_ORDER LITTLE_ENDIAN 294638af7e18165586e24ffc74628bd5f6f79672363t#endif 29581616c6a3e184f46276632dd15aa489cd06d94dftuexen 29681616c6a3e184f46276632dd15aa489cd06d94dftuexenstruct iovec { 297e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen ULONG len; 298e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen CHAR FAR *buf; 29981616c6a3e184f46276632dd15aa489cd06d94dftuexen}; 30081616c6a3e184f46276632dd15aa489cd06d94dftuexen 30181616c6a3e184f46276632dd15aa489cd06d94dftuexen#define iov_base buf 30281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define iov_len len 30381616c6a3e184f46276632dd15aa489cd06d94dftuexen 30481616c6a3e184f46276632dd15aa489cd06d94dftuexenstruct ifa_msghdr { 30581616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned __int16 ifam_msglen; 30681616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned char ifam_version; 30781616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned char ifam_type; 30881616c6a3e184f46276632dd15aa489cd06d94dftuexen __int32 ifam_addrs; 30981616c6a3e184f46276632dd15aa489cd06d94dftuexen __int32 ifam_flags; 31081616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned __int16 ifam_index; 31181616c6a3e184f46276632dd15aa489cd06d94dftuexen __int32 ifam_metric; 31281616c6a3e184f46276632dd15aa489cd06d94dftuexen}; 31381616c6a3e184f46276632dd15aa489cd06d94dftuexen 31481616c6a3e184f46276632dd15aa489cd06d94dftuexenstruct ifdevmtu { 31581616c6a3e184f46276632dd15aa489cd06d94dftuexen int ifdm_current; 31681616c6a3e184f46276632dd15aa489cd06d94dftuexen int ifdm_min; 31781616c6a3e184f46276632dd15aa489cd06d94dftuexen int ifdm_max; 31881616c6a3e184f46276632dd15aa489cd06d94dftuexen}; 31981616c6a3e184f46276632dd15aa489cd06d94dftuexen 32081616c6a3e184f46276632dd15aa489cd06d94dftuexenstruct ifkpi { 32181616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned int ifk_module_id; 322e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen unsigned int ifk_type; 32381616c6a3e184f46276632dd15aa489cd06d94dftuexen union { 324e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen void *ifk_ptr; 325e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen int ifk_value; 32681616c6a3e184f46276632dd15aa489cd06d94dftuexen } ifk_data; 32781616c6a3e184f46276632dd15aa489cd06d94dftuexen}; 32881616c6a3e184f46276632dd15aa489cd06d94dftuexen 32981616c6a3e184f46276632dd15aa489cd06d94dftuexenstruct ifreq { 33081616c6a3e184f46276632dd15aa489cd06d94dftuexen char ifr_name[16]; 33181616c6a3e184f46276632dd15aa489cd06d94dftuexen union { 33281616c6a3e184f46276632dd15aa489cd06d94dftuexen struct sockaddr ifru_addr; 33381616c6a3e184f46276632dd15aa489cd06d94dftuexen struct sockaddr ifru_dstaddr; 33481616c6a3e184f46276632dd15aa489cd06d94dftuexen struct sockaddr ifru_broadaddr; 33581616c6a3e184f46276632dd15aa489cd06d94dftuexen short ifru_flags; 33681616c6a3e184f46276632dd15aa489cd06d94dftuexen int ifru_metric; 33781616c6a3e184f46276632dd15aa489cd06d94dftuexen int ifru_mtu; 33881616c6a3e184f46276632dd15aa489cd06d94dftuexen int ifru_phys; 33981616c6a3e184f46276632dd15aa489cd06d94dftuexen int ifru_media; 34081616c6a3e184f46276632dd15aa489cd06d94dftuexen int ifru_intval; 34181616c6a3e184f46276632dd15aa489cd06d94dftuexen char* ifru_data; 34281616c6a3e184f46276632dd15aa489cd06d94dftuexen struct ifdevmtu ifru_devmtu; 34381616c6a3e184f46276632dd15aa489cd06d94dftuexen struct ifkpi ifru_kpi; 34481616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned __int32 ifru_wake_flags; 34581616c6a3e184f46276632dd15aa489cd06d94dftuexen } ifr_ifru; 34681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_addr ifr_ifru.ifru_addr 34781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_dstaddr ifr_ifru.ifru_dstaddr 34881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_broadaddr ifr_ifru.ifru_broadaddr 34981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_flags ifr_ifru.ifru_flags[0] 35081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_prevflags ifr_ifru.ifru_flags[1] 35181616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_metric ifr_ifru.ifru_metric 35281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_mtu ifr_ifru.ifru_mtu 35381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_phys ifr_ifru.ifru_phys 35481616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_media ifr_ifru.ifru_media 35581616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_data ifr_ifru.ifru_data 35681616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_devmtu ifr_ifru.ifru_devmtu 35781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_intval ifr_ifru.ifru_intval 35881616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_kpi ifr_ifru.ifru_kpi 35981616c6a3e184f46276632dd15aa489cd06d94dftuexen#define ifr_wake_flags ifr_ifru.ifru_wake_flags 36081616c6a3e184f46276632dd15aa489cd06d94dftuexen}; 36181616c6a3e184f46276632dd15aa489cd06d94dftuexen 36281616c6a3e184f46276632dd15aa489cd06d94dftuexen/*#include <packon.h> 36381616c6a3e184f46276632dd15aa489cd06d94dftuexen#pragma pack(push, 1)*/ 36481616c6a3e184f46276632dd15aa489cd06d94dftuexenstruct ip { 36581616c6a3e184f46276632dd15aa489cd06d94dftuexen u_char ip_hl:4, ip_v:4; 36681616c6a3e184f46276632dd15aa489cd06d94dftuexen u_char ip_tos; 36781616c6a3e184f46276632dd15aa489cd06d94dftuexen u_short ip_len; 36881616c6a3e184f46276632dd15aa489cd06d94dftuexen u_short ip_id; 36981616c6a3e184f46276632dd15aa489cd06d94dftuexen u_short ip_off; 37081616c6a3e184f46276632dd15aa489cd06d94dftuexen#define IP_RP 0x8000 37181616c6a3e184f46276632dd15aa489cd06d94dftuexen#define IP_DF 0x4000 37281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define IP_MF 0x2000 37381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define IP_OFFMASK 0x1fff 37481616c6a3e184f46276632dd15aa489cd06d94dftuexen u_char ip_ttl; 37581616c6a3e184f46276632dd15aa489cd06d94dftuexen u_char ip_p; 37681616c6a3e184f46276632dd15aa489cd06d94dftuexen u_short ip_sum; 37781616c6a3e184f46276632dd15aa489cd06d94dftuexen struct in_addr ip_src, ip_dst; 37881616c6a3e184f46276632dd15aa489cd06d94dftuexen}; 37981616c6a3e184f46276632dd15aa489cd06d94dftuexen 38081616c6a3e184f46276632dd15aa489cd06d94dftuexenstruct ifaddrs { 38181616c6a3e184f46276632dd15aa489cd06d94dftuexen struct ifaddrs *ifa_next; 38281616c6a3e184f46276632dd15aa489cd06d94dftuexen char *ifa_name; 38381616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned int ifa_flags; 38481616c6a3e184f46276632dd15aa489cd06d94dftuexen struct sockaddr *ifa_addr; 38581616c6a3e184f46276632dd15aa489cd06d94dftuexen struct sockaddr *ifa_netmask; 38681616c6a3e184f46276632dd15aa489cd06d94dftuexen struct sockaddr *ifa_dstaddr; 38781616c6a3e184f46276632dd15aa489cd06d94dftuexen void *ifa_data; 38881616c6a3e184f46276632dd15aa489cd06d94dftuexen}; 38981616c6a3e184f46276632dd15aa489cd06d94dftuexen 39081616c6a3e184f46276632dd15aa489cd06d94dftuexenstruct udphdr { 39181616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned __int16 uh_sport; 392e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen unsigned __int16 uh_dport; 39381616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned __int16 uh_ulen; 39481616c6a3e184f46276632dd15aa489cd06d94dftuexen unsigned __int16 uh_sum; 39581616c6a3e184f46276632dd15aa489cd06d94dftuexen}; 39681616c6a3e184f46276632dd15aa489cd06d94dftuexen 397e6e18333da18c5bb7de7e9189e53403e2ffa7023tint Win_getifaddrs(struct ifaddrs**); 398e6e18333da18c5bb7de7e9189e53403e2ffa7023t#define getifaddrs(interfaces) (int)Win_getifaddrs(interfaces) 399e6e18333da18c5bb7de7e9189e53403e2ffa7023tint win_if_nametoindex(const char *); 400e6e18333da18c5bb7de7e9189e53403e2ffa7023t#define if_nametoindex(x) win_if_nametoindex(x) 401e6e18333da18c5bb7de7e9189e53403e2ffa7023t 4020612043f643c9b26245564c05defca64d472060etuexen#else /* !defined(Userspace_os_Windows) */ 4038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/cdefs.h> /* needed? added from old __FreeBSD__ */ 40481616c6a3e184f46276632dd15aa489cd06d94dftuexen#include <sys/socket.h> 40522a33a1debfe70529be4aa018a2912bfe5dcd8dat#if defined(__Userspace_os_DragonFly) || defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_Linux) || defined(__Userspace_os_NetBSD) || defined(__Userspace_os_OpenBSD) 4061a0a058c2e170a7749bd410bdeff477bbd75a615tuexen#include <pthread.h> 4071a0a058c2e170a7749bd410bdeff477bbd75a615tuexen#endif 40881616c6a3e184f46276632dd15aa489cd06d94dftuexentypedef pthread_mutex_t userland_mutex_t; 40981616c6a3e184f46276632dd15aa489cd06d94dftuexentypedef pthread_cond_t userland_cond_t; 41081616c6a3e184f46276632dd15aa489cd06d94dftuexentypedef pthread_t userland_thread_t; 41181616c6a3e184f46276632dd15aa489cd06d94dftuexen#endif 41281616c6a3e184f46276632dd15aa489cd06d94dftuexen 413e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen#define mtx_lock(arg1) 414e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen#define mtx_unlock(arg1) 415e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen#define mtx_assert(arg1,arg2) 416e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen#define MA_OWNED 7 /* sys/mutex.h typically on FreeBSD */ 417e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen#if !defined(__Userspace_os_FreeBSD) 418e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexenstruct mtx {int dummy;}; 41922a33a1debfe70529be4aa018a2912bfe5dcd8dat#if !defined(__Userspace_os_NetBSD) 420e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexenstruct selinfo {int dummy;}; 42122a33a1debfe70529be4aa018a2912bfe5dcd8dat#endif 422e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexenstruct sx {int dummy;}; 423e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen#endif 424e3797bcdbc79f87be1da2ce2b1b48a32d5037718tuexen 4258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <stdio.h> 4268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <string.h> 4278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/param.h> in FreeBSD defines MSIZE */ 4288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/ktr.h> */ 4298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/systm.h> */ 4300612043f643c9b26245564c05defca64d472060etuexen#if defined(__Userspace_os_Windows) 43177b5353dd57efd7a0fe5fd78284863ae30b45c36tuexen#include <user_queue.h> 43277b5353dd57efd7a0fe5fd78284863ae30b45c36tuexen#else 43377b5353dd57efd7a0fe5fd78284863ae30b45c36tuexen#include <sys/queue.h> 43477b5353dd57efd7a0fe5fd78284863ae30b45c36tuexen#endif 4358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <user_malloc.h> 4368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/kernel.h> */ 4378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/sysctl.h> */ 4388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/protosw.h> */ 4398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* on FreeBSD, this results in a redefintion of SOCK(BUF)_(UN)LOCK and 4408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * uknown type of struct mtx for sb_mtx in struct sockbuf */ 441f78503962dd35afd2686bf91b6b1a7b9a8cc9078tuexen#include "user_socketvar.h" /* MALLOC_DECLARE's M_PCB. Replacement for sys/socketvar.h */ 4428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/jail.h> */ 4438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/sysctl.h> */ 4448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <user_environment.h> 4458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <user_atomic.h> 4468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <user_mbuf.h> 4478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/uio.h> */ 4488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/lock.h> */ 4498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) && __FreeBSD_version > 602000 4508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/rwlock.h> 4518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 4528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/kthread.h> */ 4538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) && __FreeBSD_version > 602000 4548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/priv.h> 4558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 4568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <sys/random.h> */ 4574c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen/* #include <sys/limits.h> */ 4588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <machine/cpu.h> */ 4598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__Userspace_os_Darwin) 4618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* was a 0 byte file. needed for structs if_data(64) and net_event_data */ 4624c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen#include <net/if_var.h> 4638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 4648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__Userspace_os_FreeBSD) 4658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <net/if_types.h> 4668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <net/if_var.h> was a 0 byte file. causes struct mtx redefinition */ 4678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 4688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* OOTB only - dummy route used at the moment. should we port route to 4698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * userspace as well? */ 4708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* on FreeBSD, this results in a redefintion of struct route */ 4718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <net/route.h> */ 4720612043f643c9b26245564c05defca64d472060etuexen#if !defined(__Userspace_os_Windows) 47381616c6a3e184f46276632dd15aa489cd06d94dftuexen#include <net/if.h> 4748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/in.h> 4758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/in_systm.h> 4768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/ip.h> 4776c632b3f6e570981666f8a3ff4be34eaf1735835t#endif 4786c632b3f6e570981666f8a3ff4be34eaf1735835t#if defined INET 4796c632b3f6e570981666f8a3ff4be34eaf1735835t#if defined(__Userspace_os_Windows) 48077b5353dd57efd7a0fe5fd78284863ae30b45c36tuexen#include <user_ip_icmp.h> 4816c632b3f6e570981666f8a3ff4be34eaf1735835t#else 4826c632b3f6e570981666f8a3ff4be34eaf1735835t#include <netinet/ip_icmp.h> 4836c632b3f6e570981666f8a3ff4be34eaf1735835t#endif 48481616c6a3e184f46276632dd15aa489cd06d94dftuexen#endif 4858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <netinet/in_pcb.h> ported to userspace */ 4868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <user_inpcb.h> 4878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* for getifaddrs */ 4898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/types.h> 4900612043f643c9b26245564c05defca64d472060etuexen#if !defined(__Userspace_os_Windows) 491fcc753d4316c720a771fc1147a9b2bc6340a0469t#if defined(INET) || defined(INET6) 4928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <ifaddrs.h> 493fcc753d4316c720a771fc1147a9b2bc6340a0469t#endif 4948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* for ioctl */ 4968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/ioctl.h> 4978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* for close, etc. */ 4998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <unistd.h> 50081616c6a3e184f46276632dd15aa489cd06d94dftuexen#endif 5018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* lots of errno's used and needed in userspace */ 5038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* for offsetof */ 5058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <stddef.h> 5068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5070612043f643c9b26245564c05defca64d472060etuexen#if defined(SCTP_PROCESS_LEVEL_LOCKS) && !defined(__Userspace_os_Windows) 5088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* for pthread_mutex_lock, pthread_mutex_unlock, etc. */ 5098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <pthread.h> 5108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef IPSEC 5138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netipsec/ipsec.h> 5148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netipsec/key.h> 5158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif /* IPSEC */ 5168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef INET6 5188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__Userspace_os_FreeBSD) 5198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/domain.h> 5208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef IPSEC 5228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netipsec/ipsec6.h> 5238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 52423273859c39742f09cc5ec7c9bf32ff225661e82tuexen#if !defined(__Userspace_os_Windows) 5258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/ip6.h> 52623273859c39742f09cc5ec7c9bf32ff225661e82tuexen#include <netinet/icmp6.h> 52723273859c39742f09cc5ec7c9bf32ff225661e82tuexen#endif 52822a33a1debfe70529be4aa018a2912bfe5dcd8dat#if defined(__Userspace_os_Darwin) || defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_Linux) || defined(__Userspace_os_NetBSD) || defined(__Userspace_os_OpenBSD) || defined(__Userspace_os_Windows) 5298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include "user_ip6_var.h" 5308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 5318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet6/ip6_var.h> 5328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__Userspace_os_FreeBSD) 5348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet6/in6_pcb.h> 5358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet6/ip6protosw.h> 5368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #include <netinet6/nd6.h> was a 0 byte file */ 5378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet6/scope6_var.h> 5388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif /* INET6 */ 5408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(HAVE_SCTP_PEELOFF_SOCKOPT) 5428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/file.h> 5438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/filedesc.h> 5448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 54683a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t#include "netinet/sctp_sha1.h" 54783a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t 5488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if __FreeBSD_version >= 700000 5498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/ip_options.h> 5508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 552e6b8257902dfec8b1e5d9b80d5364a78c06777cat#define SCTP_PRINTF(...) \ 553e6b8257902dfec8b1e5d9b80d5364a78c06777cat if (SCTP_BASE_VAR(debug_printf)) { \ 554e6b8257902dfec8b1e5d9b80d5364a78c06777cat SCTP_BASE_VAR(debug_printf)(__VA_ARGS__); \ 555e6b8257902dfec8b1e5d9b80d5364a78c06777cat } 5564d38143cd39bfb8f317112b4b7f403ce23d9dbc1tuexen 5578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) 5588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifndef in6pcb 5598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define in6pcb inpcb 5608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Declare all the malloc names for all the various mallocs */ 5638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_MAP); 5648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_STRMI); 5658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_STRMO); 5668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_ASC_ADDR); 5678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_ASC_IT); 5688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_AUTH_CL); 5698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_AUTH_KY); 5708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_AUTH_HL); 5718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_AUTH_IF); 5728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_STRESET); 5738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_CMSG); 5748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_COPYAL); 5758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_VRF); 5768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_IFA); 5778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_IFN); 5788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_TIMW); 5798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_MVRF); 5808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_ITER); 5818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenMALLOC_DECLARE(SCTP_M_SOCKOPT); 5828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5834c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen#if defined(SCTP_LOCAL_TRACE_BUF) 5848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GET_CYCLECOUNT get_cyclecount() 5868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_CTR6 sctp_log_trace 5878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 5898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_CTR6 CTR6 5908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 5918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Empty ktr statement for _Userspace__ (similar to what is done for mac) */ 5938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define CTR6(m, d, p1, p2, p3, p4, p5, p6) 5948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BASE_INFO(__m) system_base_info.sctppcbinfo.__m 5988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BASE_STATS system_base_info.sctpstat 5998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BASE_STAT(__m) system_base_info.sctpstat.__m 6008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BASE_SYSCTL(__m) system_base_info.sctpsysctl.__m 6018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BASE_VAR(__m) system_base_info.__m 6028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 6048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 6058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 6068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__Userspace_os_Darwin) 6078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define USER_ADDR_NULL (NULL) /* FIX ME: temp */ 6088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 6098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(SCTP_DEBUG) 6118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/sctp_constants.h> 612eea8e784a1f5a9dd7e60728066dde460eaa5ec91t#define SCTPDBG(level, ...) \ 613eea8e784a1f5a9dd7e60728066dde460eaa5ec91t{ \ 614eea8e784a1f5a9dd7e60728066dde460eaa5ec91t do { \ 615eea8e784a1f5a9dd7e60728066dde460eaa5ec91t if (SCTP_BASE_SYSCTL(sctp_debug_on) & level) { \ 616eea8e784a1f5a9dd7e60728066dde460eaa5ec91t SCTP_PRINTF(__VA_ARGS__); \ 617eea8e784a1f5a9dd7e60728066dde460eaa5ec91t } \ 618eea8e784a1f5a9dd7e60728066dde460eaa5ec91t } while (0); \ 61981616c6a3e184f46276632dd15aa489cd06d94dftuexen} 62083a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t#define SCTPDBG_ADDR(level, addr) \ 62183a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t{ \ 62283a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t do { \ 62383a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t if (SCTP_BASE_SYSCTL(sctp_debug_on) & level ) { \ 62483a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t sctp_print_address(addr); \ 62583a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t } \ 62683a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t } while (0); \ 6278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} 6288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 6299fc7849145bd1e21ddcc1d576cac8948208f110dt#define SCTPDBG(level, ...) 6308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTPDBG_ADDR(level, addr) 6318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 6328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_LTRACE_CHUNKS 6348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#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) 6358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 6368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_LTRACE_CHK(a, b, c, d) 6378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 6388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_LTRACE_ERRORS 6404d38143cd39bfb8f317112b4b7f403ce23d9dbc1tuexen#define SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, file, err) \ 6414d38143cd39bfb8f317112b4b7f403ce23d9dbc1tuexen if (sctp_logging_level & SCTP_LTRACE_ERROR_ENABLE) \ 6424d38143cd39bfb8f317112b4b7f403ce23d9dbc1tuexen SCTP_PRINTF("mbuf:%p inp:%p stcb:%p net:%p file:%x line:%d error:%d\n", \ 6439fc7849145bd1e21ddcc1d576cac8948208f110dt (void *)m, (void *)inp, (void *)stcb, (void *)net, file, __LINE__, err); 6444d38143cd39bfb8f317112b4b7f403ce23d9dbc1tuexen#define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err) \ 6454d38143cd39bfb8f317112b4b7f403ce23d9dbc1tuexen if (sctp_logging_level & SCTP_LTRACE_ERROR_ENABLE) \ 6464d38143cd39bfb8f317112b4b7f403ce23d9dbc1tuexen SCTP_PRINTF("inp:%p stcb:%p net:%p file:%x line:%d error:%d\n", \ 6479fc7849145bd1e21ddcc1d576cac8948208f110dt (void *)inp, (void *)stcb, (void *)net, file, __LINE__, err); 6488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 6498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_LTRACE_ERR_RET_PKT(m, inp, stcb, net, file, err) 6508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_LTRACE_ERR_RET(inp, stcb, net, file, err) 6518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 6528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 6558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Local address and interface list handling 6568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 6578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_MAX_VRF_ID 0 6588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SIZE_OF_VRF_HASH 3 6598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_IFNAMSIZ IFNAMSIZ 6608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_DEFAULT_VRFID 0 6618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_VRF_ADDR_HASH_SIZE 16 6628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_VRF_IFN_HASH_SIZE 3 6638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_INIT_VRF_TABLEID(vrf) 6648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6650612043f643c9b26245564c05defca64d472060etuexen#if !defined(__Userspace_os_Windows) 6668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_IFN_IS_IFT_LOOP(ifn) (strncmp((ifn)->ifn_name, "lo", 2) == 0) 6678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* BSD definition */ 6688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #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) */ 6698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* only used in IPv6 scenario, which isn't supported yet */ 6708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ROUTE_IS_REAL_LOOP(ro) 0 6718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 6738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Access to IFN's to help with src-addr-selection 6748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 6758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* This could return VOID if the index works but for BSD we provide both. */ 6768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GET_IFN_VOID_FROM_ROUTE(ro) (void *)ro->ro_rt->rt_ifp 6778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GET_IF_INDEX_FROM_ROUTE(ro) 1 /* compiles... TODO use routing socket to determine */ 6788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ROUTE_HAS_VALID_IFN(ro) ((ro)->ro_rt && (ro)->ro_rt->rt_ifp) 67981616c6a3e184f46276632dd15aa489cd06d94dftuexen#endif 6808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 6828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * general memory allocation 6838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 68483a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t#define SCTP_MALLOC(var, type, size, name) \ 68583a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t do { \ 68683a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t MALLOC(var, type, size, name, M_NOWAIT); \ 68783a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t } while (0) 6888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_FREE(var, type) FREE(var, type) 6908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 69183a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t#define SCTP_MALLOC_SONAME(var, type, size) \ 69283a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t do { \ 69383a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t MALLOC(var, type, size, M_SONAME, (M_WAITOK | M_ZERO)); \ 69483a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t } while (0) 6958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_FREE_SONAME(var) FREE(var, M_SONAME) 6978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_PROCESS_STRUCT struct proc * 6998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 7018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * zone allocation functions 7028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 7038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(SCTP_SIMPLE_ALLOCATOR) 7068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*typedef size_t sctp_zone_t;*/ 7078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ZONE_INIT(zone, name, size, number) { \ 7088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen zone = size; \ 7098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} 7108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* __Userspace__ SCTP_ZONE_GET: allocate element from the zone */ 71281616c6a3e184f46276632dd15aa489cd06d94dftuexen#define SCTP_ZONE_GET(zone, type) \ 7134c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen (type *)malloc(zone); 7148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* __Userspace__ SCTP_ZONE_FREE: free element from the zone */ 71781616c6a3e184f46276632dd15aa489cd06d94dftuexen#define SCTP_ZONE_FREE(zone, element) { \ 71881616c6a3e184f46276632dd15aa489cd06d94dftuexen free(element); \ 7194c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen} 7208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ZONE_DESTROY(zone) 7228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 7238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*__Userspace__ 7248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen Compiling & linking notes: Needs libumem, which has been placed in ./user_lib 7258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen All userspace header files are in ./user_include. Makefile will need the 7268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen following. 7278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen CFLAGS = -I./ -Wall 7288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen LDFLAGS = -L./user_lib -R./user_lib -lumem 7298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen*/ 7308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include "user_include/umem.h" 7318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* __Userspace__ SCTP_ZONE_INIT: initialize the zone */ 7338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 7344c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen __Userspace__ 7358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen No equivalent function to uma_zone_set_max added yet. (See SCTP_ZONE_INIT in sctp_os_bsd.h 7368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen for reference). It may not be required as mentioned in 7374c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen http://nixdoc.net/man-pages/FreeBSD/uma_zalloc.9.html that 7384c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen max limits may not enforced on systems with more than one CPU. 7398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen*/ 7408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ZONE_INIT(zone, name, size, number) { \ 7418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen zone = umem_cache_create(name, size, 0, NULL, NULL, NULL, NULL, NULL, 0); \ 7428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } 7438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* __Userspace__ SCTP_ZONE_GET: allocate element from the zone */ 7458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ZONE_GET(zone, type) \ 7468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (type *)umem_cache_alloc(zone, UMEM_DEFAULT); 7478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* __Userspace__ SCTP_ZONE_FREE: free element from the zone */ 7508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ZONE_FREE(zone, element) \ 7518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen umem_cache_free(zone, element); 7528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* __Userspace__ SCTP_ZONE_DESTROY: destroy the zone */ 7558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ZONE_DESTROY(zone) \ 7568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen umem_cache_destroy(zone); 7578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 7588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* global struct ifaddrs used in sctp_init_ifns_for_vrf getifaddrs call 7608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * but references to fields are needed to persist as the vrf is queried. 7618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * getifaddrs allocates memory that needs to be freed with a freeifaddrs 7628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * call; this global is used to call freeifaddrs upon in sctp_pcb_finish 7638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 7648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenextern struct ifaddrs *g_interfaces; 7658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 7688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * __Userspace__ Defining sctp_hashinit_flags() and sctp_hashdestroy() for userland. 7698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 7704c9a97c03be375d5f228bcb39e460842f48a0bb9tuexenvoid *sctp_hashinit_flags(int elements, struct malloc_type *type, 7718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen u_long *hashmask, int flags); 7728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 7738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_hashdestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask); 7748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 7768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_hashfreedestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask); 7778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define HASH_NOWAIT 0x00000001 7808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define HASH_WAITOK 0x00000002 7818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* M_PCB is MALLOC_DECLARE'd in sys/socketvar.h */ 7838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_HASH_INIT(size, hashmark) sctp_hashinit_flags(size, M_PCB, hashmark, HASH_NOWAIT) 7848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_HASH_FREE(table, hashmark) sctp_hashdestroy(table, M_PCB, hashmark) 7868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_HASH_FREE_DESTROY(table, hashmark) sctp_hashfreedestroy(table, M_PCB, hashmark) 7888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_M_COPYM m_copym 7898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 7918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * timers 7928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 7934c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen/* __Userspace__ 7948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * user_sctp_callout.h has typedef struct sctp_callout sctp_os_timer_t; 7958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * which is used in the timer related functions such as 7968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * SCTP_OS_TIMER_INIT etc. 7978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen*/ 798a804fa53b20093a975fc501f62a08313110328cetuexen#include <netinet/sctp_callout.h> 7998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* __Userspace__ Creating a receive thread */ 8018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <user_recv_thread.h> 8028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*__Userspace__ defining KTR_SUBSYS 1 as done in sctp_os_macosx.h */ 8048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define KTR_SUBSYS 1 8058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 80607bf700d19e320580f314f48e6f88d18a4126f71tuexen#define sctp_get_tick_count() (ticks) 8078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* The packed define for 64 bit platforms */ 8090612043f643c9b26245564c05defca64d472060etuexen#if !defined(__Userspace_os_Windows) 8108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_PACKED __attribute__((packed)) 8118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_UNUSED __attribute__((unused)) 81281616c6a3e184f46276632dd15aa489cd06d94dftuexen#else 81381616c6a3e184f46276632dd15aa489cd06d94dftuexen#define SCTP_PACKED 81481616c6a3e184f46276632dd15aa489cd06d94dftuexen#define SCTP_UNUSED 81581616c6a3e184f46276632dd15aa489cd06d94dftuexen#endif 8168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 8188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Functions 8198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 8208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Mbuf manipulation and access macros */ 8218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_LEN(m) (m->m_len) 8228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_NEXT(m) (m->m_next) 8238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_NEXT_PKT(m) (m->m_nextpkt) 8248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_RESV_UF(m, size) m->m_data += size 8258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_AT(m, size) m->m_data + size 8268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_IS_EXTENDED(m) (m->m_flags & M_EXT) 8278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_EXTEND_SIZE(m) (m->m_ext.ext_size) 8288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_TYPE(m) (m->m_type) 8298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_RECVIF(m) (m->m_pkthdr.rcvif) 8308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_PREPEND M_PREPEND 8318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ALIGN_TO_END(m, len) if(m->m_flags & M_PKTHDR) { \ 8338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen MH_ALIGN(m, len); \ 8348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } else if ((m->m_flags & M_EXT) == 0) { \ 8358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen M_ALIGN(m, len); \ 8368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } 8378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* We make it so if you have up to 4 threads 8398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * writting based on the default size of 8408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the packet log 65 k, that would be 8418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 4 16k packets before we would hit 8428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * a problem. 8438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 8448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_PKTLOG_WRITERS_NEED_LOCK 3 8458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 8488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * routes, output, etc. 8498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 8508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 851e4ac8c019c9261b24726d5c979869eb16d9b3f33ttypedef struct sctp_route sctp_route_t; 852e4ac8c019c9261b24726d5c979869eb16d9b3f33ttypedef struct sctp_rtentry sctp_rtentry_t; 8534c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen 854e4ac8c019c9261b24726d5c979869eb16d9b3f33tstatic inline void sctp_userspace_rtalloc(sctp_route_t *ro) 855e4ac8c019c9261b24726d5c979869eb16d9b3f33t{ 856e4ac8c019c9261b24726d5c979869eb16d9b3f33t if (ro->ro_rt != NULL) { 857e4ac8c019c9261b24726d5c979869eb16d9b3f33t ro->ro_rt->rt_refcnt++; 858e4ac8c019c9261b24726d5c979869eb16d9b3f33t return; 859e4ac8c019c9261b24726d5c979869eb16d9b3f33t } 8608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 861e4ac8c019c9261b24726d5c979869eb16d9b3f33t ro->ro_rt = (sctp_rtentry_t *) malloc(sizeof(sctp_rtentry_t)); 862e4ac8c019c9261b24726d5c979869eb16d9b3f33t if (ro->ro_rt == NULL) 863e4ac8c019c9261b24726d5c979869eb16d9b3f33t return; 8648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 865e4ac8c019c9261b24726d5c979869eb16d9b3f33t /* initialize */ 866e4ac8c019c9261b24726d5c979869eb16d9b3f33t memset(ro->ro_rt, 0, sizeof(sctp_rtentry_t)); 867e4ac8c019c9261b24726d5c979869eb16d9b3f33t ro->ro_rt->rt_refcnt = 1; 8684c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen 869e4ac8c019c9261b24726d5c979869eb16d9b3f33t /* set MTU */ 870e4ac8c019c9261b24726d5c979869eb16d9b3f33t /* TODO set this based on the ro->ro_dst, looking up MTU with routing socket */ 8718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if 0 872e4ac8c019c9261b24726d5c979869eb16d9b3f33t if (userspace_rawroute == -1) { 873e4ac8c019c9261b24726d5c979869eb16d9b3f33t userspace_rawroute = socket(AF_ROUTE, SOCK_RAW, 0); 874e4ac8c019c9261b24726d5c979869eb16d9b3f33t if (userspace_rawroute == -1) 875e4ac8c019c9261b24726d5c979869eb16d9b3f33t return; 876e4ac8c019c9261b24726d5c979869eb16d9b3f33t } 8778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 878e4ac8c019c9261b24726d5c979869eb16d9b3f33t ro->ro_rt->rt_rmx.rmx_mtu = 1500; /* FIXME temporary solution */ 8798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 880e4ac8c019c9261b24726d5c979869eb16d9b3f33t /* TODO enable the ability to obtain interface index of route for 881e4ac8c019c9261b24726d5c979869eb16d9b3f33t * SCTP_GET_IF_INDEX_FROM_ROUTE macro. 882e4ac8c019c9261b24726d5c979869eb16d9b3f33t */ 8838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} 8848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_RTALLOC(ro, vrf_id) sctp_userspace_rtalloc((sctp_route_t *)ro) 8858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* dummy rtfree needed once user_route.h is included */ 887e4ac8c019c9261b24726d5c979869eb16d9b3f33tstatic inline void sctp_userspace_rtfree(sctp_rtentry_t *rt) 888e4ac8c019c9261b24726d5c979869eb16d9b3f33t{ 889e4ac8c019c9261b24726d5c979869eb16d9b3f33t if(rt == NULL) { 890e4ac8c019c9261b24726d5c979869eb16d9b3f33t return; 891e4ac8c019c9261b24726d5c979869eb16d9b3f33t } 892e4ac8c019c9261b24726d5c979869eb16d9b3f33t if(--rt->rt_refcnt > 0) { 893e4ac8c019c9261b24726d5c979869eb16d9b3f33t return; 894e4ac8c019c9261b24726d5c979869eb16d9b3f33t } 895e4ac8c019c9261b24726d5c979869eb16d9b3f33t free(rt); 896e4ac8c019c9261b24726d5c979869eb16d9b3f33t rt = NULL; 8978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} 8988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define rtfree(arg1) sctp_userspace_rtfree(arg1) 8998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*************************/ 9028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* MTU */ 9038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*************************/ 90481616c6a3e184f46276632dd15aa489cd06d94dftuexenint sctp_userspace_get_mtu_from_ifn(uint32_t if_index, int af); 90581616c6a3e184f46276632dd15aa489cd06d94dftuexen 9068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index, af) sctp_userspace_get_mtu_from_ifn(ifn_index, af) 9078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GATHER_MTU_FROM_ROUTE(sctp_ifa, sa, rt) ((rt != NULL) ? rt->rt_rmx.rmx_mtu : 0) 9098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GATHER_MTU_FROM_INTFC(sctp_ifn) sctp_userspace_get_mtu_from_ifn(if_nametoindex(((struct ifaddrs *) (sctp_ifn))->ifa_name), AF_INET) 9118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SET_MTU_OF_ROUTE(sa, rt, mtu) do { \ 9138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if (rt != NULL) \ 9148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen rt->rt_rmx.rmx_mtu = mtu; \ 9154c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen } while(0) 9168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* (de-)register interface event notifications */ 9188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_REGISTER_INTERFACE(ifhandle, af) 9198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_DEREGISTER_INTERFACE(ifhandle, af) 9208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*************************/ 9238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* These are for logging */ 9248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*************************/ 9258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* return the base ext data pointer */ 9268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_EXTEND_BASE(m) (m->m_ext.ext_buf) 9278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* return the refcnt of the data pointer */ 9288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_EXTEND_REFCNT(m) (*m->m_ext.ref_cnt) 9298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* return any buffer related flags, this is 9308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * used beyond logging for apple only. 9318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_BUF_GET_FLAGS(m) (m->m_flags) 9338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* For BSD this just accesses the M_PKTHDR length 9358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * so it operates on an mbuf with hdr flag. Other 9368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * O/S's may have seperate packet header and mbuf 9378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * chain pointers.. thus the macro. 9388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_HEADER_TO_CHAIN(m) (m) 9408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_DETACH_HEADER_FROM_CHAIN(m) 941ba11f02084daeff0d7fd9baa478132d07e82ea92tuexen#define SCTP_HEADER_LEN(m) ((m)->m_pkthdr.len) 9428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GET_HEADER_FOR_OUTPUT(o_pak) 0 9438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_RELEASE_HEADER(m) 9448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_RELEASE_PKT(m) sctp_m_freem(m) 9458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* UDP __Userspace__ - dummy definition */ 9468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ENABLE_UDP_CSUM(m) m=m 9478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* BSD definition */ 9488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* #define SCTP_ENABLE_UDP_CSUM(m) do { \ */ 9498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* m->m_pkthdr.csum_flags = CSUM_UDP; \ */ 9508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum); \ */ 9518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* } while (0) */ 9528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GET_PKT_VRFID(m, vrf_id) ((vrf_id = SCTP_DEFAULT_VRFID) != SCTP_DEFAULT_VRFID) 9548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Attach the chain of data into the sendable packet. */ 9588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ATTACH_CHAIN(pak, m, packet_length) do { \ 9598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen pak = m; \ 9608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen pak->m_pkthdr.len = packet_length; \ 9614c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen } while(0) 9628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Other m_pkthdr type things */ 9648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* FIXME need real definitions */ 9658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_IS_IT_BROADCAST(dst, m) 0 9668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* OOTB only #define SCTP_IS_IT_BROADCAST(dst, m) ((m->m_flags & M_PKTHDR) ? in_broadcast(dst, m->m_pkthdr.rcvif) : 0) BSD def */ 9678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_IS_IT_LOOPBACK(m) 0 9688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 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 */ 9698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* This converts any input packet header 9728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * into the chain of data holders, for BSD 9738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * its a NOP. 9748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* get the v6 hop limit */ 9778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_GET_HLIM(inp, ro) 128 /* As done for __Windows__ */ 9781a0a058c2e170a7749bd410bdeff477bbd75a615tuexen#define IPv6_HOP_LIMIT 128 9798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* is the endpoint v6only? */ 9818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_IPV6_V6ONLY(inp) (((struct inpcb *)inp)->inp_flags & IN6P_IPV6_V6ONLY) 9828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* is the socket non-blocking? */ 9838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SO_IS_NBIO(so) ((so)->so_state & SS_NBIO) 9848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SET_SO_NBIO(so) ((so)->so_state |= SS_NBIO) 9858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_CLEAR_SO_NBIO(so) ((so)->so_state &= ~SS_NBIO) 9868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* get the socket type */ 9878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SO_TYPE(so) ((so)->so_type) 9888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* reserve sb space for a socket */ 9908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SORESERVE(so, send, recv) soreserve(so, send, recv) 9918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* wakeup a socket */ 9938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SOWAKEUP(so) wakeup(&(so)->so_timeo, so) 9948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* clear the socket buffer state */ 9958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SB_CLEAR(sb) \ 9968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (sb).sb_cc = 0; \ 9978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (sb).sb_mb = NULL; \ 9988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (sb).sb_mbcnt = 0; 9998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SB_LIMIT_RCV(so) so->so_rcv.sb_hiwat 10018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_SB_LIMIT_SND(so) so->so_snd.sb_hiwat 10028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Future zero copy wakeup/send function */ 10048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ZERO_COPY_EVENT(inp, so) 10054c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen/* This is re-pulse ourselves for sendbuf */ 10068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ZERO_COPY_SENDQ_EVENT(inp, so) 10078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_READ_RANDOM(buf, len) read_random(buf, len) 10098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 101083a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t#define SCTP_SHA1_CTX struct sctp_sha1_context 101183a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t#define SCTP_SHA1_INIT sctp_sha1_init 101283a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t#define SCTP_SHA1_UPDATE sctp_sha1_update 101383a86bbf399ce2b9b51cdf1c0c679944bbcee0a9t#define SCTP_SHA1_FINAL(x,y) sctp_sha1_final((unsigned char *)x, y) 10148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* start OOTB only stuff */ 10168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* TODO IFT_LOOP is in net/if_types.h on Linux */ 10178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define IFT_LOOP 0x18 10188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* sctp_pcb.h */ 10208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 102103fdf23e1c4a95e9c538abc0e2acbbf7e772eb49tuexen#if defined(__Userspace_os_Windows) 102203fdf23e1c4a95e9c538abc0e2acbbf7e772eb49tuexen#define SHUT_RD 1 102303fdf23e1c4a95e9c538abc0e2acbbf7e772eb49tuexen#define SHUT_WR 2 10244c9a97c03be375d5f228bcb39e460842f48a0bb9tuexen#define SHUT_RDWR 3 102503fdf23e1c4a95e9c538abc0e2acbbf7e772eb49tuexen#endif 1026e5acde438f3c0c70f50751fa4c6a8209650f67cbtuexen#define PRU_FLUSH_RD SHUT_RD 1027e5acde438f3c0c70f50751fa4c6a8209650f67cbtuexen#define PRU_FLUSH_WR SHUT_WR 1028e5acde438f3c0c70f50751fa4c6a8209650f67cbtuexen#define PRU_FLUSH_RDWR SHUT_RDWR 10298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* netinet/ip_var.h defintions are behind an if defined for _KERNEL on FreeBSD */ 10318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define IP_RAWOUTPUT 0x2 10328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* end OOTB only stuff */ 10358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1036b049c47efe2be4692752fdeb90cbc26f5bd3a1c7tuexen#define AF_CONN 123 1037b049c47efe2be4692752fdeb90cbc26f5bd3a1c7tuexenstruct sockaddr_conn { 10387b0ab5c1c85787647428afafeff9491e9b6a60c7t#ifdef HAVE_SCONN_LEN 1039b049c47efe2be4692752fdeb90cbc26f5bd3a1c7tuexen uint8_t sconn_len; 10407b0ab5c1c85787647428afafeff9491e9b6a60c7t#endif 1041755ec15efec6bab79ffde6eff39937ed86e40815tuexen uint8_t sconn_family; 1042b049c47efe2be4692752fdeb90cbc26f5bd3a1c7tuexen uint16_t sconn_port; 1043b049c47efe2be4692752fdeb90cbc26f5bd3a1c7tuexen void *sconn_addr; 1044b049c47efe2be4692752fdeb90cbc26f5bd3a1c7tuexen}; 10457b0ab5c1c85787647428afafeff9491e9b6a60c7t 10468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 10477062b073926be4aedae0478156cb5e7ed2c527f0t * SCTP protocol specific mbuf flags. 10487062b073926be4aedae0478156cb5e7ed2c527f0t */ 10497062b073926be4aedae0478156cb5e7ed2c527f0t#define M_NOTIFICATION M_PROTO5 /* SCTP notification */ 10507062b073926be4aedae0478156cb5e7ed2c527f0t 10517062b073926be4aedae0478156cb5e7ed2c527f0t/* 10528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * IP output routines 10538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 10548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Defining SCTP_IP_ID macro. 10568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen In netinet/ip_output.c, we have u_short ip_id; 10578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen In netinet/ip_var.h, we have extern u_short ip_id; (enclosed within _KERNEL_) 10588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen See static __inline uint16_t ip_newid(void) in netinet/ip_var.h 10598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 10608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_IP_ID(inp) (ip_id) 10618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* need sctphdr to get port in SCTP_IP_OUTPUT. sctphdr defined in sctp.h */ 10638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/sctp.h> 10648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenextern void sctp_userspace_ip_output(int *result, struct mbuf *o_pak, 1065e4ac8c019c9261b24726d5c979869eb16d9b3f33t sctp_route_t *ro, void *stcb, 1066e4ac8c019c9261b24726d5c979869eb16d9b3f33t uint32_t vrf_id); 10678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_IP_OUTPUT(result, o_pak, ro, stcb, vrf_id) sctp_userspace_ip_output(&result, o_pak, ro, stcb, vrf_id); 10698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10700612043f643c9b26245564c05defca64d472060etuexen#if defined(INET6) 107114ba474e7d8520db1b04d650c6a788bdc5dab9e0tuexenextern void sctp_userspace_ip6_output(int *result, struct mbuf *o_pak, 107214ba474e7d8520db1b04d650c6a788bdc5dab9e0tuexen struct route_in6 *ro, void *stcb, 107314ba474e7d8520db1b04d650c6a788bdc5dab9e0tuexen uint32_t vrf_id); 10741a0a058c2e170a7749bd410bdeff477bbd75a615tuexen#define SCTP_IP6_OUTPUT(result, o_pak, ro, ifp, stcb, vrf_id) sctp_userspace_ip6_output(&result, o_pak, ro, stcb, vrf_id); 10751a0a058c2e170a7749bd410bdeff477bbd75a615tuexen#endif 10761a0a058c2e170a7749bd410bdeff477bbd75a615tuexen 10778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if 0 10808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_IP6_OUTPUT(result, o_pak, ro, ifp, stcb, vrf_id) \ 10818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen{ \ 1082e4ac8c019c9261b24726d5c979869eb16d9b3f33t if (stcb && stcb->sctp_ep) \ 10838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen result = ip6_output(o_pak, \ 10848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen ((struct in6pcb *)(stcb->sctp_ep))->in6p_outputopts, \ 10858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (ro), 0, 0, ifp, NULL); \ 10868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen else \ 10878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen result = ip6_output(o_pak, NULL, (ro), 0, 0, ifp, NULL); \ 10888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} 10898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 10908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct mbuf * 1092e4ac8c019c9261b24726d5c979869eb16d9b3f33tsctp_get_mbuf_for_msg(unsigned int space_needed, int want_header, int how, int allonebuf, int type); 10938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* with the current included files, this is defined in Linux but 10968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * in FreeBSD, it is behind a _KERNEL in sys/socket.h ... 10978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 109822a33a1debfe70529be4aa018a2912bfe5dcd8dat#if defined(__Userspace_os_DragonFly) || defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_OpenBSD) 10998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* stolen from /usr/include/sys/socket.h */ 11008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define CMSG_ALIGN(n) _ALIGN(n) 110122a33a1debfe70529be4aa018a2912bfe5dcd8dat#elif defined(__Userspace_os_NetBSD) 110222a33a1debfe70529be4aa018a2912bfe5dcd8dat#define CMSG_ALIGN(n) (((n) + __ALIGNBYTES) & ~__ALIGNBYTES) 11038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#elif defined(__Userspace_os_Darwin) 11048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__DARWIN_ALIGNBYTES) 11058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define __DARWIN_ALIGNBYTES (sizeof(__darwin_size_t) - 1) 11068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 11078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__DARWIN_ALIGN) 11098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define __DARWIN_ALIGN(p) ((__darwin_size_t)((char *)(uintptr_t)(p) + __DARWIN_ALIGNBYTES) &~ __DARWIN_ALIGNBYTES) 11108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 11118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__DARWIN_ALIGNBYTES32) 11138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define __DARWIN_ALIGNBYTES32 (sizeof(__uint32_t) - 1) 11148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 11158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__DARWIN_ALIGN32) 11178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define __DARWIN_ALIGN32(p) ((__darwin_size_t)((char *)(uintptr_t)(p) + __DARWIN_ALIGNBYTES32) &~ __DARWIN_ALIGNBYTES32) 11188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 11198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define CMSG_ALIGN(n) __DARWIN_ALIGN32(n) 1120638af7e18165586e24ffc74628bd5f6f79672363t#endif 11218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define I_AM_HERE \ 11228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen do { \ 11234d38143cd39bfb8f317112b4b7f403ce23d9dbc1tuexen SCTP_PRINTF("%s:%d at %s\n", __FILE__, __LINE__ , __FUNCTION__); \ 11248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } while (0) 11258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11260cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen#ifndef timevalsub 11270cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen#define timevalsub(tp1, tp2) \ 11280cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen do { \ 11290cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen (tp1)->tv_sec -= (tp2)->tv_sec; \ 11300cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen (tp1)->tv_usec -= (tp2)->tv_usec; \ 11310cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen if ((tp1)->tv_usec < 0) { \ 11320cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen (tp1)->tv_sec--; \ 11330cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen (tp1)->tv_usec += 1000000; \ 11340cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen } \ 11350cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen } while (0) 11360cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen#endif 11370cbf89141478f8522f3fc6f11f058f6438d18b1ftuexen 11380612043f643c9b26245564c05defca64d472060etuexen#if defined(__Userspace_os_Linux) 113927930dc69794f3c327ec54e561fbf36158d78848t#if !defined(TAILQ_FOREACH_SAFE) 1140da44d9625d8c207cc704bddcb77fc412706c5756tuexen#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ 1141da44d9625d8c207cc704bddcb77fc412706c5756tuexen for ((var) = ((head)->tqh_first); \ 1142da44d9625d8c207cc704bddcb77fc412706c5756tuexen (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ 1143da44d9625d8c207cc704bddcb77fc412706c5756tuexen (var) = (tvar)) 114427930dc69794f3c327ec54e561fbf36158d78848t#endif 114527930dc69794f3c327ec54e561fbf36158d78848t#if !defined(LIST_FOREACH_SAFE) 1146da44d9625d8c207cc704bddcb77fc412706c5756tuexen#define LIST_FOREACH_SAFE(var, head, field, tvar) \ 1147da44d9625d8c207cc704bddcb77fc412706c5756tuexen for ((var) = ((head)->lh_first); \ 1148da44d9625d8c207cc704bddcb77fc412706c5756tuexen (var) && ((tvar) = LIST_NEXT((var), field), 1); \ 1149da44d9625d8c207cc704bddcb77fc412706c5756tuexen (var) = (tvar)) 1150da44d9625d8c207cc704bddcb77fc412706c5756tuexen#endif 11518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 115222a33a1debfe70529be4aa018a2912bfe5dcd8dat#if defined(__Userspace_os_DragonFly) 115322a33a1debfe70529be4aa018a2912bfe5dcd8dat#define TAILQ_FOREACH_SAFE TAILQ_FOREACH_MUTABLE 115422a33a1debfe70529be4aa018a2912bfe5dcd8dat#define LIST_FOREACH_SAFE LIST_FOREACH_MUTABLE 115522a33a1debfe70529be4aa018a2912bfe5dcd8dat#endif 115627930dc69794f3c327ec54e561fbf36158d78848t#endif 1157