diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/tipc/port.h | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'net/tipc/port.h')
-rw-r--r-- | net/tipc/port.h | 184 |
1 files changed, 147 insertions, 37 deletions
diff --git a/net/tipc/port.h b/net/tipc/port.h index 8d1652aab298..b9aa34195aec 100644 --- a/net/tipc/port.h +++ b/net/tipc/port.h | |||
@@ -2,7 +2,7 @@ | |||
2 | * net/tipc/port.h: Include file for TIPC port code | 2 | * net/tipc/port.h: Include file for TIPC port code |
3 | * | 3 | * |
4 | * Copyright (c) 1994-2007, Ericsson AB | 4 | * Copyright (c) 1994-2007, Ericsson AB |
5 | * Copyright (c) 2004-2007, Wind River Systems | 5 | * Copyright (c) 2004-2007, 2010-2011, Wind River Systems |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
8 | * Redistribution and use in source and binary forms, with or without | 8 | * Redistribution and use in source and binary forms, with or without |
@@ -37,24 +37,52 @@ | |||
37 | #ifndef _TIPC_PORT_H | 37 | #ifndef _TIPC_PORT_H |
38 | #define _TIPC_PORT_H | 38 | #define _TIPC_PORT_H |
39 | 39 | ||
40 | #include "core.h" | ||
41 | #include "ref.h" | 40 | #include "ref.h" |
42 | #include "net.h" | 41 | #include "net.h" |
43 | #include "msg.h" | 42 | #include "msg.h" |
44 | #include "dbg.h" | ||
45 | #include "node_subscr.h" | 43 | #include "node_subscr.h" |
46 | 44 | ||
45 | #define TIPC_FLOW_CONTROL_WIN 512 | ||
46 | |||
47 | typedef 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 | |||
52 | typedef 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 | |||
57 | typedef 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 | |||
61 | typedef 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 | |||
66 | typedef 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 | |||
72 | typedef void (*tipc_conn_msg_event) (void *usr_handle, u32 portref, | ||
73 | struct sk_buff **buf, unsigned char const *data, | ||
74 | unsigned int size); | ||
75 | |||
76 | typedef void (*tipc_continue_event) (void *usr_handle, u32 portref); | ||
77 | |||
47 | /** | 78 | /** |
48 | * struct user_port - TIPC user port (used with native API) | 79 | * struct user_port - TIPC user port (used with native API) |
49 | * @user_ref: id of user who created user port | ||
50 | * @usr_handle: user-specified field | 80 | * @usr_handle: user-specified field |
51 | * @ref: object reference to associated TIPC port | 81 | * @ref: object reference to associated TIPC port |
52 | * <various callback routines> | 82 | * <various callback routines> |
53 | * @uport_list: adjacent user ports in list of ports held by user | ||
54 | */ | 83 | */ |
55 | 84 | ||
56 | struct user_port { | 85 | struct user_port { |
57 | u32 user_ref; | ||
58 | void *usr_handle; | 86 | void *usr_handle; |
59 | u32 ref; | 87 | u32 ref; |
60 | tipc_msg_err_event err_cb; | 88 | tipc_msg_err_event err_cb; |
@@ -64,31 +92,48 @@ struct user_port { | |||
64 | tipc_named_msg_event named_msg_cb; | 92 | tipc_named_msg_event named_msg_cb; |
65 | tipc_conn_msg_event conn_msg_cb; | 93 | tipc_conn_msg_event conn_msg_cb; |
66 | tipc_continue_event continue_event_cb; | 94 | tipc_continue_event continue_event_cb; |
67 | struct list_head uport_list; | ||
68 | }; | 95 | }; |
69 | 96 | ||
70 | /** | 97 | /** |
71 | * struct port - TIPC port structure | 98 | * struct tipc_port - TIPC port structure |
72 | * @publ: TIPC port info available to privileged users | 99 | * @usr_handle: pointer to additional user-defined information about port |
100 | * @lock: pointer to spinlock for controlling access to port | ||
101 | * @connected: non-zero if port is currently connected to a peer port | ||
102 | * @conn_type: TIPC type used when connection was established | ||
103 | * @conn_instance: TIPC instance used when connection was established | ||
104 | * @conn_unacked: number of unacknowledged messages received from peer port | ||
105 | * @published: non-zero if port has one or more associated names | ||
106 | * @congested: non-zero if cannot send because of link or port congestion | ||
107 | * @max_pkt: maximum packet size "hint" used when building messages sent by port | ||
108 | * @ref: unique reference to port in TIPC object registry | ||
109 | * @phdr: preformatted message header used when sending messages | ||
73 | * @port_list: adjacent ports in TIPC's global list of ports | 110 | * @port_list: adjacent ports in TIPC's global list of ports |
74 | * @dispatcher: ptr to routine which handles received messages | 111 | * @dispatcher: ptr to routine which handles received messages |
75 | * @wakeup: ptr to routine to call when port is no longer congested | 112 | * @wakeup: ptr to routine to call when port is no longer congested |
76 | * @user_port: ptr to user port associated with port (if any) | 113 | * @user_port: ptr to user port associated with port (if any) |
77 | * @wait_list: adjacent ports in list of ports waiting on link congestion | 114 | * @wait_list: adjacent ports in list of ports waiting on link congestion |
78 | * @waiting_pkts: | 115 | * @waiting_pkts: |
79 | * @sent: | 116 | * @sent: # of non-empty messages sent by port |
80 | * @acked: | 117 | * @acked: # of non-empty message acknowledgements from connected port's peer |
81 | * @publications: list of publications for port | 118 | * @publications: list of publications for port |
82 | * @pub_count: total # of publications port has made during its lifetime | 119 | * @pub_count: total # of publications port has made during its lifetime |
83 | * @probing_state: | 120 | * @probing_state: |
84 | * @probing_interval: | 121 | * @probing_interval: |
85 | * @last_in_seqno: | ||
86 | * @timer_ref: | 122 | * @timer_ref: |
87 | * @subscription: "node down" subscription used to terminate failed connections | 123 | * @subscription: "node down" subscription used to terminate failed connections |
88 | */ | 124 | */ |
89 | 125 | struct tipc_port { | |
90 | struct port { | 126 | void *usr_handle; |
91 | struct tipc_port publ; | 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; | ||
92 | struct list_head port_list; | 137 | struct list_head port_list; |
93 | u32 (*dispatcher)(struct tipc_port *, struct sk_buff *); | 138 | u32 (*dispatcher)(struct tipc_port *, struct sk_buff *); |
94 | void (*wakeup)(struct tipc_port *); | 139 | void (*wakeup)(struct tipc_port *); |
@@ -101,7 +146,6 @@ struct port { | |||
101 | u32 pub_count; | 146 | u32 pub_count; |
102 | u32 probing_state; | 147 | u32 probing_state; |
103 | u32 probing_interval; | 148 | u32 probing_interval; |
104 | u32 last_in_seqno; | ||
105 | struct timer_list timer; | 149 | struct timer_list timer; |
106 | struct tipc_node_subscr subscription; | 150 | struct tipc_node_subscr subscription; |
107 | }; | 151 | }; |
@@ -109,13 +153,80 @@ struct port { | |||
109 | extern spinlock_t tipc_port_list_lock; | 153 | extern spinlock_t tipc_port_list_lock; |
110 | struct port_list; | 154 | struct port_list; |
111 | 155 | ||
112 | int tipc_port_recv_sections(struct port *p_ptr, u32 num_sect, | 156 | /* |
113 | struct iovec const *msg_sect); | 157 | * TIPC port manipulation routines |
114 | int tipc_port_reject_sections(struct port *p_ptr, struct tipc_msg *hdr, | 158 | */ |
159 | struct 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 | |||
163 | int tipc_reject_msg(struct sk_buff *buf, u32 err); | ||
164 | |||
165 | int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode); | ||
166 | |||
167 | void tipc_acknowledge(u32 port_ref, u32 ack); | ||
168 | |||
169 | int 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 | |||
177 | int tipc_deleteport(u32 portref); | ||
178 | |||
179 | int tipc_portimportance(u32 portref, unsigned int *importance); | ||
180 | int tipc_set_portimportance(u32 portref, unsigned int importance); | ||
181 | |||
182 | int tipc_portunreliable(u32 portref, unsigned int *isunreliable); | ||
183 | int tipc_set_portunreliable(u32 portref, unsigned int isunreliable); | ||
184 | |||
185 | int tipc_portunreturnable(u32 portref, unsigned int *isunreturnable); | ||
186 | int tipc_set_portunreturnable(u32 portref, unsigned int isunreturnable); | ||
187 | |||
188 | int tipc_publish(u32 portref, unsigned int scope, | ||
189 | struct tipc_name_seq const *name_seq); | ||
190 | int tipc_withdraw(u32 portref, unsigned int scope, | ||
191 | struct tipc_name_seq const *name_seq); | ||
192 | |||
193 | int tipc_connect2port(u32 portref, struct tipc_portid const *port); | ||
194 | |||
195 | int tipc_disconnect(u32 portref); | ||
196 | |||
197 | int tipc_shutdown(u32 ref); | ||
198 | |||
199 | |||
200 | /* | ||
201 | * The following routines require that the port be locked on entry | ||
202 | */ | ||
203 | int tipc_disconnect_port(struct tipc_port *tp_ptr); | ||
204 | |||
205 | /* | ||
206 | * TIPC messaging routines | ||
207 | */ | ||
208 | int tipc_send(u32 portref, unsigned int num_sect, struct iovec const *msg_sect, | ||
209 | unsigned int total_len); | ||
210 | |||
211 | int 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 | |||
215 | int 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 | |||
219 | int tipc_send_buf2port(u32 portref, struct tipc_portid const *dest, | ||
220 | struct sk_buff *buf, unsigned int dsz); | ||
221 | |||
222 | int 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 | |||
226 | int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr, | ||
115 | struct iovec const *msg_sect, u32 num_sect, | 227 | struct iovec const *msg_sect, u32 num_sect, |
116 | int err); | 228 | unsigned int total_len, int err); |
117 | struct sk_buff *tipc_port_get_ports(void); | 229 | struct sk_buff *tipc_port_get_ports(void); |
118 | struct sk_buff *port_show_stats(const void *req_tlv_area, int req_tlv_space); | ||
119 | void tipc_port_recv_proto_msg(struct sk_buff *buf); | 230 | void tipc_port_recv_proto_msg(struct sk_buff *buf); |
120 | void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp); | 231 | void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp); |
121 | void tipc_port_reinit(void); | 232 | void tipc_port_reinit(void); |
@@ -124,9 +235,9 @@ void tipc_port_reinit(void); | |||
124 | * tipc_port_lock - lock port instance referred to and return its pointer | 235 | * tipc_port_lock - lock port instance referred to and return its pointer |
125 | */ | 236 | */ |
126 | 237 | ||
127 | static inline struct port *tipc_port_lock(u32 ref) | 238 | static inline struct tipc_port *tipc_port_lock(u32 ref) |
128 | { | 239 | { |
129 | return (struct port *)tipc_ref_lock(ref); | 240 | return (struct tipc_port *)tipc_ref_lock(ref); |
130 | } | 241 | } |
131 | 242 | ||
132 | /** | 243 | /** |
@@ -135,29 +246,29 @@ static inline struct port *tipc_port_lock(u32 ref) | |||
135 | * Can use pointer instead of tipc_ref_unlock() since port is already locked. | 246 | * Can use pointer instead of tipc_ref_unlock() since port is already locked. |
136 | */ | 247 | */ |
137 | 248 | ||
138 | static inline void tipc_port_unlock(struct port *p_ptr) | 249 | static inline void tipc_port_unlock(struct tipc_port *p_ptr) |
139 | { | 250 | { |
140 | spin_unlock_bh(p_ptr->publ.lock); | 251 | spin_unlock_bh(p_ptr->lock); |
141 | } | 252 | } |
142 | 253 | ||
143 | static inline struct port* tipc_port_deref(u32 ref) | 254 | static inline struct tipc_port *tipc_port_deref(u32 ref) |
144 | { | 255 | { |
145 | return (struct port *)tipc_ref_deref(ref); | 256 | return (struct tipc_port *)tipc_ref_deref(ref); |
146 | } | 257 | } |
147 | 258 | ||
148 | static inline u32 tipc_peer_port(struct port *p_ptr) | 259 | static inline u32 tipc_peer_port(struct tipc_port *p_ptr) |
149 | { | 260 | { |
150 | return msg_destport(&p_ptr->publ.phdr); | 261 | return msg_destport(&p_ptr->phdr); |
151 | } | 262 | } |
152 | 263 | ||
153 | static inline u32 tipc_peer_node(struct port *p_ptr) | 264 | static inline u32 tipc_peer_node(struct tipc_port *p_ptr) |
154 | { | 265 | { |
155 | return msg_destnode(&p_ptr->publ.phdr); | 266 | return msg_destnode(&p_ptr->phdr); |
156 | } | 267 | } |
157 | 268 | ||
158 | static inline int tipc_port_congested(struct port *p_ptr) | 269 | static inline int tipc_port_congested(struct tipc_port *p_ptr) |
159 | { | 270 | { |
160 | return((p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2)); | 271 | return (p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2); |
161 | } | 272 | } |
162 | 273 | ||
163 | /** | 274 | /** |
@@ -166,7 +277,7 @@ static inline int tipc_port_congested(struct port *p_ptr) | |||
166 | 277 | ||
167 | static inline int tipc_port_recv_msg(struct sk_buff *buf) | 278 | static inline int tipc_port_recv_msg(struct sk_buff *buf) |
168 | { | 279 | { |
169 | struct port *p_ptr; | 280 | struct tipc_port *p_ptr; |
170 | struct tipc_msg *msg = buf_msg(buf); | 281 | struct tipc_msg *msg = buf_msg(buf); |
171 | u32 destport = msg_destport(msg); | 282 | u32 destport = msg_destport(msg); |
172 | u32 dsz = msg_data_sz(msg); | 283 | u32 dsz = msg_data_sz(msg); |
@@ -181,7 +292,7 @@ static inline int tipc_port_recv_msg(struct sk_buff *buf) | |||
181 | /* validate destination & pass to port, otherwise reject message */ | 292 | /* validate destination & pass to port, otherwise reject message */ |
182 | p_ptr = tipc_port_lock(destport); | 293 | p_ptr = tipc_port_lock(destport); |
183 | if (likely(p_ptr)) { | 294 | if (likely(p_ptr)) { |
184 | if (likely(p_ptr->publ.connected)) { | 295 | if (likely(p_ptr->connected)) { |
185 | if ((unlikely(msg_origport(msg) != tipc_peer_port(p_ptr))) || | 296 | if ((unlikely(msg_origport(msg) != tipc_peer_port(p_ptr))) || |
186 | (unlikely(msg_orignode(msg) != tipc_peer_node(p_ptr))) || | 297 | (unlikely(msg_orignode(msg) != tipc_peer_node(p_ptr))) || |
187 | (unlikely(!msg_connected(msg)))) { | 298 | (unlikely(!msg_connected(msg)))) { |
@@ -190,7 +301,7 @@ static inline int tipc_port_recv_msg(struct sk_buff *buf) | |||
190 | goto reject; | 301 | goto reject; |
191 | } | 302 | } |
192 | } | 303 | } |
193 | err = p_ptr->dispatcher(&p_ptr->publ, buf); | 304 | err = p_ptr->dispatcher(p_ptr, buf); |
194 | tipc_port_unlock(p_ptr); | 305 | tipc_port_unlock(p_ptr); |
195 | if (likely(!err)) | 306 | if (likely(!err)) |
196 | return dsz; | 307 | return dsz; |
@@ -198,7 +309,6 @@ static inline int tipc_port_recv_msg(struct sk_buff *buf) | |||
198 | err = TIPC_ERR_NO_PORT; | 309 | err = TIPC_ERR_NO_PORT; |
199 | } | 310 | } |
200 | reject: | 311 | reject: |
201 | dbg("port->rejecting, err = %x..\n",err); | ||
202 | return tipc_reject_msg(buf, err); | 312 | return tipc_reject_msg(buf, err); |
203 | } | 313 | } |
204 | 314 | ||