Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
tipc
link.h
Go to the documentation of this file.
1
/*
2
* net/tipc/link.h: Include file for TIPC link code
3
*
4
* Copyright (c) 1995-2006, Ericsson AB
5
* Copyright (c) 2004-2005, 2010-2011, Wind River Systems
6
* All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions are met:
10
*
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
* 3. Neither the names of the copyright holders nor the names of its
17
* contributors may be used to endorse or promote products derived from
18
* this software without specific prior written permission.
19
*
20
* Alternatively, this software may be distributed under the terms of the
21
* GNU General Public License ("GPL") version 2 as published by the Free
22
* Software Foundation.
23
*
24
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
* POSSIBILITY OF SUCH DAMAGE.
35
*/
36
37
#ifndef _TIPC_LINK_H
38
#define _TIPC_LINK_H
39
40
#include "
msg.h
"
41
#include "
node.h
"
42
43
#define PUSH_FAILED 1
44
#define PUSH_FINISHED 2
45
46
/*
47
* Out-of-range value for link sequence numbers
48
*/
49
#define INVALID_LINK_SEQ 0x10000
50
51
/*
52
* Link states
53
*/
54
#define WORKING_WORKING 560810u
55
#define WORKING_UNKNOWN 560811u
56
#define RESET_UNKNOWN 560812u
57
#define RESET_RESET 560813u
58
59
/*
60
* Starting value for maximum packet size negotiation on unicast links
61
* (unless bearer MTU is less)
62
*/
63
#define MAX_PKT_DEFAULT 1500
64
65
struct
tipc_stats
{
66
u32
sent_info
;
/* used in counting # sent packets */
67
u32
recv_info
;
/* used in counting # recv'd packets */
68
u32
sent_states
;
69
u32
recv_states
;
70
u32
sent_probes
;
71
u32
recv_probes
;
72
u32
sent_nacks
;
73
u32
recv_nacks
;
74
u32
sent_acks
;
75
u32
sent_bundled
;
76
u32
sent_bundles
;
77
u32
recv_bundled
;
78
u32
recv_bundles
;
79
u32
retransmitted
;
80
u32
sent_fragmented
;
81
u32
sent_fragments
;
82
u32
recv_fragmented
;
83
u32
recv_fragments
;
84
u32
link_congs
;
/* # port sends blocked by congestion */
85
u32
bearer_congs
;
86
u32
deferred_recv
;
87
u32
duplicates
;
88
u32
max_queue_sz
;
/* send queue size high water mark */
89
u32
accu_queue_sz
;
/* used for send queue size profiling */
90
u32
queue_sz_counts
;
/* used for send queue size profiling */
91
u32
msg_length_counts
;
/* used for message length profiling */
92
u32
msg_lengths_total
;
/* used for message length profiling */
93
u32
msg_length_profile
[7];
/* used for msg. length profiling */
94
};
95
144
struct
tipc_link
{
145
u32
addr
;
146
char
name
[
TIPC_MAX_LINK_NAME
];
147
struct
tipc_media_addr
media_addr
;
148
struct
timer_list
timer
;
149
struct
tipc_node
*
owner
;
150
struct
list_head
link_list
;
151
152
/* Management and link supervision data */
153
int
started
;
154
u32
checkpoint
;
155
u32
peer_session
;
156
u32
peer_bearer_id
;
157
struct
tipc_bearer
*
b_ptr
;
158
u32
tolerance
;
159
u32
continuity_interval
;
160
u32
abort_limit
;
161
int
state
;
162
int
blocked
;
163
u32
fsm_msg_cnt
;
164
struct
{
165
unchar
hdr
[
INT_H_SIZE
];
166
unchar
body
[
TIPC_MAX_IF_NAME
];
167
}
proto_msg
;
168
struct
tipc_msg
*
pmsg
;
169
u32
priority
;
170
u32
queue_limit
[15];
/* queue_limit[0]==window limit */
171
172
/* Changeover */
173
u32
exp_msg_count
;
174
u32
reset_checkpoint
;
175
176
/* Max packet negotiation */
177
u32
max_pkt
;
178
u32
max_pkt_target
;
179
u32
max_pkt_probes
;
180
181
/* Sending */
182
u32
out_queue_size
;
183
struct
sk_buff
*
first_out
;
184
struct
sk_buff
*
last_out
;
185
u32
next_out_no
;
186
u32
last_retransmitted
;
187
u32
stale_count
;
188
189
/* Reception */
190
u32
next_in_no
;
191
u32
deferred_inqueue_sz
;
192
struct
sk_buff
*
oldest_deferred_in
;
193
struct
sk_buff
*
newest_deferred_in
;
194
u32
unacked_window
;
195
196
/* Congestion handling */
197
struct
sk_buff
*
proto_msg_queue
;
198
u32
retransm_queue_size
;
199
u32
retransm_queue_head
;
200
struct
sk_buff
*
next_out
;
201
struct
list_head
waiting_ports
;
202
203
/* Fragmentation/defragmentation */
204
u32
long_msg_seq_no
;
205
struct
sk_buff
*
defragm_buf
;
206
207
/* Statistics */
208
struct
tipc_stats
stats
;
209
};
210
211
struct
tipc_port
;
212
213
struct
tipc_link
*
tipc_link_create
(
struct
tipc_node
*n_ptr,
214
struct
tipc_bearer
*
b_ptr
,
215
const
struct
tipc_media_addr
*
media_addr
);
216
void
tipc_link_delete
(
struct
tipc_link
*l_ptr);
217
void
tipc_link_changeover
(
struct
tipc_link
*l_ptr);
218
void
tipc_link_send_duplicate
(
struct
tipc_link
*l_ptr,
struct
tipc_link
*
dest
);
219
void
tipc_link_reset_fragments
(
struct
tipc_link
*l_ptr);
220
int
tipc_link_is_up
(
struct
tipc_link
*l_ptr);
221
int
tipc_link_is_active
(
struct
tipc_link
*l_ptr);
222
u32
tipc_link_push_packet
(
struct
tipc_link
*l_ptr);
223
void
tipc_link_stop
(
struct
tipc_link
*l_ptr);
224
struct
sk_buff
*
tipc_link_cmd_config
(
const
void
*req_tlv_area,
int
req_tlv_space,
u16
cmd
);
225
struct
sk_buff
*
tipc_link_cmd_show_stats
(
const
void
*req_tlv_area,
int
req_tlv_space);
226
struct
sk_buff
*
tipc_link_cmd_reset_stats
(
const
void
*req_tlv_area,
int
req_tlv_space);
227
void
tipc_link_reset
(
struct
tipc_link
*l_ptr);
228
int
tipc_link_send
(
struct
sk_buff
*
buf
,
u32
dest
,
u32
selector
);
229
void
tipc_link_send_names
(
struct
list_head
*message_list,
u32
dest
);
230
int
tipc_link_send_buf
(
struct
tipc_link
*l_ptr,
struct
sk_buff
*
buf
);
231
u32
tipc_link_get_max_pkt
(
u32
dest
,
u32
selector
);
232
int
tipc_link_send_sections_fast
(
struct
tipc_port
*sender,
233
struct
iovec
const
*msg_sect,
234
const
u32
num_sect,
235
unsigned
int
total_len
,
236
u32
destnode);
237
void
tipc_link_recv_bundle
(
struct
sk_buff
*
buf
);
238
int
tipc_link_recv_fragment
(
struct
sk_buff
**pending,
239
struct
sk_buff
**
fb
,
240
struct
tipc_msg
**
msg
);
241
void
tipc_link_send_proto_msg
(
struct
tipc_link
*l_ptr,
u32
msg_typ,
int
prob,
242
u32
gap,
u32
tolerance,
u32
priority
,
243
u32
acked_mtu);
244
void
tipc_link_push_queue
(
struct
tipc_link
*l_ptr);
245
u32
tipc_link_defer_pkt
(
struct
sk_buff
**
head
,
struct
sk_buff
**
tail
,
246
struct
sk_buff
*
buf
);
247
void
tipc_link_wakeup_ports
(
struct
tipc_link
*l_ptr,
int
all);
248
void
tipc_link_set_queue_limits
(
struct
tipc_link
*l_ptr,
u32
window
);
249
void
tipc_link_retransmit
(
struct
tipc_link
*l_ptr,
250
struct
sk_buff
*
start
,
u32
retransmits);
251
252
/*
253
* Link sequence number manipulation routines (uses modulo 2**16 arithmetic)
254
*/
255
static
inline
u32
buf_seqno(
struct
sk_buff
*
buf
)
256
{
257
return
msg_seqno(buf_msg(buf));
258
}
259
260
static
inline
u32
mod
(
u32
x
)
261
{
262
return
x & 0xffff
u
;
263
}
264
265
static
inline
int
between(
u32
lower,
u32
upper,
u32
n
)
266
{
267
if
((lower < n) && (n < upper))
268
return
1;
269
if
((upper < lower) && ((n > lower) || (n < upper)))
270
return
1;
271
return
0;
272
}
273
274
static
inline
int
less_eq(
u32
left
,
u32
right
)
275
{
276
return
mod
(right - left) < 32768
u
;
277
}
278
279
static
inline
int
less(
u32
left
,
u32
right
)
280
{
281
return
less_eq(left, right) && (
mod
(right) !=
mod
(left));
282
}
283
284
static
inline
u32
lesser(
u32
left
,
u32
right
)
285
{
286
return
less_eq(left, right) ? left :
right
;
287
}
288
289
290
/*
291
* Link status checking routines
292
*/
293
static
inline
int
link_working_working(
struct
tipc_link
*l_ptr)
294
{
295
return
l_ptr->
state
==
WORKING_WORKING
;
296
}
297
298
static
inline
int
link_working_unknown(
struct
tipc_link
*l_ptr)
299
{
300
return
l_ptr->
state
==
WORKING_UNKNOWN
;
301
}
302
303
static
inline
int
link_reset_unknown(
struct
tipc_link
*l_ptr)
304
{
305
return
l_ptr->
state
==
RESET_UNKNOWN
;
306
}
307
308
static
inline
int
link_reset_reset(
struct
tipc_link
*l_ptr)
309
{
310
return
l_ptr->
state
==
RESET_RESET
;
311
}
312
313
static
inline
int
link_blocked(
struct
tipc_link
*l_ptr)
314
{
315
return
l_ptr->
exp_msg_count
|| l_ptr->
blocked
;
316
}
317
318
static
inline
int
link_congested(
struct
tipc_link
*l_ptr)
319
{
320
return
l_ptr->
out_queue_size
>= l_ptr->
queue_limit
[0];
321
}
322
323
#endif
Generated on Thu Jan 10 2013 15:02:23 for Linux Kernel by
1.8.2