2 * SPDX-License-Identifier: BSD-2-Clause
5 * Swinburne University of Technology, Melbourne, Australia.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS "AS IS" AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * Alias_sctp forms part of the libalias kernel module to handle
31 * Network Address Translation (NAT) for the SCTP protocol.
33 * This software was developed by David A. Hayes
34 * with leadership and advice from Jason But
36 * The design is outlined in CAIA technical report number 080618A
37 * (D. Hayes and J. But, "Alias_sctp Version 0.1: SCTP NAT implementation in IPFW")
39 * Development is part of the CAIA SONATA project,
40 * proposed by Jason But and Grenville Armitage:
41 * http://caia.swin.edu.au/urp/sonata/
44 * This project has been made possible in part by a grant from
45 * the Cisco University Research Program Fund at Community
46 * Foundation Silicon Valley.
51 #ifndef _ALIAS_SCTP_H_
52 #define _ALIAS_SCTP_H_
54 #include <sys/param.h>
56 #include <sys/malloc.h>
57 #include <sys/module.h>
58 #include <sys/kernel.h>
61 #include <sys/socketvar.h>
62 #include <sys/syslog.h>
63 #endif // #ifdef _KERNEL
64 #include <sys/types.h>
66 #include <sys/queue.h>
67 #include <sys/types.h>
70 #include <netinet/in_systm.h>
71 #include <netinet/in.h>
72 #include <netinet/ip.h>
75 * These are defined in sctp_os_bsd.h, but it can't be included due to its local file
76 * inclusion, so I'm defining them here.
79 #include <machine/cpufunc.h>
80 /* The packed define for 64 bit platforms */
82 #define SCTP_PACKED __attribute__((packed))
83 #endif //#ifndef SCTP_PACKED
85 #define SCTP_UNUSED __attribute__((unused))
86 #endif //#ifndef SCTP_UNUSED
88 #include <netinet/sctp.h>
89 //#include <netinet/sctp_os_bsd.h> --might be needed later for mbuf stuff
90 #include <netinet/sctp_header.h>
95 #endif //#ifdef _KERNEL
97 #define LINK_SCTP IPPROTO_SCTP
99 #define SN_TO_LOCAL 0 /**< packet traveling from global to local */
100 #define SN_TO_GLOBAL 1 /**< packet traveling from local to global */
101 #define SN_TO_NODIR 99 /**< used where direction is not important */
103 #define SN_NAT_PKT 0x0000 /**< Network Address Translate packet */
104 #define SN_DROP_PKT 0x0001 /**< drop packet (don't forward it) */
105 #define SN_PROCESSING_ERROR 0x0003 /**< Packet processing error */
106 #define SN_REPLY_ABORT 0x0010 /**< Reply with ABORT to sender (don't forward it) */
107 #define SN_SEND_ABORT 0x0020 /**< Send ABORT to destination */
108 #define SN_TX_ABORT 0x0030 /**< mask for transmitting abort */
109 #define SN_REFLECT_ERROR 0x0100 /**< Reply with ERROR to sender on OOTB packet Tbit set */
110 #define SN_REPLY_ERROR 0x0200 /**< Reply with ERROR to sender on ASCONF clash */
111 #define SN_TX_ERROR 0x0300 /**< mask for transmitting error */
113 #define PKT_ALIAS_RESPOND 0x1000 /**< Signal to libalias that there is a response packet to send */
119 * @brief sctp association information
121 * Structure that contains information about a particular sctp association
122 * currently under Network Address Translation.
123 * Information is stored in network byte order (as is libalias)***
125 struct sctp_nat_assoc
{
126 uint32_t l_vtag
; /**< local side verification tag */
127 uint16_t l_port
; /**< local side port number */
128 uint32_t g_vtag
; /**< global side verification tag */
129 uint16_t g_port
; /**< global side port number */
130 struct in_addr l_addr
; /**< local ip address */
131 struct in_addr a_addr
; /**< alias ip address */
132 int state
; /**< current state of NAT association */
133 int TableRegister
; /**< stores which look up tables association is registered in */
134 int exp
; /**< timer expiration in seconds from uptime */
135 int exp_loc
; /**< current location in timer_Q */
136 int num_Gaddr
; /**< number of global IP addresses in the list */
137 LIST_HEAD(sctpGlobalAddresshead
,sctp_GlobalAddress
) Gaddr
; /**< List of global addresses */
138 LIST_ENTRY (sctp_nat_assoc
) list_L
; /**< Linked list of pointers for Local table*/
139 LIST_ENTRY (sctp_nat_assoc
) list_G
; /**< Linked list of pointers for Global table */
140 LIST_ENTRY (sctp_nat_assoc
) timer_Q
; /**< Linked list of pointers for timer Q */
141 //Using libalias locking
144 struct sctp_GlobalAddress
{
145 struct in_addr g_addr
;
146 LIST_ENTRY (sctp_GlobalAddress
) list_Gaddr
; /**< Linked list of pointers for Global table */
150 * @brief SCTP chunk of interest
152 * The only chunks whose contents are of any interest are the INIT and ASCONF_AddIP
154 union sctpChunkOfInt
{
155 struct sctp_init
*Init
; /**< Pointer to Init Chunk */
156 struct sctp_init_ack
*InitAck
; /**< Pointer to Init Chunk */
157 struct sctp_paramhdr
*Asconf
; /**< Pointer to ASCONF chunk */
161 * @brief SCTP message
163 * Structure containing the relevant information from the SCTP message
165 struct sctp_nat_msg
{
166 uint16_t msg
; /**< one of the key messages defined above */
168 // struct ip6_hdr *ip_hdr; /**< pointer to ip packet header */ /*no inet6 support yet*/
170 struct ip
*ip_hdr
; /**< pointer to ip packet header */
171 #endif //#ifdef INET6
172 struct sctphdr
*sctp_hdr
; /**< pointer to sctp common header */
173 union sctpChunkOfInt sctpchnk
; /**< union of pointers to the chunk of interest */
174 int chunk_length
; /**< length of chunk of interest */
178 * @brief sctp nat timer queue structure
182 struct sctp_nat_timer
{
183 int loc_time
; /**< time in seconds for the current location in the queue */
184 int cur_loc
; /**< index of the current location in the circular queue */
185 LIST_HEAD(sctpTimerQ
,sctp_nat_assoc
) *TimerQ
; /**< List of associations at this position in the timer Q */
188 #endif //#ifndef _ALIAS_SCTP_H