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 tipc_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);
204int tipc_port_peer_msg(struct tipc_port *p_ptr, struct tipc_msg *msg);
205
206
207
208
209int tipc_port_recv_msg(struct sk_buff *buf);
210int tipc_send(u32 portref, unsigned int num_sect, struct iovec const *msg_sect,
211 unsigned int total_len);
212
213int tipc_send2name(u32 portref, struct tipc_name const *name, u32 domain,
214 unsigned int num_sect, struct iovec const *msg_sect,
215 unsigned int total_len);
216
217int tipc_send2port(u32 portref, struct tipc_portid const *dest,
218 unsigned int num_sect, struct iovec const *msg_sect,
219 unsigned int total_len);
220
221int tipc_send_buf2port(u32 portref, struct tipc_portid const *dest,
222 struct sk_buff *buf, unsigned int dsz);
223
224int tipc_multicast(u32 portref, struct tipc_name_seq const *seq,
225 unsigned int section_count, struct iovec const *msg,
226 unsigned int total_len);
227
228int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr,
229 struct iovec const *msg_sect, u32 num_sect,
230 unsigned int total_len, int err);
231struct sk_buff *tipc_port_get_ports(void);
232void tipc_port_recv_proto_msg(struct sk_buff *buf);
233void tipc_port_recv_mcast(struct sk_buff *buf, struct tipc_port_list *dp);
234void tipc_port_reinit(void);
235
236
237
238
239static inline struct tipc_port *tipc_port_lock(u32 ref)
240{
241 return (struct tipc_port *)tipc_ref_lock(ref);
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 int tipc_port_congested(struct tipc_port *p_ptr)
260{
261 return (p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2);
262}
263
264#endif
265