Blame view

net/tipc/link.h 10.7 KB
b97bf3fd8   Per Liden   [TIPC] Initial merge
1
2
  /*
   * net/tipc/link.h: Include file for TIPC link code
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
3
   *
593a5f22d   Per Liden   [TIPC] More updat...
4
   * Copyright (c) 1995-2006, Ericsson AB
23dd4cce3   Allan Stephens   tipc: Combine por...
5
   * Copyright (c) 2004-2005, 2010-2011, Wind River Systems
b97bf3fd8   Per Liden   [TIPC] Initial merge
6
7
   * All rights reserved.
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
8
   * Redistribution and use in source and binary forms, with or without
b97bf3fd8   Per Liden   [TIPC] Initial merge
9
10
   * modification, are permitted provided that the following conditions are met:
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
11
12
13
14
15
16
17
18
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. Neither the names of the copyright holders nor the names of its
   *    contributors may be used to endorse or promote products derived from
   *    this software without specific prior written permission.
b97bf3fd8   Per Liden   [TIPC] Initial merge
19
   *
9ea1fd3c1   Per Liden   [TIPC] License he...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   * Alternatively, this software may be distributed under the terms of the
   * GNU General Public License ("GPL") version 2 as published by the Free
   * Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
b97bf3fd8   Per Liden   [TIPC] Initial merge
34
35
36
37
38
   * POSSIBILITY OF SUCH DAMAGE.
   */
  
  #ifndef _TIPC_LINK_H
  #define _TIPC_LINK_H
f5e75269f   Allan Stephens   tipc: rename dbg....
39
  #include "log.h"
b97bf3fd8   Per Liden   [TIPC] Initial merge
40
  #include "msg.h"
b97bf3fd8   Per Liden   [TIPC] Initial merge
41
42
43
44
  #include "node.h"
  
  #define PUSH_FAILED   1
  #define PUSH_FINISHED 2
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
45
  /*
365595914   Allan Stephens   tipc: Ignore broa...
46
47
48
49
50
51
   * Out-of-range value for link sequence numbers
   */
  
  #define INVALID_LINK_SEQ 0x10000
  
  /*
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
52
   * Link states
b97bf3fd8   Per Liden   [TIPC] Initial merge
53
54
55
56
57
58
   */
  
  #define WORKING_WORKING 560810u
  #define WORKING_UNKNOWN 560811u
  #define RESET_UNKNOWN   560812u
  #define RESET_RESET     560813u
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
59
  /*
b97bf3fd8   Per Liden   [TIPC] Initial merge
60
61
62
63
64
65
66
   * Starting value for maximum packet size negotiation on unicast links
   * (unless bearer MTU is less)
   */
  
  #define MAX_PKT_DEFAULT 1500
  
  /**
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
67
   * struct tipc_link - TIPC link data structure
b97bf3fd8   Per Liden   [TIPC] Initial merge
68
69
70
71
72
73
74
75
76
77
78
   * @addr: network address of link's peer node
   * @name: link name character string
   * @media_addr: media address to use when sending messages over link
   * @timer: link timer
   * @owner: pointer to peer node
   * @link_list: adjacent links in bearer's list of links
   * @started: indicates if link has been started
   * @checkpoint: reference point for triggering link continuity checking
   * @peer_session: link session # being used by peer end of link
   * @peer_bearer_id: bearer id used by link's peer endpoint
   * @b_ptr: pointer to bearer used by link
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
79
   * @tolerance: minimum link continuity loss needed to reset link [in ms]
b97bf3fd8   Per Liden   [TIPC] Initial merge
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
   * @continuity_interval: link continuity testing interval [in ms]
   * @abort_limit: # of unacknowledged continuity probes needed to reset link
   * @state: current state of link FSM
   * @blocked: indicates if link has been administratively blocked
   * @fsm_msg_cnt: # of protocol messages link FSM has sent in current state
   * @proto_msg: template for control messages generated by link
   * @pmsg: convenience pointer to "proto_msg" field
   * @priority: current link priority
   * @queue_limit: outbound message queue congestion thresholds (indexed by user)
   * @exp_msg_count: # of tunnelled messages expected during link changeover
   * @reset_checkpoint: seq # of last acknowledged message at time of link reset
   * @max_pkt: current maximum packet size for this link
   * @max_pkt_target: desired maximum packet size for this link
   * @max_pkt_probes: # of probes based on current (max_pkt, max_pkt_target)
   * @out_queue_size: # of messages in outbound message queue
   * @first_out: ptr to first outbound message in queue
   * @last_out: ptr to last outbound message in queue
   * @next_out_no: next sequence number to use for outbound messages
   * @last_retransmitted: sequence number of most recently retransmitted message
   * @stale_count: # of identical retransmit requests made by peer
   * @next_in_no: next sequence number to expect for inbound messages
   * @deferred_inqueue_sz: # of messages in inbound message queue
   * @oldest_deferred_in: ptr to first inbound message in queue
   * @newest_deferred_in: ptr to last inbound message in queue
   * @unacked_window: # of inbound messages rx'd without ack'ing back to peer
   * @proto_msg_queue: ptr to (single) outbound control message
   * @retransm_queue_size: number of messages to retransmit
   * @retransm_queue_head: sequence number of first message to retransmit
   * @next_out: ptr to first unsent outbound message in queue
   * @waiting_ports: linked list of ports waiting for link congestion to abate
   * @long_msg_seq_no: next identifier to use for outbound fragmented messages
   * @defragm_buf: list of partially reassembled inbound message fragments
   * @stats: collects statistics regarding link activity
b97bf3fd8   Per Liden   [TIPC] Initial merge
113
   */
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
114

a18c4bc3e   Paul Gortmaker   tipc: rename stru...
115
  struct tipc_link {
b97bf3fd8   Per Liden   [TIPC] Initial merge
116
117
118
119
  	u32 addr;
  	char name[TIPC_MAX_LINK_NAME];
  	struct tipc_media_addr media_addr;
  	struct timer_list timer;
6c00055a8   David S. Miller   tipc: Don't use s...
120
  	struct tipc_node *owner;
b97bf3fd8   Per Liden   [TIPC] Initial merge
121
122
123
124
125
126
127
  	struct list_head link_list;
  
  	/* Management and link supervision data */
  	int started;
  	u32 checkpoint;
  	u32 peer_session;
  	u32 peer_bearer_id;
2d627b92f   Allan Stephens   tipc: Combine bea...
128
  	struct tipc_bearer *b_ptr;
b97bf3fd8   Per Liden   [TIPC] Initial merge
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
  	u32 tolerance;
  	u32 continuity_interval;
  	u32 abort_limit;
  	int state;
  	int blocked;
  	u32 fsm_msg_cnt;
  	struct {
  		unchar hdr[INT_H_SIZE];
  		unchar body[TIPC_MAX_IF_NAME];
  	} proto_msg;
  	struct tipc_msg *pmsg;
  	u32 priority;
  	u32 queue_limit[15];	/* queue_limit[0]==window limit */
  
  	/* Changeover */
  	u32 exp_msg_count;
  	u32 reset_checkpoint;
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
146
147
148
149
  	/* Max packet negotiation */
  	u32 max_pkt;
  	u32 max_pkt_target;
  	u32 max_pkt_probes;
b97bf3fd8   Per Liden   [TIPC] Initial merge
150
151
152
153
154
155
  
  	/* Sending */
  	u32 out_queue_size;
  	struct sk_buff *first_out;
  	struct sk_buff *last_out;
  	u32 next_out_no;
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
156
157
  	u32 last_retransmitted;
  	u32 stale_count;
b97bf3fd8   Per Liden   [TIPC] Initial merge
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
  
  	/* Reception */
  	u32 next_in_no;
  	u32 deferred_inqueue_sz;
  	struct sk_buff *oldest_deferred_in;
  	struct sk_buff *newest_deferred_in;
  	u32 unacked_window;
  
  	/* Congestion handling */
  	struct sk_buff *proto_msg_queue;
  	u32 retransm_queue_size;
  	u32 retransm_queue_head;
  	struct sk_buff *next_out;
  	struct list_head waiting_ports;
  
  	/* Fragmentation/defragmentation */
  	u32 long_msg_seq_no;
  	struct sk_buff *defragm_buf;
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
176
  	/* Statistics */
b97bf3fd8   Per Liden   [TIPC] Initial merge
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
  	struct {
  		u32 sent_info;		/* used in counting # sent packets */
  		u32 recv_info;		/* used in counting # recv'd packets */
  		u32 sent_states;
  		u32 recv_states;
  		u32 sent_probes;
  		u32 recv_probes;
  		u32 sent_nacks;
  		u32 recv_nacks;
  		u32 sent_acks;
  		u32 sent_bundled;
  		u32 sent_bundles;
  		u32 recv_bundled;
  		u32 recv_bundles;
  		u32 retransmitted;
  		u32 sent_fragmented;
  		u32 sent_fragments;
  		u32 recv_fragmented;
  		u32 recv_fragments;
  		u32 link_congs;		/* # port sends blocked by congestion */
  		u32 bearer_congs;
  		u32 deferred_recv;
  		u32 duplicates;
9bd80b608   Allan Stephens   tipc: Improve acc...
200
201
202
203
204
205
  		u32 max_queue_sz;	/* send queue size high water mark */
  		u32 accu_queue_sz;	/* used for send queue size profiling */
  		u32 queue_sz_counts;	/* used for send queue size profiling */
  		u32 msg_length_counts;	/* used for message length profiling */
  		u32 msg_lengths_total;	/* used for message length profiling */
  		u32 msg_length_profile[7]; /* used for msg. length profiling */
b97bf3fd8   Per Liden   [TIPC] Initial merge
206
  	} stats;
b97bf3fd8   Per Liden   [TIPC] Initial merge
207
  };
23dd4cce3   Allan Stephens   tipc: Combine por...
208
  struct tipc_port;
b97bf3fd8   Per Liden   [TIPC] Initial merge
209

a18c4bc3e   Paul Gortmaker   tipc: rename stru...
210
  struct tipc_link *tipc_link_create(struct tipc_node *n_ptr,
37b9c08a8   Allan Stephens   tipc: Optimizatio...
211
  			      struct tipc_bearer *b_ptr,
4323add67   Per Liden   [TIPC] Avoid poll...
212
  			      const struct tipc_media_addr *media_addr);
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
213
214
215
216
217
218
219
220
  void tipc_link_delete(struct tipc_link *l_ptr);
  void tipc_link_changeover(struct tipc_link *l_ptr);
  void tipc_link_send_duplicate(struct tipc_link *l_ptr, struct tipc_link *dest);
  void tipc_link_reset_fragments(struct tipc_link *l_ptr);
  int tipc_link_is_up(struct tipc_link *l_ptr);
  int tipc_link_is_active(struct tipc_link *l_ptr);
  u32 tipc_link_push_packet(struct tipc_link *l_ptr);
  void tipc_link_stop(struct tipc_link *l_ptr);
4323add67   Per Liden   [TIPC] Avoid poll...
221
222
223
  struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, u16 cmd);
  struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space);
  struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space);
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
224
  void tipc_link_reset(struct tipc_link *l_ptr);
4323add67   Per Liden   [TIPC] Avoid poll...
225
  int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector);
9aa88c2a5   Allan Stephens   tipc: Enhance sen...
226
  void tipc_link_send_names(struct list_head *message_list, u32 dest);
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
227
  int tipc_link_send_buf(struct tipc_link *l_ptr, struct sk_buff *buf);
0e65967e3   Allan Stephens   tipc: cleanup var...
228
  u32 tipc_link_get_max_pkt(u32 dest, u32 selector);
23dd4cce3   Allan Stephens   tipc: Combine por...
229
  int tipc_link_send_sections_fast(struct tipc_port *sender,
4323add67   Per Liden   [TIPC] Avoid poll...
230
  				 struct iovec const *msg_sect,
c43072852   YOSHIFUJI Hideaki   [NET] TIPC: Fix w...
231
  				 const u32 num_sect,
268969046   Allan Stephens   tipc: Avoid recom...
232
  				 unsigned int total_len,
4323add67   Per Liden   [TIPC] Avoid poll...
233
  				 u32 destnode);
4323add67   Per Liden   [TIPC] Avoid poll...
234
235
236
237
  void tipc_link_recv_bundle(struct sk_buff *buf);
  int  tipc_link_recv_fragment(struct sk_buff **pending,
  			     struct sk_buff **fb,
  			     struct tipc_msg **msg);
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
238
239
240
241
  void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ, int prob,
  			      u32 gap, u32 tolerance, u32 priority,
  			      u32 acked_mtu);
  void tipc_link_push_queue(struct tipc_link *l_ptr);
4323add67   Per Liden   [TIPC] Avoid poll...
242
  u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
b97bf3fd8   Per Liden   [TIPC] Initial merge
243
  		   struct sk_buff *buf);
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
244
245
246
247
  void tipc_link_wakeup_ports(struct tipc_link *l_ptr, int all);
  void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window);
  void tipc_link_retransmit(struct tipc_link *l_ptr,
  			  struct sk_buff *start, u32 retransmits);
b97bf3fd8   Per Liden   [TIPC] Initial merge
248
249
250
251
  
  /*
   * Link sequence number manipulation routines (uses modulo 2**16 arithmetic)
   */
f905730c7   Allan Stephens   tipc: Allow use o...
252
253
254
255
  static inline u32 buf_seqno(struct sk_buff *buf)
  {
  	return msg_seqno(buf_msg(buf));
  }
b97bf3fd8   Per Liden   [TIPC] Initial merge
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  static inline u32 mod(u32 x)
  {
  	return x & 0xffffu;
  }
  
  static inline int between(u32 lower, u32 upper, u32 n)
  {
  	if ((lower < n) && (n < upper))
  		return 1;
  	if ((upper < lower) && ((n > lower) || (n < upper)))
  		return 1;
  	return 0;
  }
  
  static inline int less_eq(u32 left, u32 right)
  {
a02cec215   Eric Dumazet   net: return opera...
272
  	return mod(right - left) < 32768u;
b97bf3fd8   Per Liden   [TIPC] Initial merge
273
274
275
276
  }
  
  static inline int less(u32 left, u32 right)
  {
a02cec215   Eric Dumazet   net: return opera...
277
  	return less_eq(left, right) && (mod(right) != mod(left));
b97bf3fd8   Per Liden   [TIPC] Initial merge
278
279
280
281
282
283
  }
  
  static inline u32 lesser(u32 left, u32 right)
  {
  	return less_eq(left, right) ? left : right;
  }
01fee256a   Allan Stephens   tipc: Relocate tr...
284
285
286
287
  
  /*
   * Link status checking routines
   */
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
288
  static inline int link_working_working(struct tipc_link *l_ptr)
01fee256a   Allan Stephens   tipc: Relocate tr...
289
  {
a02cec215   Eric Dumazet   net: return opera...
290
  	return l_ptr->state == WORKING_WORKING;
01fee256a   Allan Stephens   tipc: Relocate tr...
291
  }
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
292
  static inline int link_working_unknown(struct tipc_link *l_ptr)
01fee256a   Allan Stephens   tipc: Relocate tr...
293
  {
a02cec215   Eric Dumazet   net: return opera...
294
  	return l_ptr->state == WORKING_UNKNOWN;
01fee256a   Allan Stephens   tipc: Relocate tr...
295
  }
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
296
  static inline int link_reset_unknown(struct tipc_link *l_ptr)
01fee256a   Allan Stephens   tipc: Relocate tr...
297
  {
a02cec215   Eric Dumazet   net: return opera...
298
  	return l_ptr->state == RESET_UNKNOWN;
01fee256a   Allan Stephens   tipc: Relocate tr...
299
  }
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
300
  static inline int link_reset_reset(struct tipc_link *l_ptr)
01fee256a   Allan Stephens   tipc: Relocate tr...
301
  {
a02cec215   Eric Dumazet   net: return opera...
302
  	return l_ptr->state == RESET_RESET;
01fee256a   Allan Stephens   tipc: Relocate tr...
303
  }
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
304
  static inline int link_blocked(struct tipc_link *l_ptr)
01fee256a   Allan Stephens   tipc: Relocate tr...
305
  {
a02cec215   Eric Dumazet   net: return opera...
306
  	return l_ptr->exp_msg_count || l_ptr->blocked;
01fee256a   Allan Stephens   tipc: Relocate tr...
307
  }
a18c4bc3e   Paul Gortmaker   tipc: rename stru...
308
  static inline int link_congested(struct tipc_link *l_ptr)
01fee256a   Allan Stephens   tipc: Relocate tr...
309
  {
a02cec215   Eric Dumazet   net: return opera...
310
  	return l_ptr->out_queue_size >= l_ptr->queue_limit[0];
01fee256a   Allan Stephens   tipc: Relocate tr...
311
  }
b97bf3fd8   Per Liden   [TIPC] Initial merge
312
  #endif