1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#ifndef _TIPC_LINK_H
38#define _TIPC_LINK_H
39
40#include "msg.h"
41#include "node.h"
42
43
44
45
46#define LINK_REASM_ERROR -1
47#define LINK_REASM_COMPLETE 1
48
49
50
51
52#define INVALID_LINK_SEQ 0x10000
53
54
55
56
57#define WORKING_WORKING 560810u
58#define WORKING_UNKNOWN 560811u
59#define RESET_UNKNOWN 560812u
60#define RESET_RESET 560813u
61
62
63
64
65
66#define MAX_PKT_DEFAULT 1500
67
68struct tipc_stats {
69 u32 sent_info;
70 u32 recv_info;
71 u32 sent_states;
72 u32 recv_states;
73 u32 sent_probes;
74 u32 recv_probes;
75 u32 sent_nacks;
76 u32 recv_nacks;
77 u32 sent_acks;
78 u32 sent_bundled;
79 u32 sent_bundles;
80 u32 recv_bundled;
81 u32 recv_bundles;
82 u32 retransmitted;
83 u32 sent_fragmented;
84 u32 sent_fragments;
85 u32 recv_fragmented;
86 u32 recv_fragments;
87 u32 link_congs;
88 u32 deferred_recv;
89 u32 duplicates;
90 u32 max_queue_sz;
91 u32 accu_queue_sz;
92 u32 queue_sz_counts;
93 u32 msg_length_counts;
94 u32 msg_lengths_total;
95 u32 msg_length_profile[7];
96};
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146struct tipc_link {
147 u32 addr;
148 char name[TIPC_MAX_LINK_NAME];
149 struct tipc_media_addr media_addr;
150 struct timer_list timer;
151 struct tipc_node *owner;
152 struct list_head link_list;
153
154
155 int started;
156 u32 checkpoint;
157 u32 peer_session;
158 u32 peer_bearer_id;
159 struct tipc_bearer *b_ptr;
160 u32 tolerance;
161 u32 continuity_interval;
162 u32 abort_limit;
163 int state;
164 u32 fsm_msg_cnt;
165 struct {
166 unchar hdr[INT_H_SIZE];
167 unchar body[TIPC_MAX_IF_NAME];
168 } proto_msg;
169 struct tipc_msg *pmsg;
170 u32 priority;
171 u32 queue_limit[15];
172
173
174 u32 exp_msg_count;
175 u32 reset_checkpoint;
176
177
178 u32 max_pkt;
179 u32 max_pkt_target;
180 u32 max_pkt_probes;
181
182
183 u32 out_queue_size;
184 struct sk_buff *first_out;
185 struct sk_buff *last_out;
186 u32 next_out_no;
187 u32 last_retransmitted;
188 u32 stale_count;
189
190
191 u32 next_in_no;
192 u32 deferred_inqueue_sz;
193 struct sk_buff *oldest_deferred_in;
194 struct sk_buff *newest_deferred_in;
195 u32 unacked_window;
196
197
198 struct sk_buff *proto_msg_queue;
199 u32 retransm_queue_size;
200 u32 retransm_queue_head;
201 struct sk_buff *next_out;
202 struct list_head waiting_ports;
203
204
205 u32 long_msg_seq_no;
206 struct sk_buff *reasm_head;
207 struct sk_buff *reasm_tail;
208
209
210 struct tipc_stats stats;
211};
212
213struct tipc_port;
214
215struct tipc_link *tipc_link_create(struct tipc_node *n_ptr,
216 struct tipc_bearer *b_ptr,
217 const struct tipc_media_addr *media_addr);
218void tipc_link_delete(struct tipc_link *l_ptr);
219void tipc_link_failover_send_queue(struct tipc_link *l_ptr);
220void tipc_link_dup_send_queue(struct tipc_link *l_ptr,
221 struct tipc_link *dest);
222void tipc_link_reset_fragments(struct tipc_link *l_ptr);
223int tipc_link_is_up(struct tipc_link *l_ptr);
224int tipc_link_is_active(struct tipc_link *l_ptr);
225void tipc_link_purge_queues(struct tipc_link *l_ptr);
226struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area,
227 int req_tlv_space,
228 u16 cmd);
229struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area,
230 int req_tlv_space);
231struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area,
232 int req_tlv_space);
233void tipc_link_reset(struct tipc_link *l_ptr);
234int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector);
235void tipc_link_send_names(struct list_head *message_list, u32 dest);
236int tipc_link_send_buf(struct tipc_link *l_ptr, struct sk_buff *buf);
237u32 tipc_link_get_max_pkt(u32 dest, u32 selector);
238int tipc_link_send_sections_fast(struct tipc_port *sender,
239 struct iovec const *msg_sect,
240 unsigned int len, u32 destnode);
241void tipc_link_recv_bundle(struct sk_buff *buf);
242int tipc_link_recv_fragment(struct sk_buff **reasm_head,
243 struct sk_buff **reasm_tail,
244 struct sk_buff **fbuf);
245void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ, int prob,
246 u32 gap, u32 tolerance, u32 priority,
247 u32 acked_mtu);
248void tipc_link_push_queue(struct tipc_link *l_ptr);
249u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
250 struct sk_buff *buf);
251void tipc_link_wakeup_ports(struct tipc_link *l_ptr, int all);
252void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window);
253void tipc_link_retransmit(struct tipc_link *l_ptr,
254 struct sk_buff *start, u32 retransmits);
255
256
257
258
259static inline u32 buf_seqno(struct sk_buff *buf)
260{
261 return msg_seqno(buf_msg(buf));
262}
263
264static inline u32 mod(u32 x)
265{
266 return x & 0xffffu;
267}
268
269static inline int between(u32 lower, u32 upper, u32 n)
270{
271 if ((lower < n) && (n < upper))
272 return 1;
273 if ((upper < lower) && ((n > lower) || (n < upper)))
274 return 1;
275 return 0;
276}
277
278static inline int less_eq(u32 left, u32 right)
279{
280 return mod(right - left) < 32768u;
281}
282
283static inline int less(u32 left, u32 right)
284{
285 return less_eq(left, right) && (mod(right) != mod(left));
286}
287
288static inline u32 lesser(u32 left, u32 right)
289{
290 return less_eq(left, right) ? left : right;
291}
292
293
294
295
296
297static inline int link_working_working(struct tipc_link *l_ptr)
298{
299 return l_ptr->state == WORKING_WORKING;
300}
301
302static inline int link_working_unknown(struct tipc_link *l_ptr)
303{
304 return l_ptr->state == WORKING_UNKNOWN;
305}
306
307static inline int link_reset_unknown(struct tipc_link *l_ptr)
308{
309 return l_ptr->state == RESET_UNKNOWN;
310}
311
312static inline int link_reset_reset(struct tipc_link *l_ptr)
313{
314 return l_ptr->state == RESET_RESET;
315}
316
317static inline int link_congested(struct tipc_link *l_ptr)
318{
319 return l_ptr->out_queue_size >= l_ptr->queue_limit[0];
320}
321
322#endif
323