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#define PUSH_FAILED 1
44#define PUSH_FINISHED 2
45
46
47
48
49#define INVALID_LINK_SEQ 0x10000
50
51
52
53
54#define WORKING_WORKING 560810u
55#define WORKING_UNKNOWN 560811u
56#define RESET_UNKNOWN 560812u
57#define RESET_RESET 560813u
58
59
60
61
62
63#define MAX_PKT_DEFAULT 1500
64
65struct tipc_stats {
66 u32 sent_info;
67 u32 recv_info;
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;
85 u32 bearer_congs;
86 u32 deferred_recv;
87 u32 duplicates;
88 u32 max_queue_sz;
89 u32 accu_queue_sz;
90 u32 queue_sz_counts;
91 u32 msg_length_counts;
92 u32 msg_lengths_total;
93 u32 msg_length_profile[7];
94};
95
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
144struct 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
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];
171
172
173 u32 exp_msg_count;
174 u32 reset_checkpoint;
175
176
177 u32 max_pkt;
178 u32 max_pkt_target;
179 u32 max_pkt_probes;
180
181
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
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
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
204 u32 long_msg_seq_no;
205 struct sk_buff *defragm_buf;
206
207
208 struct tipc_stats stats;
209};
210
211struct tipc_port;
212
213struct tipc_link *tipc_link_create(struct tipc_node *n_ptr,
214 struct tipc_bearer *b_ptr,
215 const struct tipc_media_addr *media_addr);
216void tipc_link_delete(struct tipc_link *l_ptr);
217void tipc_link_changeover(struct tipc_link *l_ptr);
218void tipc_link_send_duplicate(struct tipc_link *l_ptr, struct tipc_link *dest);
219void tipc_link_reset_fragments(struct tipc_link *l_ptr);
220int tipc_link_is_up(struct tipc_link *l_ptr);
221int tipc_link_is_active(struct tipc_link *l_ptr);
222u32 tipc_link_push_packet(struct tipc_link *l_ptr);
223void tipc_link_stop(struct tipc_link *l_ptr);
224struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, u16 cmd);
225struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space);
226struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space);
227void tipc_link_reset(struct tipc_link *l_ptr);
228int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector);
229void tipc_link_send_names(struct list_head *message_list, u32 dest);
230int tipc_link_send_buf(struct tipc_link *l_ptr, struct sk_buff *buf);
231u32 tipc_link_get_max_pkt(u32 dest, u32 selector);
232int 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);
237void tipc_link_recv_bundle(struct sk_buff *buf);
238int tipc_link_recv_fragment(struct sk_buff **pending,
239 struct sk_buff **fb,
240 struct tipc_msg **msg);
241void 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);
244void tipc_link_push_queue(struct tipc_link *l_ptr);
245u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
246 struct sk_buff *buf);
247void tipc_link_wakeup_ports(struct tipc_link *l_ptr, int all);
248void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window);
249void tipc_link_retransmit(struct tipc_link *l_ptr,
250 struct sk_buff *start, u32 retransmits);
251
252
253
254
255static inline u32 buf_seqno(struct sk_buff *buf)
256{
257 return msg_seqno(buf_msg(buf));
258}
259
260static inline u32 mod(u32 x)
261{
262 return x & 0xffffu;
263}
264
265static 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
274static inline int less_eq(u32 left, u32 right)
275{
276 return mod(right - left) < 32768u;
277}
278
279static inline int less(u32 left, u32 right)
280{
281 return less_eq(left, right) && (mod(right) != mod(left));
282}
283
284static inline u32 lesser(u32 left, u32 right)
285{
286 return less_eq(left, right) ? left : right;
287}
288
289
290
291
292
293static inline int link_working_working(struct tipc_link *l_ptr)
294{
295 return l_ptr->state == WORKING_WORKING;
296}
297
298static inline int link_working_unknown(struct tipc_link *l_ptr)
299{
300 return l_ptr->state == WORKING_UNKNOWN;
301}
302
303static inline int link_reset_unknown(struct tipc_link *l_ptr)
304{
305 return l_ptr->state == RESET_UNKNOWN;
306}
307
308static inline int link_reset_reset(struct tipc_link *l_ptr)
309{
310 return l_ptr->state == RESET_RESET;
311}
312
313static inline int link_blocked(struct tipc_link *l_ptr)
314{
315 return l_ptr->exp_msg_count || l_ptr->blocked;
316}
317
318static 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
324