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_PORT_H
38#define _TIPC_PORT_H
39
40#include "ref.h"
41#include "net.h"
42#include "msg.h"
43#include "node_subscr.h"
44
45#define TIPC_FLOW_CONTROL_WIN 512
46
47typedef void (*tipc_msg_err_event) (void *usr_handle, u32 portref,
48 struct sk_buff **buf, unsigned char const *data,
49 unsigned int size, int reason,
50 struct tipc_portid const *attmpt_destid);
51
52typedef void (*tipc_named_msg_err_event) (void *usr_handle, u32 portref,
53 struct sk_buff **buf, unsigned char const *data,
54 unsigned int size, int reason,
55 struct tipc_name_seq const *attmpt_dest);
56
57typedef void (*tipc_conn_shutdown_event) (void *usr_handle, u32 portref,
58 struct sk_buff **buf, unsigned char const *data,
59 unsigned int size, int reason);
60
61typedef void (*tipc_msg_event) (void *usr_handle, u32 portref,
62 struct sk_buff **buf, unsigned char const *data,
63 unsigned int size, unsigned int importance,
64 struct tipc_portid const *origin);
65
66typedef void (*tipc_named_msg_event) (void *usr_handle, u32 portref,
67 struct sk_buff **buf, unsigned char const *data,
68 unsigned int size, unsigned int importance,
69 struct tipc_portid const *orig,
70 struct tipc_name_seq const *dest);
71
72typedef void (*tipc_conn_msg_event) (void *usr_handle, u32 portref,
73 struct sk_buff **buf, unsigned char const *data,
74 unsigned int size);
75
76typedef void (*tipc_continue_event) (void *usr_handle, u32 portref);
77
78
79
80
81
82
83
84
85struct user_port {
86 void *usr_handle;
87 u32 ref;
88 tipc_msg_err_event err_cb;
89 tipc_named_msg_err_event named_err_cb;
90 tipc_conn_shutdown_event conn_err_cb;
91 tipc_msg_event msg_cb;
92 tipc_named_msg_event named_msg_cb;
93 tipc_conn_msg_event conn_msg_cb;
94 tipc_continue_event continue_event_cb;
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
125struct tipc_port {
126 void *usr_handle;
127 spinlock_t *lock;
128 int connected;
129 u32 conn_type;
130 u32 conn_instance;
131 u32 conn_unacked;
132 int published;
133 u32 congested;
134 u32 max_pkt;
135 u32 ref;
136 struct tipc_msg phdr;
137 struct list_head port_list;
138 u32 (*dispatcher)(struct tipc_port *, struct sk_buff *);
139 void (*wakeup)(struct tipc_port *);
140 struct user_port *user_port;
141 struct list_head wait_list;
142 u32 waiting_pkts;
143 u32 sent;
144 u32 acked;
145 struct list_head publications;
146 u32 pub_count;
147 u32 probing_state;
148 u32 probing_interval;
149 struct timer_list timer;
150 struct tipc_node_subscr subscription;
151};
152
153extern spinlock_t tipc_port_list_lock;
154struct port_list;
155
156
157
158
159struct tipc_port *tipc_createport_raw(void *usr_handle,
160 u32 (*dispatcher)(struct tipc_port *, struct sk_buff *),
161 void (*wakeup)(struct tipc_port *), const u32 importance);
162
163int tipc_reject_msg(struct sk_buff *buf, u32 err);
164
165int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode);
166
167void tipc_acknowledge(u32 port_ref, u32 ack);
168
169int tipc_createport(void *usr_handle,
170 unsigned int importance, tipc_msg_err_event error_cb,
171 tipc_named_msg_err_event named_error_cb,
172 tipc_conn_shutdown_event conn_error_cb, tipc_msg_event msg_cb,
173 tipc_named_msg_event named_msg_cb,
174 tipc_conn_msg_event conn_msg_cb,
175 tipc_continue_event continue_event_cb, u32 *portref);
176
177int tipc_deleteport(u32 portref);
178
179int tipc_portimportance(u32 portref, unsigned int *importance);
180int tipc_set_portimportance(u32 portref, unsigned int importance);
181
182int tipc_portunreliable(u32 portref, unsigned int *isunreliable);
183int tipc_set_portunreliable(u32 portref, unsigned int isunreliable);
184
185int tipc_portunreturnable(u32 portref, unsigned int *isunreturnable);
186int tipc_set_portunreturnable(u32 portref, unsigned int isunreturnable);
187
188int tipc_publish(u32 portref, unsigned int scope,
189 struct tipc_name_seq const *name_seq);
190int tipc_withdraw(u32 portref, unsigned int scope,
191 struct tipc_name_seq const *name_seq);
192
193int tipc_connect2port(u32 portref, struct tipc_portid const *port);
194
195int tipc_disconnect(u32 portref);
196
197int tipc_shutdown(u32 ref);
198
199
200
201
202
203int tipc_disconnect_port(struct tipc_port *tp_ptr);
204
205
206
207
208int tipc_send(u32 portref, unsigned int num_sect, struct iovec const *msg_sect,
209 unsigned int total_len);
210
211int tipc_send2name(u32 portref, struct tipc_name const *name, u32 domain,
212 unsigned int num_sect, struct iovec const *msg_sect,
213 unsigned int total_len);
214
215int tipc_send2port(u32 portref, struct tipc_portid const *dest,
216 unsigned int num_sect, struct iovec const *msg_sect,
217 unsigned int total_len);
218
219int tipc_send_buf2port(u32 portref, struct tipc_portid const *dest,
220 struct sk_buff *buf, unsigned int dsz);
221
222int tipc_multicast(u32 portref, struct tipc_name_seq const *seq,
223 unsigned int section_count, struct iovec const *msg,
224 unsigned int total_len);
225
226int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr,
227 struct iovec const *msg_sect, u32 num_sect,
228 unsigned int total_len, int err);
229struct sk_buff *tipc_port_get_ports(void);
230void tipc_port_recv_proto_msg(struct sk_buff *buf);
231void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp);
232void tipc_port_reinit(void);
233
234
235
236
237
238static inline struct tipc_port *tipc_port_lock(u32 ref)
239{
240 return (struct tipc_port *)tipc_ref_lock(ref);
241}
242
243
244
245
246
247
248
249static inline void tipc_port_unlock(struct tipc_port *p_ptr)
250{
251 spin_unlock_bh(p_ptr->lock);
252}
253
254static inline struct tipc_port *tipc_port_deref(u32 ref)
255{
256 return (struct tipc_port *)tipc_ref_deref(ref);
257}
258
259static inline u32 tipc_peer_port(struct tipc_port *p_ptr)
260{
261 return msg_destport(&p_ptr->phdr);
262}
263
264static inline u32 tipc_peer_node(struct tipc_port *p_ptr)
265{
266 return msg_destnode(&p_ptr->phdr);
267}
268
269static inline int tipc_port_congested(struct tipc_port *p_ptr)
270{
271 return (p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2);
272}
273
274
275
276
277
278static inline int tipc_port_recv_msg(struct sk_buff *buf)
279{
280 struct tipc_port *p_ptr;
281 struct tipc_msg *msg = buf_msg(buf);
282 u32 destport = msg_destport(msg);
283 u32 dsz = msg_data_sz(msg);
284 u32 err;
285
286
287 if (unlikely(!destport)) {
288 tipc_net_route_msg(buf);
289 return dsz;
290 }
291
292
293 p_ptr = tipc_port_lock(destport);
294 if (likely(p_ptr)) {
295 if (likely(p_ptr->connected)) {
296 if ((unlikely(msg_origport(msg) != tipc_peer_port(p_ptr))) ||
297 (unlikely(msg_orignode(msg) != tipc_peer_node(p_ptr))) ||
298 (unlikely(!msg_connected(msg)))) {
299 err = TIPC_ERR_NO_PORT;
300 tipc_port_unlock(p_ptr);
301 goto reject;
302 }
303 }
304 err = p_ptr->dispatcher(p_ptr, buf);
305 tipc_port_unlock(p_ptr);
306 if (likely(!err))
307 return dsz;
308 } else {
309 err = TIPC_ERR_NO_PORT;
310 }
311reject:
312 return tipc_reject_msg(buf, err);
313}
314
315#endif
316