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 "log.h"
41#include "msg.h"
42#include "node.h"
43
44#define PUSH_FAILED 1
45#define PUSH_FINISHED 2
46
47
48
49
50
51#define WORKING_WORKING 560810u
52#define WORKING_UNKNOWN 560811u
53#define RESET_UNKNOWN 560812u
54#define RESET_RESET 560813u
55
56
57
58
59
60
61#define MAX_PKT_DEFAULT 1500
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112struct link {
113 u32 addr;
114 char name[TIPC_MAX_LINK_NAME];
115 struct tipc_media_addr media_addr;
116 struct timer_list timer;
117 struct tipc_node *owner;
118 struct list_head link_list;
119
120
121 int started;
122 u32 checkpoint;
123 u32 peer_session;
124 u32 peer_bearer_id;
125 struct bearer *b_ptr;
126 u32 tolerance;
127 u32 continuity_interval;
128 u32 abort_limit;
129 int state;
130 int blocked;
131 u32 fsm_msg_cnt;
132 struct {
133 unchar hdr[INT_H_SIZE];
134 unchar body[TIPC_MAX_IF_NAME];
135 } proto_msg;
136 struct tipc_msg *pmsg;
137 u32 priority;
138 u32 queue_limit[15];
139
140
141 u32 exp_msg_count;
142 u32 reset_checkpoint;
143
144
145 u32 max_pkt;
146 u32 max_pkt_target;
147 u32 max_pkt_probes;
148
149
150 u32 out_queue_size;
151 struct sk_buff *first_out;
152 struct sk_buff *last_out;
153 u32 next_out_no;
154 u32 last_retransmitted;
155 u32 stale_count;
156
157
158 u32 next_in_no;
159 u32 deferred_inqueue_sz;
160 struct sk_buff *oldest_deferred_in;
161 struct sk_buff *newest_deferred_in;
162 u32 unacked_window;
163
164
165 struct sk_buff *proto_msg_queue;
166 u32 retransm_queue_size;
167 u32 retransm_queue_head;
168 struct sk_buff *next_out;
169 struct list_head waiting_ports;
170
171
172 u32 long_msg_seq_no;
173 struct sk_buff *defragm_buf;
174
175
176 struct {
177 u32 sent_info;
178 u32 recv_info;
179 u32 sent_states;
180 u32 recv_states;
181 u32 sent_probes;
182 u32 recv_probes;
183 u32 sent_nacks;
184 u32 recv_nacks;
185 u32 sent_acks;
186 u32 sent_bundled;
187 u32 sent_bundles;
188 u32 recv_bundled;
189 u32 recv_bundles;
190 u32 retransmitted;
191 u32 sent_fragmented;
192 u32 sent_fragments;
193 u32 recv_fragmented;
194 u32 recv_fragments;
195 u32 link_congs;
196 u32 bearer_congs;
197 u32 deferred_recv;
198 u32 duplicates;
199
200
201
202 u32 max_queue_sz;
203 u32 accu_queue_sz;
204 u32 queue_sz_counts;
205
206
207
208 u32 msg_length_counts;
209 u32 msg_lengths_total;
210 u32 msg_length_profile[7];
211 } stats;
212};
213
214struct port;
215
216struct link *tipc_link_create(struct bearer *b_ptr, const u32 peer,
217 const struct tipc_media_addr *media_addr);
218void tipc_link_delete(struct link *l_ptr);
219void tipc_link_changeover(struct link *l_ptr);
220void tipc_link_send_duplicate(struct link *l_ptr, struct link *dest);
221void tipc_link_reset_fragments(struct link *l_ptr);
222int tipc_link_is_up(struct link *l_ptr);
223int tipc_link_is_active(struct link *l_ptr);
224u32 tipc_link_push_packet(struct link *l_ptr);
225void tipc_link_stop(struct link *l_ptr);
226struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, u16 cmd);
227struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space);
228struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space);
229void tipc_link_reset(struct link *l_ptr);
230int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector);
231int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf);
232u32 tipc_link_get_max_pkt(u32 dest, u32 selector);
233int tipc_link_send_sections_fast(struct port *sender,
234 struct iovec const *msg_sect,
235 const u32 num_sect,
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 link *l_ptr, u32 msg_typ, int prob, u32 gap,
242 u32 tolerance, u32 priority, u32 acked_mtu);
243void tipc_link_push_queue(struct link *l_ptr);
244u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
245 struct sk_buff *buf);
246void tipc_link_wakeup_ports(struct link *l_ptr, int all);
247void tipc_link_set_queue_limits(struct link *l_ptr, u32 window);
248void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *start, u32 retransmits);
249
250
251
252
253
254static inline u32 mod(u32 x)
255{
256 return x & 0xffffu;
257}
258
259static inline int between(u32 lower, u32 upper, u32 n)
260{
261 if ((lower < n) && (n < upper))
262 return 1;
263 if ((upper < lower) && ((n > lower) || (n < upper)))
264 return 1;
265 return 0;
266}
267
268static inline int less_eq(u32 left, u32 right)
269{
270 return mod(right - left) < 32768u;
271}
272
273static inline int less(u32 left, u32 right)
274{
275 return less_eq(left, right) && (mod(right) != mod(left));
276}
277
278static inline u32 lesser(u32 left, u32 right)
279{
280 return less_eq(left, right) ? left : right;
281}
282
283
284
285
286
287
288static inline int link_working_working(struct link *l_ptr)
289{
290 return l_ptr->state == WORKING_WORKING;
291}
292
293static inline int link_working_unknown(struct link *l_ptr)
294{
295 return l_ptr->state == WORKING_UNKNOWN;
296}
297
298static inline int link_reset_unknown(struct link *l_ptr)
299{
300 return l_ptr->state == RESET_UNKNOWN;
301}
302
303static inline int link_reset_reset(struct link *l_ptr)
304{
305 return l_ptr->state == RESET_RESET;
306}
307
308static inline int link_blocked(struct link *l_ptr)
309{
310 return l_ptr->exp_msg_count || l_ptr->blocked;
311}
312
313static inline int link_congested(struct link *l_ptr)
314{
315 return l_ptr->out_queue_size >= l_ptr->queue_limit[0];
316}
317
318#endif
319