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 tipc_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 u32 max_queue_sz;
200 u32 accu_queue_sz;
201 u32 queue_sz_counts;
202 u32 msg_length_counts;
203 u32 msg_lengths_total;
204 u32 msg_length_profile[7];
205 } stats;
206};
207
208struct tipc_port;
209
210struct link *tipc_link_create(struct tipc_node *n_ptr,
211 struct tipc_bearer *b_ptr,
212 const struct tipc_media_addr *media_addr);
213void tipc_link_delete(struct link *l_ptr);
214void tipc_link_changeover(struct link *l_ptr);
215void tipc_link_send_duplicate(struct link *l_ptr, struct link *dest);
216void tipc_link_reset_fragments(struct link *l_ptr);
217int tipc_link_is_up(struct link *l_ptr);
218int tipc_link_is_active(struct link *l_ptr);
219u32 tipc_link_push_packet(struct link *l_ptr);
220void tipc_link_stop(struct link *l_ptr);
221struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, u16 cmd);
222struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space);
223struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space);
224void tipc_link_reset(struct link *l_ptr);
225int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector);
226void tipc_link_send_names(struct list_head *message_list, u32 dest);
227int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf);
228u32 tipc_link_get_max_pkt(u32 dest, u32 selector);
229int tipc_link_send_sections_fast(struct tipc_port *sender,
230 struct iovec const *msg_sect,
231 const u32 num_sect,
232 unsigned int total_len,
233 u32 destnode);
234void tipc_link_recv_bundle(struct sk_buff *buf);
235int tipc_link_recv_fragment(struct sk_buff **pending,
236 struct sk_buff **fb,
237 struct tipc_msg **msg);
238void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int prob, u32 gap,
239 u32 tolerance, u32 priority, u32 acked_mtu);
240void tipc_link_push_queue(struct link *l_ptr);
241u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
242 struct sk_buff *buf);
243void tipc_link_wakeup_ports(struct link *l_ptr, int all);
244void tipc_link_set_queue_limits(struct link *l_ptr, u32 window);
245void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *start, u32 retransmits);
246
247
248
249
250
251static inline u32 mod(u32 x)
252{
253 return x & 0xffffu;
254}
255
256static inline int between(u32 lower, u32 upper, u32 n)
257{
258 if ((lower < n) && (n < upper))
259 return 1;
260 if ((upper < lower) && ((n > lower) || (n < upper)))
261 return 1;
262 return 0;
263}
264
265static inline int less_eq(u32 left, u32 right)
266{
267 return mod(right - left) < 32768u;
268}
269
270static inline int less(u32 left, u32 right)
271{
272 return less_eq(left, right) && (mod(right) != mod(left));
273}
274
275static inline u32 lesser(u32 left, u32 right)
276{
277 return less_eq(left, right) ? left : right;
278}
279
280
281
282
283
284
285static inline int link_working_working(struct link *l_ptr)
286{
287 return l_ptr->state == WORKING_WORKING;
288}
289
290static inline int link_working_unknown(struct link *l_ptr)
291{
292 return l_ptr->state == WORKING_UNKNOWN;
293}
294
295static inline int link_reset_unknown(struct link *l_ptr)
296{
297 return l_ptr->state == RESET_UNKNOWN;
298}
299
300static inline int link_reset_reset(struct link *l_ptr)
301{
302 return l_ptr->state == RESET_RESET;
303}
304
305static inline int link_blocked(struct link *l_ptr)
306{
307 return l_ptr->exp_msg_count || l_ptr->blocked;
308}
309
310static inline int link_congested(struct link *l_ptr)
311{
312 return l_ptr->out_queue_size >= l_ptr->queue_limit[0];
313}
314
315#endif
316