Blame view

net/dccp/feat.h 4.64 KB
afe00251d   Andrea Bittau   [DCCP]: Initial f...
1
2
3
4
5
  #ifndef _DCCP_FEAT_H
  #define _DCCP_FEAT_H
  /*
   *  net/dccp/feat.h
   *
63b8e2861   Gerrit Renker   dccp: Clean up ol...
6
7
   *  Feature negotiation for the DCCP protocol (RFC 4340, section 6)
   *  Copyright (c) 2008 Gerrit Renker <gerrit@erg.abdn.ac.uk>
afe00251d   Andrea Bittau   [DCCP]: Initial f...
8
9
   *  Copyright (c) 2005 Andrea Bittau <a.bittau@cs.ucl.ac.uk>
   *
63b8e2861   Gerrit Renker   dccp: Clean up ol...
10
11
12
   *  This program is free software; you can redistribute it and/or modify it
   *  under the terms of the GNU General Public License version 2 as
   *  published by the Free Software Foundation.
afe00251d   Andrea Bittau   [DCCP]: Initial f...
13
   */
afe00251d   Andrea Bittau   [DCCP]: Initial f...
14
  #include <linux/types.h>
c02fdc0e8   Gerrit Renker   [DCCP]: Make feat...
15
  #include "dccp.h"
afe00251d   Andrea Bittau   [DCCP]: Initial f...
16

e8ef967a5   Gerrit Renker   dccp: Registratio...
17
18
19
20
21
22
23
24
  /*
   * Known limit values
   */
  /* Ack Ratio takes 2-byte integer values (11.3) */
  #define DCCPF_ACK_RATIO_MAX	0xFFFF
  /* Wmin=32 and Wmax=2^46-1 from 7.5.2 */
  #define DCCPF_SEQ_WMIN		32
  #define DCCPF_SEQ_WMAX		0x3FFFFFFFFFFFull
b20a9c24d   Gerrit Renker   dccp: Set per-con...
25
26
  /* Maximum number of SP values that fit in a single (Confirm) option */
  #define DCCP_FEAT_MAX_SP_VALS	(DCCP_SINGLE_OPT_MAXLEN - 2)
e8ef967a5   Gerrit Renker   dccp: Registratio...
27

bd012f2e7   Gerrit Renker   dccp: Basic data ...
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  enum dccp_feat_type {
  	FEAT_AT_RX   = 1,	/* located at RX side of half-connection  */
  	FEAT_AT_TX   = 2,	/* located at TX side of half-connection  */
  	FEAT_SP      = 4,	/* server-priority reconciliation (6.3.1) */
  	FEAT_NN	     = 8,	/* non-negotiable reconciliation (6.3.2)  */
  	FEAT_UNKNOWN = 0xFF	/* not understood or invalid feature	  */
  };
  
  enum dccp_feat_state {
  	FEAT_DEFAULT = 0,	/* using default values from 6.4 */
  	FEAT_INITIALISING,	/* feature is being initialised  */
  	FEAT_CHANGING,		/* Change sent but not confirmed yet */
  	FEAT_UNSTABLE,		/* local modification in state CHANGING */
  	FEAT_STABLE		/* both ends (think they) agree */
  };
  
  /**
   * dccp_feat_val  -  Container for SP or NN feature values
   * @nn:     single NN value
   * @sp.vec: single SP value plus optional preference list
   * @sp.len: length of @sp.vec in bytes
   */
  typedef union {
  	u64 nn;
  	struct {
  		u8	*vec;
  		u8	len;
  	}   sp;
  } dccp_feat_val;
  
  /**
   * struct feat_entry  -  Data structure to perform feature negotiation
   * @val: feature's current value (SP features may have preference list)
   * @state: feature's current state
   * @feat_num: one of %dccp_feature_numbers
   * @needs_mandatory: whether Mandatory options should be sent
   * @needs_confirm: whether to send a Confirm instead of a Change
   * @empty_confirm: whether to send an empty Confirm (depends on @needs_confirm)
   * @is_local: feature location (1) or feature-remote (0)
   * @node: list pointers, entries arranged in FIFO order
   */
  struct dccp_feat_entry {
  	dccp_feat_val           val;
  	enum dccp_feat_state    state:8;
  	u8                      feat_num;
  
  	bool			needs_mandatory,
  				needs_confirm,
  				empty_confirm,
  				is_local;
  
  	struct list_head	node;
  };
  
  static inline u8 dccp_feat_genopt(struct dccp_feat_entry *entry)
  {
  	if (entry->needs_confirm)
  		return entry->is_local ? DCCPO_CONFIRM_L : DCCPO_CONFIRM_R;
  	return entry->is_local ? DCCPO_CHANGE_L : DCCPO_CHANGE_R;
  }
e8ef967a5   Gerrit Renker   dccp: Registratio...
88
89
90
91
92
93
94
95
96
97
98
99
100
  /**
   * struct ccid_dependency  -  Track changes resulting from choosing a CCID
   * @dependent_feat: one of %dccp_feature_numbers
   * @is_local: local (1) or remote (0) @dependent_feat
   * @is_mandatory: whether presence of @dependent_feat is mission-critical or not
   * @val: corresponding default value for @dependent_feat (u8 is sufficient here)
   */
  struct ccid_dependency {
  	u8	dependent_feat;
  	bool	is_local:1,
  		is_mandatory:1;
  	u8	val;
  };
883ca833e   Gerrit Renker   dccp: Initialisat...
101
102
103
104
105
106
  /*
   * Sysctls to seed defaults for feature negotiation
   */
  extern unsigned long sysctl_dccp_sequence_window;
  extern int	     sysctl_dccp_rx_ccid;
  extern int	     sysctl_dccp_tx_ccid;
f90f92eed   Gerrit Renker   dccp: Initialisat...
107
  extern int  dccp_feat_init(struct sock *sk);
883ca833e   Gerrit Renker   dccp: Initialisat...
108
  extern void dccp_feat_initialise_sysctls(void);
49aebc66d   Gerrit Renker   dccp: Deprecate o...
109
110
  extern int  dccp_feat_register_sp(struct sock *sk, u8 feat, u8 is_local,
  				  u8 const *list, u8 len);
e77b8363b   Gerrit Renker   dccp: Process inc...
111
112
  extern int  dccp_feat_parse_options(struct sock *, struct dccp_request_sock *,
  				    u8 mand, u8 opt, u8 feat, u8 *val, u8 len);
ac75773c2   Gerrit Renker   dccp: Per-socket ...
113
  extern int  dccp_feat_clone_list(struct list_head const *, struct list_head *);
afe00251d   Andrea Bittau   [DCCP]: Initial f...
114

02fa460ef   Gerrit Renker   dccp: Increase th...
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  /*
   * Encoding variable-length options and their maximum length.
   *
   * This affects NN options (SP options are all u8) and other variable-length
   * options (see table 3 in RFC 4340). The limit is currently given the Sequence
   * Window NN value (sec. 7.5.2) and the NDP count (sec. 7.7) option, all other
   * options consume less than 6 bytes (timestamps are 4 bytes).
   * When updating this constant (e.g. due to new internet drafts / RFCs), make
   * sure that you also update all code which refers to it.
   */
  #define DCCP_OPTVAL_MAXLEN	6
  
  extern void dccp_encode_value_var(const u64 value, u8 *to, const u8 len);
  extern u64  dccp_decode_value_var(const u8 *bf, const u8 len);
d6916f87c   Gerrit Renker   dccp: support for...
129
  extern u64  dccp_feat_nn_get(struct sock *sk, u8 feat);
d37105669   Gerrit Renker   dccp: Support for...
130
131
  
  extern int  dccp_insert_option_mandatory(struct sk_buff *skb);
8c862c23e   Gerrit Renker   dccp: Header opti...
132
133
  extern int  dccp_insert_fn_opt(struct sk_buff *skb, u8 type, u8 feat,
  			       u8 *val, u8 len, bool repeat_first);
afe00251d   Andrea Bittau   [DCCP]: Initial f...
134
  #endif /* _DCCP_FEAT_H */