1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 #ifndef _UAPI_LINUX_DCCP_H 3 #define _UAPI_LINUX_DCCP_H 4 5 #include <linux/types.h> 6 #include <asm/byteorder.h> 7 8 /** 9 * struct dccp_hdr - generic part of DCCP packet header 10 * 11 * @dccph_sport - Relevant port on the endpoint that sent this packet 12 * @dccph_dport - Relevant port on the other endpoint 13 * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words 14 * @dccph_ccval - Used by the HC-Sender CCID 15 * @dccph_cscov - Parts of the packet that are covered by the Checksum field 16 * @dccph_checksum - Internet checksum, depends on dccph_cscov 17 * @dccph_x - 0 = 24 bit sequence number, 1 = 48 18 * @dccph_type - packet type, see DCCP_PKT_ prefixed macros 19 * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x 20 */ 21 struct dccp_hdr { 22 __be16 dccph_sport, 23 dccph_dport; 24 __u8 dccph_doff; 25 #if defined(__LITTLE_ENDIAN_BITFIELD) 26 __u8 dccph_cscov:4, 27 dccph_ccval:4; 28 #elif defined(__BIG_ENDIAN_BITFIELD) 29 __u8 dccph_ccval:4, 30 dccph_cscov:4; 31 #else 32 #error "Adjust your <asm/byteorder.h> defines" 33 #endif 34 __sum16 dccph_checksum; 35 #if defined(__LITTLE_ENDIAN_BITFIELD) 36 __u8 dccph_x:1, 37 dccph_type:4, 38 dccph_reserved:3; 39 #elif defined(__BIG_ENDIAN_BITFIELD) 40 __u8 dccph_reserved:3, 41 dccph_type:4, 42 dccph_x:1; 43 #else 44 #error "Adjust your <asm/byteorder.h> defines" 45 #endif 46 __u8 dccph_seq2; 47 __be16 dccph_seq; 48 }; 49 50 /** 51 * struct dccp_hdr_ext - the low bits of a 48 bit seq packet 52 * 53 * @dccph_seq_low - low 24 bits of a 48 bit seq packet 54 */ 55 struct dccp_hdr_ext { 56 __be32 dccph_seq_low; 57 }; 58 59 /** 60 * struct dccp_hdr_request - Connection initiation request header 61 * 62 * @dccph_req_service - Service to which the client app wants to connect 63 */ 64 struct dccp_hdr_request { 65 __be32 dccph_req_service; 66 }; 67 /** 68 * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets 69 * 70 * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR 71 * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR 72 */ 73 struct dccp_hdr_ack_bits { 74 __be16 dccph_reserved1; 75 __be16 dccph_ack_nr_high; 76 __be32 dccph_ack_nr_low; 77 }; 78 /** 79 * struct dccp_hdr_response - Connection initiation response header 80 * 81 * @dccph_resp_ack - 48 bit Acknowledgment Number Subheader (5.3) 82 * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request 83 */ 84 struct dccp_hdr_response { 85 struct dccp_hdr_ack_bits dccph_resp_ack; 86 __be32 dccph_resp_service; 87 }; 88 89 /** 90 * struct dccp_hdr_reset - Unconditionally shut down a connection 91 * 92 * @dccph_reset_ack - 48 bit Acknowledgment Number Subheader (5.6) 93 * @dccph_reset_code - one of %dccp_reset_codes 94 * @dccph_reset_data - the Data 1 ... Data 3 fields from 5.6 95 */ 96 struct dccp_hdr_reset { 97 struct dccp_hdr_ack_bits dccph_reset_ack; 98 __u8 dccph_reset_code, 99 dccph_reset_data[3]; 100 }; 101 102 enum dccp_pkt_type { 103 DCCP_PKT_REQUEST = 0, 104 DCCP_PKT_RESPONSE, 105 DCCP_PKT_DATA, 106 DCCP_PKT_ACK, 107 DCCP_PKT_DATAACK, 108 DCCP_PKT_CLOSEREQ, 109 DCCP_PKT_CLOSE, 110 DCCP_PKT_RESET, 111 DCCP_PKT_SYNC, 112 DCCP_PKT_SYNCACK, 113 DCCP_PKT_INVALID, 114 }; 115 116 #define DCCP_NR_PKT_TYPES DCCP_PKT_INVALID 117 dccp_packet_hdr_len(const __u8 type)118 static inline unsigned int dccp_packet_hdr_len(const __u8 type) 119 { 120 if (type == DCCP_PKT_DATA) 121 return 0; 122 if (type == DCCP_PKT_DATAACK || 123 type == DCCP_PKT_ACK || 124 type == DCCP_PKT_SYNC || 125 type == DCCP_PKT_SYNCACK || 126 type == DCCP_PKT_CLOSE || 127 type == DCCP_PKT_CLOSEREQ) 128 return sizeof(struct dccp_hdr_ack_bits); 129 if (type == DCCP_PKT_REQUEST) 130 return sizeof(struct dccp_hdr_request); 131 if (type == DCCP_PKT_RESPONSE) 132 return sizeof(struct dccp_hdr_response); 133 return sizeof(struct dccp_hdr_reset); 134 } 135 enum dccp_reset_codes { 136 DCCP_RESET_CODE_UNSPECIFIED = 0, 137 DCCP_RESET_CODE_CLOSED, 138 DCCP_RESET_CODE_ABORTED, 139 DCCP_RESET_CODE_NO_CONNECTION, 140 DCCP_RESET_CODE_PACKET_ERROR, 141 DCCP_RESET_CODE_OPTION_ERROR, 142 DCCP_RESET_CODE_MANDATORY_ERROR, 143 DCCP_RESET_CODE_CONNECTION_REFUSED, 144 DCCP_RESET_CODE_BAD_SERVICE_CODE, 145 DCCP_RESET_CODE_TOO_BUSY, 146 DCCP_RESET_CODE_BAD_INIT_COOKIE, 147 DCCP_RESET_CODE_AGGRESSION_PENALTY, 148 149 DCCP_MAX_RESET_CODES /* Leave at the end! */ 150 }; 151 152 /* DCCP options */ 153 enum { 154 DCCPO_PADDING = 0, 155 DCCPO_MANDATORY = 1, 156 DCCPO_MIN_RESERVED = 3, 157 DCCPO_MAX_RESERVED = 31, 158 DCCPO_CHANGE_L = 32, 159 DCCPO_CONFIRM_L = 33, 160 DCCPO_CHANGE_R = 34, 161 DCCPO_CONFIRM_R = 35, 162 DCCPO_NDP_COUNT = 37, 163 DCCPO_ACK_VECTOR_0 = 38, 164 DCCPO_ACK_VECTOR_1 = 39, 165 DCCPO_TIMESTAMP = 41, 166 DCCPO_TIMESTAMP_ECHO = 42, 167 DCCPO_ELAPSED_TIME = 43, 168 DCCPO_MAX = 45, 169 DCCPO_MIN_RX_CCID_SPECIFIC = 128, /* from sender to receiver */ 170 DCCPO_MAX_RX_CCID_SPECIFIC = 191, 171 DCCPO_MIN_TX_CCID_SPECIFIC = 192, /* from receiver to sender */ 172 DCCPO_MAX_TX_CCID_SPECIFIC = 255, 173 }; 174 /* maximum size of a single TLV-encoded DCCP option (sans type/len bytes) */ 175 #define DCCP_SINGLE_OPT_MAXLEN 253 176 177 /* DCCP CCIDS */ 178 enum { 179 DCCPC_CCID2 = 2, 180 DCCPC_CCID3 = 3, 181 }; 182 183 /* DCCP features (RFC 4340 section 6.4) */ 184 enum dccp_feature_numbers { 185 DCCPF_RESERVED = 0, 186 DCCPF_CCID = 1, 187 DCCPF_SHORT_SEQNOS = 2, 188 DCCPF_SEQUENCE_WINDOW = 3, 189 DCCPF_ECN_INCAPABLE = 4, 190 DCCPF_ACK_RATIO = 5, 191 DCCPF_SEND_ACK_VECTOR = 6, 192 DCCPF_SEND_NDP_COUNT = 7, 193 DCCPF_MIN_CSUM_COVER = 8, 194 DCCPF_DATA_CHECKSUM = 9, 195 /* 10-127 reserved */ 196 DCCPF_MIN_CCID_SPECIFIC = 128, 197 DCCPF_SEND_LEV_RATE = 192, /* RFC 4342, sec. 8.4 */ 198 DCCPF_MAX_CCID_SPECIFIC = 255, 199 }; 200 201 /* DCCP socket control message types for cmsg */ 202 enum dccp_cmsg_type { 203 DCCP_SCM_PRIORITY = 1, 204 DCCP_SCM_QPOLICY_MAX = 0xFFFF, 205 /* ^-- Up to here reserved exclusively for qpolicy parameters */ 206 DCCP_SCM_MAX 207 }; 208 209 /* DCCP priorities for outgoing/queued packets */ 210 enum dccp_packet_dequeueing_policy { 211 DCCPQ_POLICY_SIMPLE, 212 DCCPQ_POLICY_PRIO, 213 DCCPQ_POLICY_MAX 214 }; 215 216 /* DCCP socket options */ 217 #define DCCP_SOCKOPT_PACKET_SIZE 1 /* XXX deprecated, without effect */ 218 #define DCCP_SOCKOPT_SERVICE 2 219 #define DCCP_SOCKOPT_CHANGE_L 3 220 #define DCCP_SOCKOPT_CHANGE_R 4 221 #define DCCP_SOCKOPT_GET_CUR_MPS 5 222 #define DCCP_SOCKOPT_SERVER_TIMEWAIT 6 223 #define DCCP_SOCKOPT_SEND_CSCOV 10 224 #define DCCP_SOCKOPT_RECV_CSCOV 11 225 #define DCCP_SOCKOPT_AVAILABLE_CCIDS 12 226 #define DCCP_SOCKOPT_CCID 13 227 #define DCCP_SOCKOPT_TX_CCID 14 228 #define DCCP_SOCKOPT_RX_CCID 15 229 #define DCCP_SOCKOPT_QPOLICY_ID 16 230 #define DCCP_SOCKOPT_QPOLICY_TXQLEN 17 231 #define DCCP_SOCKOPT_CCID_RX_INFO 128 232 #define DCCP_SOCKOPT_CCID_TX_INFO 192 233 234 /* maximum number of services provided on the same listening port */ 235 #define DCCP_SERVICE_LIST_MAX_LEN 32 236 237 238 #endif /* _UAPI_LINUX_DCCP_H */ 239