1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_DCCP_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_DCCP_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h> 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/byteorder.h> 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr - generic part of DCCP packet header 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_sport - Relevant port on the endpoint that sent this packet 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_dport - Relevant port on the other endpoint 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_doff - Data Offset from the start of the DCCP header, in 32-bit words 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_ccval - Used by the HC-Sender CCID 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_cscov - Parts of the packet that are covered by the Checksum field 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_checksum - Internet checksum, depends on dccph_cscov 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_x - 0 = 24 bit sequence number, 1 = 48 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_type - packet type, see DCCP_PKT_ prefixed macros 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_seq - sequence number high or low order 24 bits, depends on dccph_x 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr { 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be16 dccph_sport, 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccph_dport; 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccph_doff; 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(__LITTLE_ENDIAN_BITFIELD) 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccph_cscov:4, 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccph_ccval:4; 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#elif defined(__BIG_ENDIAN_BITFIELD) 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccph_ccval:4, 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccph_cscov:4; 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#error "Adjust your <asm/byteorder.h> defines" 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u16 dccph_checksum; 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(__LITTLE_ENDIAN_BITFIELD) 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccph_x:1, 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccph_type:4, 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccph_reserved:3; 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#elif defined(__BIG_ENDIAN_BITFIELD) 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccph_reserved:3, 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccph_type:4, 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccph_x:1; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#error "Adjust your <asm/byteorder.h> defines" 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccph_seq2; 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be16 dccph_seq; 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_ext - the low bits of a 48 bit seq packet 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_seq_low - low 24 bits of a 48 bit seq packet 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_ext { 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 dccph_seq_low; 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_request - Conection initiation request header 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_req_service - Service to which the client app wants to connect 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_req_options - list of options (must be a multiple of 32 bits 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_request { 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 dccph_req_service; 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_ack_bits - acknowledgment bits common to most packets 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_ack_bits { 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be16 dccph_reserved1; 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be16 dccph_ack_nr_high; 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 dccph_ack_nr_low; 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_response - Conection initiation response header 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_ack_nr_high - 48 bit ack number high order bits, contains GSR 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_ack_nr_low - 48 bit ack number low order bits, contains GSR 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_service - Echoes the Service Code on a received DCCP-Request 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_resp_options - list of options (must be a multiple of 32 bits 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_response { 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dccp_hdr_ack_bits dccph_resp_ack; 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 dccph_resp_service; 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_hdr_reset - Unconditionally shut down a connection 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_reset_service - Echoes the Service Code on a received DCCP-Request 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccph_reset_options - list of options (must be a multiple of 32 bits 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_hdr_reset { 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dccp_hdr_ack_bits dccph_reset_ack; 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccph_reset_code, 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccph_reset_data[3]; 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum dccp_pkt_type { 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_REQUEST = 0, 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_RESPONSE, 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_DATA, 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_ACK, 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_DATAACK, 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_CLOSEREQ, 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_CLOSE, 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_RESET, 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_SYNC, 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_SYNCACK, 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PKT_INVALID, 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_NR_PKT_TYPES DCCP_PKT_INVALID 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int dccp_packet_hdr_len(const __u8 type) 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (type == DCCP_PKT_DATA) 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (type == DCCP_PKT_DATAACK || 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru type == DCCP_PKT_ACK || 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru type == DCCP_PKT_SYNC || 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru type == DCCP_PKT_SYNCACK || 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru type == DCCP_PKT_CLOSE || 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru type == DCCP_PKT_CLOSEREQ) 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return sizeof(struct dccp_hdr_ack_bits); 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (type == DCCP_PKT_REQUEST) 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return sizeof(struct dccp_hdr_request); 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (type == DCCP_PKT_RESPONSE) 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return sizeof(struct dccp_hdr_response); 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return sizeof(struct dccp_hdr_reset); 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum dccp_reset_codes { 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_UNSPECIFIED = 0, 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_CLOSED, 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_ABORTED, 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_NO_CONNECTION, 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_PACKET_ERROR, 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_OPTION_ERROR, 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_MANDATORY_ERROR, 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_CONNECTION_REFUSED, 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_BAD_SERVICE_CODE, 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_TOO_BUSY, 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_BAD_INIT_COOKIE, 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESET_CODE_AGGRESSION_PENALTY, 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* DCCP options */ 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum { 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_PADDING = 0, 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_MANDATORY = 1, 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_MIN_RESERVED = 3, 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_MAX_RESERVED = 31, 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_CHANGE_L = 32, 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_CONFIRM_L = 33, 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_CHANGE_R = 34, 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_CONFIRM_R = 35, 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_NDP_COUNT = 37, 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_ACK_VECTOR_0 = 38, 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_ACK_VECTOR_1 = 39, 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_TIMESTAMP = 41, 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_TIMESTAMP_ECHO = 42, 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_ELAPSED_TIME = 43, 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_MAX = 45, 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_MIN_CCID_SPECIFIC = 128, 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPO_MAX_CCID_SPECIFIC = 255, 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* DCCP features */ 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum { 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_RESERVED = 0, 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_CCID = 1, 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_SEQUENCE_WINDOW = 3, 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_ACK_RATIO = 5, 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_SEND_ACK_VECTOR = 6, 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_SEND_NDP_COUNT = 7, 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 10-127 reserved */ 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_MIN_CCID_SPECIFIC = 128, 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_MAX_CCID_SPECIFIC = 255, 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* this structure is argument to DCCP_SOCKOPT_CHANGE_X */ 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_so_feat { 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpsf_feat; 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 *dccpsf_val; 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpsf_len; 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* DCCP socket options */ 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_PACKET_SIZE 1 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_SERVICE 2 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_CHANGE_L 3 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_CHANGE_R 4 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_CCID_RX_INFO 128 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SOCKOPT_CCID_TX_INFO 192 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SERVICE_LIST_MAX_LEN 32 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/in.h> 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/list.h> 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/uio.h> 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/workqueue.h> 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <net/inet_connection_sock.h> 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <net/inet_sock.h> 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <net/inet_timewait_sock.h> 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <net/tcp_states.h> 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum dccp_state { 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_OPEN = TCP_ESTABLISHED, 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_REQUESTING = TCP_SYN_SENT, 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_PARTOPEN = TCP_FIN_WAIT1, /* FIXME: 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru This mapping is horrible, but TCP has 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru no matching state for DCCP_PARTOPEN, 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru as TCP_SYN_RECV is already used by 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESPOND, why don't stop using TCP 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru mapping of states? OK, now we don't use 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru sk_stream_sendmsg anymore, so doesn't 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru seem to exist any reason for us to 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru do the TCP mapping here */ 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_LISTEN = TCP_LISTEN, 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_RESPOND = TCP_SYN_RECV, 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_CLOSING = TCP_CLOSING, 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_TIME_WAIT = TCP_TIME_WAIT, 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_CLOSED = TCP_CLOSE, 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_MAX_STATES = TCP_MAX_STATES, 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_STATE_MASK 0xf 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_ACTION_FIN (1<<7) 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum { 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_OPEN = TCPF_ESTABLISHED, 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_REQUESTING = TCPF_SYN_SENT, 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_PARTOPEN = TCPF_FIN_WAIT1, 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_LISTEN = TCPF_LISTEN, 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_RESPOND = TCPF_SYN_RECV, 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_CLOSING = TCPF_CLOSING, 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_TIME_WAIT = TCPF_TIME_WAIT, 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCPF_CLOSED = TCPF_CLOSE, 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr *dccp_hdr(const struct sk_buff *skb) 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_hdr *)skb->h.raw; 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_ext *dccp_hdrx(const struct sk_buff *skb) 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_hdr_ext *)(skb->h.raw + sizeof(struct dccp_hdr)); 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int __dccp_basic_hdr_len(const struct dccp_hdr *dh) 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return sizeof(*dh) + (dh->dccph_x ? sizeof(struct dccp_hdr_ext) : 0); 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int dccp_basic_hdr_len(const struct sk_buff *skb) 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const struct dccp_hdr *dh = dccp_hdr(skb); 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __dccp_basic_hdr_len(dh); 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline __u64 dccp_hdr_seq(const struct sk_buff *skb) 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const struct dccp_hdr *dh = dccp_hdr(skb); 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 seq_nr = ntohs(dh->dccph_seq); 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (dh->dccph_x != 0) 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru seq_nr = (seq_nr << 32) + ntohl(dccp_hdrx(skb)->dccph_seq_low); 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru seq_nr += (u32)dh->dccph_seq2 << 16; 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return seq_nr; 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_request *dccp_hdr_request(struct sk_buff *skb) 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_hdr_request *)(skb->h.raw + dccp_basic_hdr_len(skb)); 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_ack_bits *dccp_hdr_ack_bits(const struct sk_buff *skb) 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_hdr_ack_bits *)(skb->h.raw + dccp_basic_hdr_len(skb)); 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline u64 dccp_hdr_ack_seq(const struct sk_buff *skb) 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const struct dccp_hdr_ack_bits *dhack = dccp_hdr_ack_bits(skb); 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ((u64)ntohs(dhack->dccph_ack_nr_high) << 32) + ntohl(dhack->dccph_ack_nr_low); 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_response *dccp_hdr_response(struct sk_buff *skb) 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_hdr_response *)(skb->h.raw + dccp_basic_hdr_len(skb)); 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_hdr_reset *dccp_hdr_reset(struct sk_buff *skb) 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_hdr_reset *)(skb->h.raw + dccp_basic_hdr_len(skb)); 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int __dccp_hdr_len(const struct dccp_hdr *dh) 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __dccp_basic_hdr_len(dh) + 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dccp_packet_hdr_len(dh->dccph_type); 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned int dccp_hdr_len(const struct sk_buff *skb) 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __dccp_hdr_len(dccp_hdr(skb)); 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* initial values for each feature */ 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_SEQUENCE_WINDOW 100 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_ACK_RATIO 2 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_CCID 2 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_SEND_ACK_VECTOR 1 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* FIXME: for now we're default to 1 but it should really be 0 */ 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCPF_INITIAL_SEND_NDP_COUNT 1 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_NDP_LIMIT 0xFFFFFF 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_minisock - Minimal DCCP connection representation 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Will be used to pass the state from dccp_request_sock to dccp_sock. 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccpms_sequence_window - Sequence Window Feature (section 7.5.2) 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccpms_ccid - Congestion Control Id (CCID) (section 10) 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccpms_send_ack_vector - Send Ack Vector Feature (section 11.5) 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccpms_send_ndp_count - Send NDP Count Feature (7.7.2) 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_minisock { 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccpms_sequence_window; 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpms_rx_ccid; 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpms_tx_ccid; 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpms_send_ack_vector; 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpms_send_ndp_count; 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpms_ack_ratio; 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head dccpms_pending; 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head dccpms_conf; 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_opt_conf { 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 *dccpoc_val; 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpoc_len; 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_opt_pend { 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head dccpop_node; 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpop_type; 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpop_feat; 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 *dccpop_val; 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccpop_len; 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int dccpop_conf; 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dccp_opt_conf *dccpop_sc; 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __dccp_minisock_init(struct dccp_minisock *dmsk); 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void dccp_minisock_init(struct dccp_minisock *dmsk); 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int dccp_parse_options(struct sock *sk, struct sk_buff *skb); 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_request_sock { 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct inet_request_sock dreq_inet_rsk; 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dreq_iss; 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dreq_isr; 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 dreq_service; 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_request_sock *dccp_rsk(const struct request_sock *req) 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_request_sock *)req; 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct inet_timewait_death_row dccp_death_row; 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_options_received { 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u32 dccpor_ndp; /* only 24 bits */ 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u32 dccpor_timestamp; 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u32 dccpor_timestamp_echo; 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u32 dccpor_elapsed_time; 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct ccid; 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum dccp_role { 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_ROLE_UNDEFINED, 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_ROLE_LISTEN, 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_ROLE_CLIENT, 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru DCCP_ROLE_SERVER, 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_service_list { 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 dccpsl_nr; 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 dccpsl_list[0]; 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1) 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int dccp_list_has_service(const struct dccp_service_list *sl, 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const __be32 service) 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (likely(sl != NULL)) { 412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u32 i = sl->dccpsl_nr; 413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru while (i--) 414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (sl->dccpsl_list[i] == service) 415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_ackvec; 421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct dccp_sock - DCCP socket state 424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_swl - sequence number window low 426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_swh - sequence number window high 427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_awl - acknowledgement number window low 428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_awh - acknowledgement number window high 429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_iss - initial sequence number sent 430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_isr - initial sequence number received 431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_osr - first OPEN sequence number received 432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_gss - greatest sequence number sent 433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_gsr - greatest valid sequence number received 434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_gar - greatest valid ack number received on a non-Sync; initialized to %dccps_iss 435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_timestamp_time - time of latest TIMESTAMP option 436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_timestamp_echo - latest timestamp received on a TIMESTAMP option 437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_packet_size - Set thru setsockopt 438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_role - Role of this sock, one of %dccp_role 439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_ndp_count - number of Non Data Packets since last data packet 440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dccps_hc_rx_ackvec - rx half connection ack vector 441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct dccp_sock { 443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* inet_connection_sock has to be the first member of dccp_sock */ 444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct inet_connection_sock dccps_inet_connection; 445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_swl; 446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_swh; 447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_awl; 448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_awh; 449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_iss; 450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_isr; 451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_osr; 452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_gss; 453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_gsr; 454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 dccps_gar; 455c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __be32 dccps_service; 456c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dccp_service_list *dccps_service_list; 457c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct timeval dccps_timestamp_time; 458c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 dccps_timestamp_echo; 459c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 dccps_packet_size; 460c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u16 dccps_l_ack_ratio; 461c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u16 dccps_r_ack_ratio; 462c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long dccps_ndp_count; 463c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 dccps_mss_cache; 464c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dccp_minisock dccps_minisock; 465c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dccp_ackvec *dccps_hc_rx_ackvec; 466c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct ccid *dccps_hc_rx_ccid; 467c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct ccid *dccps_hc_tx_ccid; 468c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dccp_options_received dccps_options_received; 469c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct timeval dccps_epoch; 470c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru enum dccp_role dccps_role:2; 471c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccps_hc_rx_insert_options:1; 472c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 dccps_hc_tx_insert_options:1; 473c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 474c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 475c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_sock *dccp_sk(const struct sock *sk) 476c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 477c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_sock *)sk; 478c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 479c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 480c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct dccp_minisock *dccp_msk(const struct sock *sk) 481c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 482c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (struct dccp_minisock *)&dccp_sk(sk)->dccps_minisock; 483c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 484c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 485c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int dccp_service_not_initialized(const struct sock *sk) 486c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 487c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return dccp_sk(sk)->dccps_service == DCCP_SERVICE_INVALID_VALUE; 488c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 489c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 490c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline const char *dccp_role(const struct sock *sk) 491c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 492c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru switch (dccp_sk(sk)->dccps_role) { 493c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case DCCP_ROLE_UNDEFINED: return "undefined"; 494c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case DCCP_ROLE_LISTEN: return "listen"; 495c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case DCCP_ROLE_SERVER: return "server"; 496c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru case DCCP_ROLE_CLIENT: return "client"; 497c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } 498c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return NULL; 499c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 500c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 501c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 502c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 503c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_DCCP_H */ 504