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);
226int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf);
227u32 tipc_link_get_max_pkt(u32 dest, u32 selector);
228int tipc_link_send_sections_fast(struct tipc_port *sender,
229 struct iovec const *msg_sect,
230 const u32 num_sect,
231 unsigned int total_len,
232 u32 destnode);
233void tipc_link_recv_bundle(struct sk_buff *buf);
234int tipc_link_recv_fragment(struct sk_buff **pending,
235 struct sk_buff **fb,
236 struct tipc_msg **msg);
237void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int prob, u32 gap,
238 u32 tolerance, u32 priority, u32 acked_mtu);
239void tipc_link_push_queue(struct link *l_ptr);
240u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
241 struct sk_buff *buf);
242void tipc_link_wakeup_ports(struct link *l_ptr, int all);
243void tipc_link_set_queue_limits(struct link *l_ptr, u32 window);
244void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *start, u32 retransmits);
245
246
247
248
249
250static inline u32 mod(u32 x)
251{
252 return x & 0xffffu;
253}
254
255static inline int between(u32 lower, u32 upper, u32 n)
256{
257 if ((lower < n) && (n < upper))
258 return 1;
259 if ((upper < lower) && ((n > lower) || (n < upper)))
260 return 1;
261 return 0;
262}
263
264static inline int less_eq(u32 left, u32 right)
265{
266 return mod(right - left) < 32768u;
267}
268
269static inline int less(u32 left, u32 right)
270{
271 return less_eq(left, right) && (mod(right) != mod(left));
272}
273
274static inline u32 lesser(u32 left, u32 right)
275{
276 return less_eq(left, right) ? left : right;
277}
278
279
280
281
282
283
284static inline int link_working_working(struct link *l_ptr)
285{
286 return l_ptr->state == WORKING_WORKING;
287}
288
289static inline int link_working_unknown(struct link *l_ptr)
290{
291 return l_ptr->state == WORKING_UNKNOWN;
292}
293
294static inline int link_reset_unknown(struct link *l_ptr)
295{
296 return l_ptr->state == RESET_UNKNOWN;
297}
298
299static inline int link_reset_reset(struct link *l_ptr)
300{
301 return l_ptr->state == RESET_RESET;
302}
303
304static inline int link_blocked(struct link *l_ptr)
305{
306 return l_ptr->exp_msg_count || l_ptr->blocked;
307}
308
309static inline int link_congested(struct link *l_ptr)
310{
311 return l_ptr->out_queue_size >= l_ptr->queue_limit[0];
312}
313
314#endif
315