home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / dccp.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  13.3 KB  |  504 lines

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