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_IMPL_H 17 #define _INET_DCCP_IMPL_H 18 19 #include <sys/int_types.h> 20 #include <sys/netstack.h> 21 #include <sys/socket.h> 22 #include <sys/socket_proto.h> 23 24 #include <netinet/in.h> 25 #include <netinet/ip6.h> 26 #include <netinet/dccp.h> 27 28 #include <inet/common.h> 29 #include <inet/ip.h> 30 #include <inet/ip6.h> 31 #include <inet/optcom.h> 32 #include <inet/tunables.h> 33 34 #include "dccp_stack.h" 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 #ifdef _KERNEL 41 42 #define DCCP_MOD_ID 5999 /* XXX */ 43 44 #define DCCP_XMIT_LOWATER (4 * 1024) 45 #define DCCP_XMIT_HIWATER 49152 46 #define DCCP_RECV_LOWATER (2 * 1024) 47 #define DCCP_RECV_HIWATER 128000 48 49 /* 50 * Bind hash array size and hash function. 51 */ 52 #define DCCP_BIND_FANOUT_SIZE 128 53 #define DCCP_BIND_HASH(lport, size) ((ntohs((uint16_t)lport)) & (size - 1)) 54 55 56 #define DCCP_HDR_LENGTH(dccph) (dccph_t *)dccph->dh_offset 57 #define DCCP_MAX_HDR_LENGTH 1020 58 #define DCCP_MIN_HEADER_LENGTH 12 59 60 /* Packet types (RFC 4340, Section 5.1.) */ 61 #define DCCP_PKT_REQUEST 0 62 #define DCCP_PKT_RESPONSE 1 63 #define DCCP_PKT_DATA 2 64 #define DCCP_PKT_ACK 3 65 #define DCCP_PKT_DATAACK 4 66 #define DCCP_PKT_CLOSEREQ 5 67 #define DCCP_PKT_CLOSE 6 68 #define DCCP_PKT_RESET 7 69 #define DCCP_PKT_SYNC 8 70 #define DCCP_PKT_SYNCACK 9 71 72 /* Generic protocol header (RFC 4340, Section 5.1.) */ 73 typedef struct dccphdr_s { 74 uint8_t dh_lport[2]; 75 uint8_t dh_fport[2]; 76 uint8_t dh_offset; 77 uint8_t dh_ccval:4, 78 dh_cscov:4; 79 uint8_t db_sum[2]; 80 uint8_t dh_reserved:3, 81 dh_type:4, 82 dh_x:1; 83 uint8_t dh_res_seq; 84 uint8_t dh_seq[2]; 85 } dccph_t; 86 87 88 /* Generic protocol header aligned (RFC 4340, Section 5.1.) */ 89 typedef struct dccphdra_s { 90 in_port_t dha_lport; /* Source port */ 91 in_port_t dha_fport; /* Destination port */ 92 uint8_t dha_offset; /* Data offset */ 93 uint8_t dha_ccval:4, /* */ 94 dha_cscov:4; /* */ 95 uint16_t dha_sum; /* Checksum */ 96 uint8_t dha_x:1, /* Reserved */ 97 dha_type:4, /* Packet type */ 98 dha_reserved:3; /* Header type */ 99 uint8_t dha_res_seq; 100 uint16_t dha_seq; /* Partial sequence number */ 101 } dccpha_t; 102 103 typedef struct dccphdra_ext_s { 104 uint32_t dha_ext_seq; 105 } dccpha_ext_t; 106 107 /* Acknowledgement number */ 108 typedef struct dccphdra_ack { 109 uint16_t dha_ack_reserved; 110 uint16_t dha_ack_high; 111 uint32_t dha_ack_low; 112 } dccpha_ack_t; 113 114 typedef struct dccphdra_srv { 115 uint32_t dha_srv_code; 116 } dccpha_srv_t; 117 118 typedef struct dccphdra_reset { 119 uint8_t dha_reset_code; 120 uint8_t dha_reset_data[3]; 121 } dccpha_reset_t; 122 123 /* Internal DCCP structure */ 124 typedef struct dccp_s { 125 126 conn_t *dccp_connp; /* Backpointer to conn_t */ 127 dccp_stack_t *dccp_dccps; /* Backpointer to dccp_stack_t */ 128 129 uint32_t dccp_state; 130 131 /* Bind related */ 132 struct dccp_s *dccp_bind_hash; /* Bind hash chain */ 133 struct dccp_s *dccp_bind_hash_port; /* Bound to the same port */ 134 struct dccp_s **dccp_ptpbhn; 135 136 struct dccphdra_s *dccp_dccpha; /* Template header */ 137 138 mblk_t *dccp_xmit_head; 139 140 sock_connid_t dccp_connid; 141 } dccp_t; 142 143 #define dccps_smallest_nonpriv_port dccps_propinfo_tbl[0].prop_cur_uval 144 #define dccps_smallest_anon_port dccps_propinfo_tbl[1].prop_cur_uval 145 #define dccps_largest_anon_port dccps_propinfo_tbl[2].prop_cur_uval 146 147 #define dccps_dbg dccps_propinfo_tbl[4].prop_cur_uval 148 #define dccps_rst_sent_rate_enabled dccps_propinfo_tbl[5].prop_cur_uval 149 #define dccps_rst_sent_rate dccps_propinfo_tbl[6].prop_cur_uval 150 151 typedef struct dccp_df_s { 152 struct dccp_s *df_dccp; 153 kmutex_t df_lock; 154 uchar_t df_pad[TF_CACHEL_PAD - (sizeof (dccp_t *) + 155 sizeof (kmutex_t))]; 156 } dccp_df_t; 157 158 extern struct qinit dccp_rinitv4, dccp_rinitv6; 159 160 extern optdb_obj_t dccp_opt_obj; 161 extern uint_t dccp_max_optsize; 162 163 /* 164 * Functions in dccp.c 165 */ 166 extern int dccp_build_hdrs(dccp_t *); 167 extern conn_t *dccp_create_common(cred_t *, boolean_t, boolean_t, int *); 168 extern void dccp_close_common(conn_t *); 169 extern int dccp_do_bind(conn_t *, struct sockaddr *, socklen_t, cred_t *, 170 boolean_t); 171 extern int dccp_do_unbind(conn_t *); 172 extern int dccp_do_listen(conn_t *, struct sockaddr *, socklen_t, int, 173 cred_t *, boolean_t); 174 extern int dccp_do_connect(conn_t *, const struct sockaddr *, socklen_t, 175 cred_t *, pid_t); 176 extern void dccp_init_values(dccp_t *, dccp_t *); 177 extern void *dccp_get_conn(void *, dccp_stack_t *); 178 extern int dccp_set_destination(dccp_t *dccp); 179 180 /* 181 * Bind related functions in dccp_bind.c 182 */ 183 extern void dccp_bind_hash_insert(dccp_df_t *, dccp_t *, int); 184 extern void dccp_bind_hash_remove(dccp_t *); 185 extern int dccp_bind_check(conn_t *, struct sockaddr *, socklen_t, cred_t *cr, 186 boolean_t); 187 extern in_port_t dccp_bindi(dccp_t *, in_port_t, const in6_addr_t *, int, 188 boolean_t, boolean_t, boolean_t); 189 extern in_port_t dccp_update_next_port(in_port_t, const dccp_t *, boolean_t); 190 191 /* 192 * MIB-II and kstat related functions. 193 */ 194 extern mblk_t *dccp_snmp_get(queue_t *, mblk_t *); 195 196 /* 197 * Socket related functions in dccp_socket.c 198 */ 199 extern sock_lower_handle_t dccp_create(int, int, int, sock_downcalls_t **, 200 uint_t *, int *, int, cred_t *); 201 extern int dccp_fallback(sock_lower_handle_t, queue_t *, boolean_t, 202 so_proto_quiesced_cb_t, sock_quiesce_arg_t *); 203 204 /* 205 * Input path related functions in dccp_input.c 206 */ 207 extern void dccp_icmp_input(void *, mblk_t *, void *, ip_recv_attr_t *); 208 extern void dccp_input_data(void *, mblk_t *, void *, ip_recv_attr_t *); 209 extern void dccp_rsrv(queue_t *); 210 extern void dccp_input_listener_unbound(void *, mblk_t *, void *, 211 ip_recv_attr_t *); 212 extern boolean_t dccp_verifyicmp(conn_t *, void *, icmph_t *, icmp6_t *, 213 ip_recv_attr_t *); 214 /* 215 * Output path related functions in dccp_output.c 216 */ 217 extern void dccp_wput(queue_t *, mblk_t *); 218 extern void dccp_xmit_listeners_reset(mblk_t *, ip_recv_attr_t *, 219 ip_stack_t *, conn_t *); 220 extern void dccp_send_synack(void *, mblk_t *, void *, ip_recv_attr_t *); 221 extern mblk_t *dccp_xmit_mp(dccp_t *, mblk_t *, int32_t, int32_t *, 222 mblk_t **, uint32_t, boolean_t, uint32_t *, boolean_t); 223 extern mblk_t *dccp_generate_packet(conn_t *, mblk_t *); 224 /* 225 * Options related functions in dccp_opt_data.c 226 */ 227 extern int dccp_opt_get(conn_t *, int, int, uchar_t *); 228 extern int dccp_opt_set(conn_t *, uint_t, int, int, uint_t, uchar_t *, 229 uint_t *, uchar_t *, void *, cred_t *); 230 231 /* 232 * dccp_tpi.c 233 */ 234 extern void dccp_err_ack(dccp_t *, mblk_t *, int, int); 235 extern void dccp_tpi_connect(dccp_t *, mblk_t *); 236 extern int dccp_tpi_close(queue_t *, int); 237 extern int dccp_tpi_opt_get(queue_t *, t_scalar_t, t_scalar_t, uchar_t *); 238 extern int dccp_tpi_opt_set(queue_t *, uint_t, int, int, uint_t, uchar_t *, 239 uint_t *, uchar_t *, void *, cred_t *); 240 241 #endif /* _KERNEL */ 242 243 #ifdef __cplusplus 244 } 245 #endif 246 247 #endif /* _INET_DCCP_IMPL_H */