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