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 <net/genetlink.h>
41#include "msg.h"
42#include "node.h"
43
44
45
46#define ELINKCONG EAGAIN
47
48
49
50#define INVALID_LINK_SEQ 0x10000
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#define LINK_STARTED 0x0001
62#define LINK_STOPPED 0x0002
63
64
65
66
67#define MAX_PKT_DEFAULT 1500
68
69struct tipc_stats {
70 u32 sent_info;
71 u32 recv_info;
72 u32 sent_states;
73 u32 recv_states;
74 u32 sent_probes;
75 u32 recv_probes;
76 u32 sent_nacks;
77 u32 recv_nacks;
78 u32 sent_acks;
79 u32 sent_bundled;
80 u32 sent_bundles;
81 u32 recv_bundled;
82 u32 recv_bundles;
83 u32 retransmitted;
84 u32 sent_fragmented;
85 u32 sent_fragments;
86 u32 recv_fragmented;
87 u32 recv_fragments;
88 u32 link_congs;
89 u32 deferred_recv;
90 u32 duplicates;
91 u32 max_queue_sz;
92 u32 accu_queue_sz;
93 u32 queue_sz_counts;
94 u32 msg_length_counts;
95 u32 msg_lengths_total;
96 u32 msg_length_profile[7];
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
142struct tipc_link {
143 u32 addr;
144 char name[TIPC_MAX_LINK_NAME];
145 struct tipc_media_addr media_addr;
146 struct timer_list timer;
147 struct tipc_node *owner;
148 struct kref ref;
149
150
151 unsigned int flags;
152 u32 checkpoint;
153 u32 peer_session;
154 u32 peer_bearer_id;
155 u32 bearer_id;
156 u32 tolerance;
157 unsigned long cont_intv;
158 u32 abort_limit;
159 int state;
160 u32 fsm_msg_cnt;
161 struct {
162 unchar hdr[INT_H_SIZE];
163 unchar body[TIPC_MAX_IF_NAME];
164 } proto_msg;
165 struct tipc_msg *pmsg;
166 u32 priority;
167 char net_plane;
168 u32 queue_limit[15];
169
170
171 u32 exp_msg_count;
172 u32 reset_checkpoint;
173
174
175 u32 max_pkt;
176 u32 max_pkt_target;
177 u32 max_pkt_probes;
178
179
180 struct sk_buff_head outqueue;
181 u32 next_out_no;
182 u32 last_retransmitted;
183 u32 stale_count;
184
185
186 u32 next_in_no;
187 struct sk_buff_head deferred_queue;
188 u32 unacked_window;
189 struct sk_buff_head inputq;
190 struct sk_buff_head namedq;
191
192
193 struct sk_buff *next_out;
194 struct sk_buff_head wakeupq;
195
196
197 u32 long_msg_seq_no;
198 struct sk_buff *reasm_buf;
199
200
201 struct tipc_stats stats;
202};
203
204struct tipc_port;
205
206struct tipc_link *tipc_link_create(struct tipc_node *n_ptr,
207 struct tipc_bearer *b_ptr,
208 const struct tipc_media_addr *media_addr);
209void tipc_link_delete(struct tipc_link *link);
210void tipc_link_delete_list(struct net *net, unsigned int bearer_id,
211 bool shutting_down);
212void tipc_link_failover_send_queue(struct tipc_link *l_ptr);
213void tipc_link_dup_queue_xmit(struct tipc_link *l_ptr, struct tipc_link *dest);
214void tipc_link_reset_fragments(struct tipc_link *l_ptr);
215int tipc_link_is_up(struct tipc_link *l_ptr);
216int tipc_link_is_active(struct tipc_link *l_ptr);
217void tipc_link_purge_queues(struct tipc_link *l_ptr);
218void tipc_link_reset_all(struct tipc_node *node);
219void tipc_link_reset(struct tipc_link *l_ptr);
220void tipc_link_reset_list(struct net *net, unsigned int bearer_id);
221int tipc_link_xmit_skb(struct net *net, struct sk_buff *skb, u32 dest,
222 u32 selector);
223int tipc_link_xmit(struct net *net, struct sk_buff_head *list, u32 dest,
224 u32 selector);
225int __tipc_link_xmit(struct net *net, struct tipc_link *link,
226 struct sk_buff_head *list);
227void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int prob,
228 u32 gap, u32 tolerance, u32 priority, u32 acked_mtu);
229void tipc_link_push_packets(struct tipc_link *l_ptr);
230u32 tipc_link_defer_pkt(struct sk_buff_head *list, struct sk_buff *buf);
231void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window);
232void tipc_link_retransmit(struct tipc_link *l_ptr,
233 struct sk_buff *start, u32 retransmits);
234struct sk_buff *tipc_skb_queue_next(const struct sk_buff_head *list,
235 const struct sk_buff *skb);
236
237int tipc_nl_link_dump(struct sk_buff *skb, struct netlink_callback *cb);
238int tipc_nl_link_get(struct sk_buff *skb, struct genl_info *info);
239int tipc_nl_link_set(struct sk_buff *skb, struct genl_info *info);
240int tipc_nl_link_reset_stats(struct sk_buff *skb, struct genl_info *info);
241int tipc_nl_parse_link_prop(struct nlattr *prop, struct nlattr *props[]);
242void link_prepare_wakeup(struct tipc_link *l);
243
244
245
246
247static inline u32 buf_seqno(struct sk_buff *buf)
248{
249 return msg_seqno(buf_msg(buf));
250}
251
252static inline u32 mod(u32 x)
253{
254 return x & 0xffffu;
255}
256
257static inline int less_eq(u32 left, u32 right)
258{
259 return mod(right - left) < 32768u;
260}
261
262static inline int more(u32 left, u32 right)
263{
264 return !less_eq(left, right);
265}
266
267static inline int less(u32 left, u32 right)
268{
269 return less_eq(left, right) && (mod(right) != mod(left));
270}
271
272static inline u32 lesser(u32 left, u32 right)
273{
274 return less_eq(left, right) ? left : right;
275}
276
277static inline u32 link_own_addr(struct tipc_link *l)
278{
279 return msg_prevnode(l->pmsg);
280}
281
282
283
284
285static inline int link_working_working(struct tipc_link *l_ptr)
286{
287 return l_ptr->state == WORKING_WORKING;
288}
289
290static inline int link_working_unknown(struct tipc_link *l_ptr)
291{
292 return l_ptr->state == WORKING_UNKNOWN;
293}
294
295static inline int link_reset_unknown(struct tipc_link *l_ptr)
296{
297 return l_ptr->state == RESET_UNKNOWN;
298}
299
300static inline int link_reset_reset(struct tipc_link *l_ptr)
301{
302 return l_ptr->state == RESET_RESET;
303}
304
305static inline int link_congested(struct tipc_link *l_ptr)
306{
307 return skb_queue_len(&l_ptr->outqueue) >= l_ptr->queue_limit[0];
308}
309
310#endif
311