1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2012 David Hoeppner. All rights reserved. 14 */ 15 16 #ifndef _INET_DCCP_H 17 #define _INET_DCCP_H 18 19 #include <sys/inttypes.h> 20 #include <sys/socket.h> 21 #include <sys/socket_proto.h> 22 23 #include <netinet/in.h> 24 #include <netinet/ip6.h> 25 #include <netinet/dccp.h> 26 27 #include <inet/common.h> 28 #include <inet/dccp_stack.h> 29 #include <inet/ip.h> 30 #include <inet/ip6.h> 31 #include <inet/optcom.h> 32 #include <inet/tunables.h> 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 /* 39 * DCCP states 40 */ 41 #define DCCPS_CLOSED 1 42 #define DCCPS_BOUND 2 43 #define DCCPS_REQUEST 3 44 #define DCCPS_LISTEN 4 45 #define DCCPS_PARTOPEN 5 46 #define DCCPS_RESPOND 6 47 #define DCCPS_OPEN 7 48 #define DCCPS_CLOSING 8 49 #define DCCPS_CLOSEREQ 9 50 #define DCCPS_TIMEWAIT 10 51 52 /* 53 * DCCP header structures. 54 */ 55 56 /* Generic protocol header (RFC 4340, Section 5.1.) */ 57 typedef struct dccphdr_s { 58 uint8_t dh_lport[2]; 59 uint8_t dh_fport[2]; 60 uint8_t dh_offset; 61 uint8_t dh_ccval:4, 62 dh_cscov:4; 63 uint8_t db_sum[2]; 64 uint8_t dh_reserved:3, 65 dh_type:4, 66 dh_x:1; 67 uint8_t dh_res_seq; 68 uint8_t dh_seq[2]; 69 } dccph_t; 70 71 #define DCCP_HDR_LENGTH(dccph) \ 72 (((dccph_t *)dccph)->dh_offset * 4) /* XXX >> 2 */ 73 #define DCCP_MAX_HDR_LENGTH 1020 74 #define DCCP_MIN_HEADER_LENGTH 12 75 76 /* Generic protocol header aligned (RFC 4340, Section 5.1.) */ 77 typedef struct dccphdra_s { 78 in_port_t dha_lport; /* Source port */ 79 in_port_t dha_fport; /* Destination port */ 80 uint8_t dha_offset; /* Data offset */ 81 uint8_t dha_ccval:4, /* */ 82 dha_cscov:4; /* */ 83 uint16_t dha_sum; /* Checksum */ 84 uint8_t dha_x:1, /* Reserved */ 85 dha_type:4, /* Packet type */ 86 dha_reserved:3; /* Header type */ 87 uint8_t dha_res_seq; 88 uint16_t dha_seq; /* Partial sequence number */ 89 } dccpha_t; 90 91 typedef struct dccphdra_ext_s { 92 uint32_t dha_ext_seq; 93 } dccpha_ext_t; 94 95 /* Acknowledgement number */ 96 typedef struct dccphdra_ack { 97 uint16_t dha_ack_reserved; 98 uint16_t dha_ack_high; 99 uint32_t dha_ack_low; 100 } dccpha_ack_t; 101 102 /* Service number */ 103 typedef struct dccphdra_srv { 104 uint32_t dha_srv_code; 105 } dccpha_srv_t; 106 107 /* Reset data */ 108 typedef struct dccphdra_reset { 109 uint8_t dha_reset_code; 110 uint8_t dha_reset_data[3]; 111 } dccpha_reset_t; 112 113 /* 114 * Control structure for each open TCP stream, 115 * defined only within the kernel or for a kmem user. 116 * NOTE: tcp_reinit_values MUST have a line for each field in this structure! 117 */ 118 #if (defined(_KERNEL) || defined(_KMEMUSER)) 119 120 /* Internal DCCP structure */ 121 typedef struct dccp_s { 122 123 conn_t *dccp_connp; /* Backpointer to conn_t */ 124 dccp_stack_t *dccp_dccps; /* Backpointer to dccp_stack_t */ 125 126 int32_t dccp_state; 127 128 uint64_t dccp_last_rcv_lbolt; 129 130 uint32_t dccp_ibsegs; /* Inbound segments on this stream */ 131 uint32_t dccp_obsegs; /* Outbound segments on this stream */ 132 133 uint32_t 134 dccp_loopback: 1, /* Src and dst are the same machine */ 135 dccp_localnet: 1, /* Src and dst are on the same subnet */ 136 dccp_active_open: 1, /* This is a active open */ 137 dccp_detached : 1, /* If we're detached from a stream */ 138 dccp_dummy: 1; 139 140 uint32_t 141 dccp_allow_short_seqnos: 1, 142 dccp_ecn_incapable: 1; 143 /* 144 * Timers and timestamps. 145 */ 146 mblk_t *dccp_timercache; /* Timer cache */ 147 timeout_id_t dccp_timer_tid; /* Timer service id */ 148 149 clock_t dccp_timestamp_init; /* Time reference */ 150 int32_t dccp_timestamp_echo; /* Timestamp found in options */ 151 clock_t dccp_timestamp; 152 153 /* 154 * Bind related. 155 */ 156 struct dccp_s *dccp_bind_hash; /* Bind hash chain */ 157 struct dccp_s *dccp_bind_hash_port; /* Bound to the same port */ 158 struct dccp_s **dccp_ptpbhn; 159 160 struct dccphdra_s *dccp_dccpha; /* Template header */ 161 162 mblk_t *dccp_xmit_head; 163 164 /* 165 * Pointers into the header template. 166 */ 167 ipha_t *dccp_ipha; 168 ip6_t *dccp_ip6h; 169 170 t_uscalar_t dccp_acceptor_id; /* ACCEPTOR_id */ 171 172 sock_connid_t dccp_connid; 173 174 /* Incrementing pending conn req ID */ 175 t_scalar_t dccp_conn_req_seqnum; 176 177 boolean_t dccp_issocket; /* This is a socket dccp */ 178 179 /* List of features being negotiated */ 180 list_t dccp_features; 181 182 struct dccp_s *dccp_listener; /* Our listener */ 183 struct dccp_s *dccp_saved_listener; /* Saved listener */ 184 185 /* 186 * Sequence numbers (Section 7.1.) 187 */ 188 uint64_t dccp_swl; /* Sequence number window low */ 189 uint64_t dccp_swh; /* Sequence number window high */ 190 uint64_t dccp_awl; /* Ack number window low */ 191 uint64_t dccp_awh; /* Ack number window high */ 192 uint64_t dccp_iss; /* Initial sequence number sent */ 193 uint64_t dccp_isr; /* Initial sequence number received */ 194 uint64_t dccp_osr; /* First OPEN sequence number */ 195 uint64_t dccp_gss; /* Greatest sequence number sent */ 196 uint64_t dccp_gsr; /* Greatest sequence */ 197 /* number received */ 198 uint64_t dccp_gar; /* Greatest acknowledgement */ 199 /* number received */ 200 201 uint8_t dccp_reset_code; 202 uint8_t dccp_reset_data[3]; 203 } dccp_t; 204 205 typedef struct dccp_df_s { 206 struct dccp_s *df_dccp; 207 kmutex_t df_lock; 208 uchar_t df_pad[TF_CACHEL_PAD - (sizeof (dccp_t *) + 209 sizeof (kmutex_t))]; 210 } dccp_df_t; 211 212 #endif /* _KERNEL */ 213 214 #ifdef __cplusplus 215 } 216 #endif 217 218 #endif /* _INET_DCCP_H */