aboutsummaryrefslogtreecommitdiffstats
path: root/net/rxrpc
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2016-06-09 18:02:51 -0400
committerDavid S. Miller <davem@davemloft.net>2016-06-10 02:30:12 -0400
commit2341e0775747864b684abe8627f3d45b167f2940 (patch)
tree7fd06d4a7946097c545af86a53bae9fed3e59744 /net/rxrpc
parent21aff3b905ad9e5e52b18a755c13fe755bd6ab3d (diff)
rxrpc: Simplify connect() implementation and simplify sendmsg() op
Simplify the RxRPC connect() implementation. It will just note the destination address it is given, and if a sendmsg() comes along with no address, this will be assigned as the address. No transport struct will be held internally, which will allow us to remove this later. Simplify sendmsg() also. Whilst a call is active, userspace refers to it by a private unique user ID specified in a control message. When sendmsg() sees a user ID that doesn't map to an extant call, it creates a new call for that user ID and attempts to add it. If, when we try to add it, the user ID is now registered, we now reject the message with -EEXIST. We should never see this situation unless two threads are racing, trying to create a call with the same ID - which would be an error. It also isn't required to provide sendmsg() with an address - provided the control message data holds a user ID that maps to a currently active call. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rxrpc')
-rw-r--r--net/rxrpc/af_rxrpc.c177
-rw-r--r--net/rxrpc/ar-call.c158
-rw-r--r--net/rxrpc/ar-connection.c17
-rw-r--r--net/rxrpc/ar-internal.h22
-rw-r--r--net/rxrpc/ar-output.c186
5 files changed, 224 insertions, 336 deletions
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c
index 7840b8e7da80..38512a200db6 100644
--- a/net/rxrpc/af_rxrpc.c
+++ b/net/rxrpc/af_rxrpc.c
@@ -139,33 +139,33 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
139 139
140 lock_sock(&rx->sk); 140 lock_sock(&rx->sk);
141 141
142 if (rx->sk.sk_state != RXRPC_UNCONNECTED) { 142 if (rx->sk.sk_state != RXRPC_UNBOUND) {
143 ret = -EINVAL; 143 ret = -EINVAL;
144 goto error_unlock; 144 goto error_unlock;
145 } 145 }
146 146
147 memcpy(&rx->srx, srx, sizeof(rx->srx)); 147 memcpy(&rx->srx, srx, sizeof(rx->srx));
148 148
149 /* Find or create a local transport endpoint to use */
150 local = rxrpc_lookup_local(&rx->srx); 149 local = rxrpc_lookup_local(&rx->srx);
151 if (IS_ERR(local)) { 150 if (IS_ERR(local)) {
152 ret = PTR_ERR(local); 151 ret = PTR_ERR(local);
153 goto error_unlock; 152 goto error_unlock;
154 } 153 }
155 154
156 rx->local = local; 155 if (rx->srx.srx_service) {
157 if (srx->srx_service) {
158 write_lock_bh(&local->services_lock); 156 write_lock_bh(&local->services_lock);
159 list_for_each_entry(prx, &local->services, listen_link) { 157 list_for_each_entry(prx, &local->services, listen_link) {
160 if (prx->srx.srx_service == srx->srx_service) 158 if (prx->srx.srx_service == rx->srx.srx_service)
161 goto service_in_use; 159 goto service_in_use;
162 } 160 }
163 161
162 rx->local = local;
164 list_add_tail(&rx->listen_link, &local->services); 163 list_add_tail(&rx->listen_link, &local->services);
165 write_unlock_bh(&local->services_lock); 164 write_unlock_bh(&local->services_lock);
166 165
167 rx->sk.sk_state = RXRPC_SERVER_BOUND; 166 rx->sk.sk_state = RXRPC_SERVER_BOUND;
168 } else { 167 } else {
168 rx->local = local;
169 rx->sk.sk_state = RXRPC_CLIENT_BOUND; 169 rx->sk.sk_state = RXRPC_CLIENT_BOUND;
170 } 170 }
171 171
@@ -174,8 +174,9 @@ static int rxrpc_bind(struct socket *sock, struct sockaddr *saddr, int len)
174 return 0; 174 return 0;
175 175
176service_in_use: 176service_in_use:
177 ret = -EADDRINUSE;
178 write_unlock_bh(&local->services_lock); 177 write_unlock_bh(&local->services_lock);
178 rxrpc_put_local(local);
179 ret = -EADDRINUSE;
179error_unlock: 180error_unlock:
180 release_sock(&rx->sk); 181 release_sock(&rx->sk);
181error: 182error:
@@ -197,11 +198,11 @@ static int rxrpc_listen(struct socket *sock, int backlog)
197 lock_sock(&rx->sk); 198 lock_sock(&rx->sk);
198 199
199 switch (rx->sk.sk_state) { 200 switch (rx->sk.sk_state) {
200 case RXRPC_UNCONNECTED: 201 case RXRPC_UNBOUND:
201 ret = -EADDRNOTAVAIL; 202 ret = -EADDRNOTAVAIL;
202 break; 203 break;
204 case RXRPC_CLIENT_UNBOUND:
203 case RXRPC_CLIENT_BOUND: 205 case RXRPC_CLIENT_BOUND:
204 case RXRPC_CLIENT_CONNECTED:
205 default: 206 default:
206 ret = -EBUSY; 207 ret = -EBUSY;
207 break; 208 break;
@@ -221,20 +222,18 @@ static int rxrpc_listen(struct socket *sock, int backlog)
221/* 222/*
222 * find a transport by address 223 * find a transport by address
223 */ 224 */
224static struct rxrpc_transport *rxrpc_name_to_transport(struct socket *sock, 225struct rxrpc_transport *rxrpc_name_to_transport(struct rxrpc_sock *rx,
225 struct sockaddr *addr, 226 struct sockaddr *addr,
226 int addr_len, int flags, 227 int addr_len, int flags,
227 gfp_t gfp) 228 gfp_t gfp)
228{ 229{
229 struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *) addr; 230 struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *) addr;
230 struct rxrpc_transport *trans; 231 struct rxrpc_transport *trans;
231 struct rxrpc_sock *rx = rxrpc_sk(sock->sk);
232 struct rxrpc_peer *peer; 232 struct rxrpc_peer *peer;
233 233
234 _enter("%p,%p,%d,%d", rx, addr, addr_len, flags); 234 _enter("%p,%p,%d,%d", rx, addr, addr_len, flags);
235 235
236 ASSERT(rx->local != NULL); 236 ASSERT(rx->local != NULL);
237 ASSERT(rx->sk.sk_state > RXRPC_UNCONNECTED);
238 237
239 if (rx->srx.transport_type != srx->transport_type) 238 if (rx->srx.transport_type != srx->transport_type)
240 return ERR_PTR(-ESOCKTNOSUPPORT); 239 return ERR_PTR(-ESOCKTNOSUPPORT);
@@ -256,7 +255,7 @@ static struct rxrpc_transport *rxrpc_name_to_transport(struct socket *sock,
256/** 255/**
257 * rxrpc_kernel_begin_call - Allow a kernel service to begin a call 256 * rxrpc_kernel_begin_call - Allow a kernel service to begin a call
258 * @sock: The socket on which to make the call 257 * @sock: The socket on which to make the call
259 * @srx: The address of the peer to contact (defaults to socket setting) 258 * @srx: The address of the peer to contact
260 * @key: The security context to use (defaults to socket setting) 259 * @key: The security context to use (defaults to socket setting)
261 * @user_call_ID: The ID to use 260 * @user_call_ID: The ID to use
262 * 261 *
@@ -282,25 +281,14 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock,
282 281
283 lock_sock(&rx->sk); 282 lock_sock(&rx->sk);
284 283
285 if (srx) { 284 trans = rxrpc_name_to_transport(rx, (struct sockaddr *)srx,
286 trans = rxrpc_name_to_transport(sock, (struct sockaddr *) srx, 285 sizeof(*srx), 0, gfp);
287 sizeof(*srx), 0, gfp); 286 if (IS_ERR(trans)) {
288 if (IS_ERR(trans)) { 287 call = ERR_CAST(trans);
289 call = ERR_CAST(trans); 288 trans = NULL;
290 trans = NULL; 289 goto out_notrans;
291 goto out_notrans;
292 }
293 } else {
294 trans = rx->trans;
295 if (!trans) {
296 call = ERR_PTR(-ENOTCONN);
297 goto out_notrans;
298 }
299 atomic_inc(&trans->usage);
300 } 290 }
301 291
302 if (!srx)
303 srx = &rx->srx;
304 if (!key) 292 if (!key)
305 key = rx->key; 293 key = rx->key;
306 if (key && !key->payload.data[0]) 294 if (key && !key->payload.data[0])
@@ -312,8 +300,7 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock,
312 goto out; 300 goto out;
313 } 301 }
314 302
315 call = rxrpc_get_client_call(rx, trans, bundle, user_call_ID, true, 303 call = rxrpc_new_client_call(rx, trans, bundle, user_call_ID, gfp);
316 gfp);
317 rxrpc_put_bundle(trans, bundle); 304 rxrpc_put_bundle(trans, bundle);
318out: 305out:
319 rxrpc_put_transport(trans); 306 rxrpc_put_transport(trans);
@@ -369,11 +356,8 @@ EXPORT_SYMBOL(rxrpc_kernel_intercept_rx_messages);
369static int rxrpc_connect(struct socket *sock, struct sockaddr *addr, 356static int rxrpc_connect(struct socket *sock, struct sockaddr *addr,
370 int addr_len, int flags) 357 int addr_len, int flags)
371{ 358{
372 struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *) addr; 359 struct sockaddr_rxrpc *srx = (struct sockaddr_rxrpc *)addr;
373 struct sock *sk = sock->sk; 360 struct rxrpc_sock *rx = rxrpc_sk(sock->sk);
374 struct rxrpc_transport *trans;
375 struct rxrpc_local *local;
376 struct rxrpc_sock *rx = rxrpc_sk(sk);
377 int ret; 361 int ret;
378 362
379 _enter("%p,%p,%d,%d", rx, addr, addr_len, flags); 363 _enter("%p,%p,%d,%d", rx, addr, addr_len, flags);
@@ -386,45 +370,28 @@ static int rxrpc_connect(struct socket *sock, struct sockaddr *addr,
386 370
387 lock_sock(&rx->sk); 371 lock_sock(&rx->sk);
388 372
373 ret = -EISCONN;
374 if (test_bit(RXRPC_SOCK_CONNECTED, &rx->flags))
375 goto error;
376
389 switch (rx->sk.sk_state) { 377 switch (rx->sk.sk_state) {
390 case RXRPC_UNCONNECTED: 378 case RXRPC_UNBOUND:
391 /* find a local transport endpoint if we don't have one already */ 379 rx->sk.sk_state = RXRPC_CLIENT_UNBOUND;
392 ASSERTCMP(rx->local, ==, NULL); 380 case RXRPC_CLIENT_UNBOUND:
393 rx->srx.srx_family = AF_RXRPC;
394 rx->srx.srx_service = 0;
395 rx->srx.transport_type = srx->transport_type;
396 rx->srx.transport_len = sizeof(sa_family_t);
397 rx->srx.transport.family = srx->transport.family;
398 local = rxrpc_lookup_local(&rx->srx);
399 if (IS_ERR(local)) {
400 release_sock(&rx->sk);
401 return PTR_ERR(local);
402 }
403 rx->local = local;
404 rx->sk.sk_state = RXRPC_CLIENT_BOUND;
405 case RXRPC_CLIENT_BOUND: 381 case RXRPC_CLIENT_BOUND:
406 break; 382 break;
407 case RXRPC_CLIENT_CONNECTED:
408 release_sock(&rx->sk);
409 return -EISCONN;
410 default: 383 default:
411 release_sock(&rx->sk); 384 ret = -EBUSY;
412 return -EBUSY; /* server sockets can't connect as well */ 385 goto error;
413 }
414
415 trans = rxrpc_name_to_transport(sock, addr, addr_len, flags,
416 GFP_KERNEL);
417 if (IS_ERR(trans)) {
418 release_sock(&rx->sk);
419 _leave(" = %ld", PTR_ERR(trans));
420 return PTR_ERR(trans);
421 } 386 }
422 387
423 rx->trans = trans; 388 rx->connect_srx = *srx;
424 rx->sk.sk_state = RXRPC_CLIENT_CONNECTED; 389 set_bit(RXRPC_SOCK_CONNECTED, &rx->flags);
390 ret = 0;
425 391
392error:
426 release_sock(&rx->sk); 393 release_sock(&rx->sk);
427 return 0; 394 return ret;
428} 395}
429 396
430/* 397/*
@@ -438,7 +405,7 @@ static int rxrpc_connect(struct socket *sock, struct sockaddr *addr,
438 */ 405 */
439static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) 406static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len)
440{ 407{
441 struct rxrpc_transport *trans; 408 struct rxrpc_local *local;
442 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); 409 struct rxrpc_sock *rx = rxrpc_sk(sock->sk);
443 int ret; 410 int ret;
444 411
@@ -455,48 +422,38 @@ static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len)
455 } 422 }
456 } 423 }
457 424
458 trans = NULL;
459 lock_sock(&rx->sk); 425 lock_sock(&rx->sk);
460 426
461 if (m->msg_name) {
462 ret = -EISCONN;
463 trans = rxrpc_name_to_transport(sock, m->msg_name,
464 m->msg_namelen, 0, GFP_KERNEL);
465 if (IS_ERR(trans)) {
466 ret = PTR_ERR(trans);
467 trans = NULL;
468 goto out;
469 }
470 } else {
471 trans = rx->trans;
472 if (trans)
473 atomic_inc(&trans->usage);
474 }
475
476 switch (rx->sk.sk_state) { 427 switch (rx->sk.sk_state) {
477 case RXRPC_SERVER_LISTENING: 428 case RXRPC_UNBOUND:
478 if (!m->msg_name) { 429 local = rxrpc_lookup_local(&rx->srx);
479 ret = rxrpc_server_sendmsg(rx, m, len); 430 if (IS_ERR(local)) {
480 break; 431 ret = PTR_ERR(local);
432 goto error_unlock;
481 } 433 }
482 case RXRPC_SERVER_BOUND: 434
435 rx->local = local;
436 rx->sk.sk_state = RXRPC_CLIENT_UNBOUND;
437 /* Fall through */
438
439 case RXRPC_CLIENT_UNBOUND:
483 case RXRPC_CLIENT_BOUND: 440 case RXRPC_CLIENT_BOUND:
484 if (!m->msg_name) { 441 if (!m->msg_name &&
485 ret = -ENOTCONN; 442 test_bit(RXRPC_SOCK_CONNECTED, &rx->flags)) {
486 break; 443 m->msg_name = &rx->connect_srx;
444 m->msg_namelen = sizeof(rx->connect_srx);
487 } 445 }
488 case RXRPC_CLIENT_CONNECTED: 446 case RXRPC_SERVER_BOUND:
489 ret = rxrpc_client_sendmsg(rx, trans, m, len); 447 case RXRPC_SERVER_LISTENING:
448 ret = rxrpc_do_sendmsg(rx, m, len);
490 break; 449 break;
491 default: 450 default:
492 ret = -ENOTCONN; 451 ret = -EINVAL;
493 break; 452 break;
494 } 453 }
495 454
496out: 455error_unlock:
497 release_sock(&rx->sk); 456 release_sock(&rx->sk);
498 if (trans)
499 rxrpc_put_transport(trans);
500 _leave(" = %d", ret); 457 _leave(" = %d", ret);
501 return ret; 458 return ret;
502} 459}
@@ -523,7 +480,7 @@ static int rxrpc_setsockopt(struct socket *sock, int level, int optname,
523 if (optlen != 0) 480 if (optlen != 0)
524 goto error; 481 goto error;
525 ret = -EISCONN; 482 ret = -EISCONN;
526 if (rx->sk.sk_state != RXRPC_UNCONNECTED) 483 if (rx->sk.sk_state != RXRPC_UNBOUND)
527 goto error; 484 goto error;
528 set_bit(RXRPC_SOCK_EXCLUSIVE_CONN, &rx->flags); 485 set_bit(RXRPC_SOCK_EXCLUSIVE_CONN, &rx->flags);
529 goto success; 486 goto success;
@@ -533,7 +490,7 @@ static int rxrpc_setsockopt(struct socket *sock, int level, int optname,
533 if (rx->key) 490 if (rx->key)
534 goto error; 491 goto error;
535 ret = -EISCONN; 492 ret = -EISCONN;
536 if (rx->sk.sk_state != RXRPC_UNCONNECTED) 493 if (rx->sk.sk_state != RXRPC_UNBOUND)
537 goto error; 494 goto error;
538 ret = rxrpc_request_key(rx, optval, optlen); 495 ret = rxrpc_request_key(rx, optval, optlen);
539 goto error; 496 goto error;
@@ -543,7 +500,7 @@ static int rxrpc_setsockopt(struct socket *sock, int level, int optname,
543 if (rx->key) 500 if (rx->key)
544 goto error; 501 goto error;
545 ret = -EISCONN; 502 ret = -EISCONN;
546 if (rx->sk.sk_state != RXRPC_UNCONNECTED) 503 if (rx->sk.sk_state != RXRPC_UNBOUND)
547 goto error; 504 goto error;
548 ret = rxrpc_server_keyring(rx, optval, optlen); 505 ret = rxrpc_server_keyring(rx, optval, optlen);
549 goto error; 506 goto error;
@@ -553,7 +510,7 @@ static int rxrpc_setsockopt(struct socket *sock, int level, int optname,
553 if (optlen != sizeof(unsigned int)) 510 if (optlen != sizeof(unsigned int))
554 goto error; 511 goto error;
555 ret = -EISCONN; 512 ret = -EISCONN;
556 if (rx->sk.sk_state != RXRPC_UNCONNECTED) 513 if (rx->sk.sk_state != RXRPC_UNBOUND)
557 goto error; 514 goto error;
558 ret = get_user(min_sec_level, 515 ret = get_user(min_sec_level,
559 (unsigned int __user *) optval); 516 (unsigned int __user *) optval);
@@ -632,7 +589,7 @@ static int rxrpc_create(struct net *net, struct socket *sock, int protocol,
632 return -ENOMEM; 589 return -ENOMEM;
633 590
634 sock_init_data(sock, sk); 591 sock_init_data(sock, sk);
635 sk->sk_state = RXRPC_UNCONNECTED; 592 sk->sk_state = RXRPC_UNBOUND;
636 sk->sk_write_space = rxrpc_write_space; 593 sk->sk_write_space = rxrpc_write_space;
637 sk->sk_max_ack_backlog = sysctl_rxrpc_max_qlen; 594 sk->sk_max_ack_backlog = sysctl_rxrpc_max_qlen;
638 sk->sk_destruct = rxrpc_sock_destructor; 595 sk->sk_destruct = rxrpc_sock_destructor;
@@ -705,14 +662,6 @@ static int rxrpc_release_sock(struct sock *sk)
705 rx->conn = NULL; 662 rx->conn = NULL;
706 } 663 }
707 664
708 if (rx->bundle) {
709 rxrpc_put_bundle(rx->trans, rx->bundle);
710 rx->bundle = NULL;
711 }
712 if (rx->trans) {
713 rxrpc_put_transport(rx->trans);
714 rx->trans = NULL;
715 }
716 if (rx->local) { 665 if (rx->local) {
717 rxrpc_put_local(rx->local); 666 rxrpc_put_local(rx->local);
718 rx->local = NULL; 667 rx->local = NULL;
diff --git a/net/rxrpc/ar-call.c b/net/rxrpc/ar-call.c
index 1fbaae1cba5f..68125dc4cb7c 100644
--- a/net/rxrpc/ar-call.c
+++ b/net/rxrpc/ar-call.c
@@ -196,6 +196,43 @@ struct rxrpc_call *rxrpc_find_call_hash(
196} 196}
197 197
198/* 198/*
199 * find an extant server call
200 * - called in process context with IRQs enabled
201 */
202struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx,
203 unsigned long user_call_ID)
204{
205 struct rxrpc_call *call;
206 struct rb_node *p;
207
208 _enter("%p,%lx", rx, user_call_ID);
209
210 read_lock(&rx->call_lock);
211
212 p = rx->calls.rb_node;
213 while (p) {
214 call = rb_entry(p, struct rxrpc_call, sock_node);
215
216 if (user_call_ID < call->user_call_ID)
217 p = p->rb_left;
218 else if (user_call_ID > call->user_call_ID)
219 p = p->rb_right;
220 else
221 goto found_extant_call;
222 }
223
224 read_unlock(&rx->call_lock);
225 _leave(" = NULL");
226 return NULL;
227
228found_extant_call:
229 rxrpc_get_call(call);
230 read_unlock(&rx->call_lock);
231 _leave(" = %p [%d]", call, atomic_read(&call->usage));
232 return call;
233}
234
235/*
199 * allocate a new call 236 * allocate a new call
200 */ 237 */
201static struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp) 238static struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp)
@@ -311,51 +348,27 @@ static struct rxrpc_call *rxrpc_alloc_client_call(
311 * set up a call for the given data 348 * set up a call for the given data
312 * - called in process context with IRQs enabled 349 * - called in process context with IRQs enabled
313 */ 350 */
314struct rxrpc_call *rxrpc_get_client_call(struct rxrpc_sock *rx, 351struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
315 struct rxrpc_transport *trans, 352 struct rxrpc_transport *trans,
316 struct rxrpc_conn_bundle *bundle, 353 struct rxrpc_conn_bundle *bundle,
317 unsigned long user_call_ID, 354 unsigned long user_call_ID,
318 int create,
319 gfp_t gfp) 355 gfp_t gfp)
320{ 356{
321 struct rxrpc_call *call, *candidate; 357 struct rxrpc_call *call, *xcall;
322 struct rb_node *p, *parent, **pp; 358 struct rb_node *parent, **pp;
323 359
324 _enter("%p,%d,%d,%lx,%d", 360 _enter("%p,%d,%d,%lx",
325 rx, trans ? trans->debug_id : -1, bundle ? bundle->debug_id : -1, 361 rx, trans->debug_id, bundle ? bundle->debug_id : -1,
326 user_call_ID, create); 362 user_call_ID);
327 363
328 /* search the extant calls first for one that matches the specified 364 call = rxrpc_alloc_client_call(rx, trans, bundle, gfp);
329 * user ID */ 365 if (IS_ERR(call)) {
330 read_lock(&rx->call_lock); 366 _leave(" = %ld", PTR_ERR(call));
331 367 return call;
332 p = rx->calls.rb_node;
333 while (p) {
334 call = rb_entry(p, struct rxrpc_call, sock_node);
335
336 if (user_call_ID < call->user_call_ID)
337 p = p->rb_left;
338 else if (user_call_ID > call->user_call_ID)
339 p = p->rb_right;
340 else
341 goto found_extant_call;
342 } 368 }
343 369
344 read_unlock(&rx->call_lock); 370 call->user_call_ID = user_call_ID;
345 371 __set_bit(RXRPC_CALL_HAS_USERID, &call->flags);
346 if (!create || !trans)
347 return ERR_PTR(-EBADSLT);
348
349 /* not yet present - create a candidate for a new record and then
350 * redo the search */
351 candidate = rxrpc_alloc_client_call(rx, trans, bundle, gfp);
352 if (IS_ERR(candidate)) {
353 _leave(" = %ld", PTR_ERR(candidate));
354 return candidate;
355 }
356
357 candidate->user_call_ID = user_call_ID;
358 __set_bit(RXRPC_CALL_HAS_USERID, &candidate->flags);
359 372
360 write_lock(&rx->call_lock); 373 write_lock(&rx->call_lock);
361 374
@@ -363,19 +376,16 @@ struct rxrpc_call *rxrpc_get_client_call(struct rxrpc_sock *rx,
363 parent = NULL; 376 parent = NULL;
364 while (*pp) { 377 while (*pp) {
365 parent = *pp; 378 parent = *pp;
366 call = rb_entry(parent, struct rxrpc_call, sock_node); 379 xcall = rb_entry(parent, struct rxrpc_call, sock_node);
367 380
368 if (user_call_ID < call->user_call_ID) 381 if (user_call_ID < xcall->user_call_ID)
369 pp = &(*pp)->rb_left; 382 pp = &(*pp)->rb_left;
370 else if (user_call_ID > call->user_call_ID) 383 else if (user_call_ID > xcall->user_call_ID)
371 pp = &(*pp)->rb_right; 384 pp = &(*pp)->rb_right;
372 else 385 else
373 goto found_extant_second; 386 goto found_user_ID_now_present;
374 } 387 }
375 388
376 /* second search also failed; add the new call */
377 call = candidate;
378 candidate = NULL;
379 rxrpc_get_call(call); 389 rxrpc_get_call(call);
380 390
381 rb_link_node(&call->sock_node, parent, pp); 391 rb_link_node(&call->sock_node, parent, pp);
@@ -391,20 +401,16 @@ struct rxrpc_call *rxrpc_get_client_call(struct rxrpc_sock *rx,
391 _leave(" = %p [new]", call); 401 _leave(" = %p [new]", call);
392 return call; 402 return call;
393 403
394 /* we found the call in the list immediately */ 404 /* We unexpectedly found the user ID in the list after taking
395found_extant_call: 405 * the call_lock. This shouldn't happen unless the user races
396 rxrpc_get_call(call); 406 * with itself and tries to add the same user ID twice at the
397 read_unlock(&rx->call_lock); 407 * same time in different threads.
398 _leave(" = %p [extant %d]", call, atomic_read(&call->usage)); 408 */
399 return call; 409found_user_ID_now_present:
400
401 /* we found the call on the second time through the list */
402found_extant_second:
403 rxrpc_get_call(call);
404 write_unlock(&rx->call_lock); 410 write_unlock(&rx->call_lock);
405 rxrpc_put_call(candidate); 411 rxrpc_put_call(call);
406 _leave(" = %p [second %d]", call, atomic_read(&call->usage)); 412 _leave(" = -EEXIST [%p]", call);
407 return call; 413 return ERR_PTR(-EEXIST);
408} 414}
409 415
410/* 416/*
@@ -566,46 +572,6 @@ old_call:
566} 572}
567 573
568/* 574/*
569 * find an extant server call
570 * - called in process context with IRQs enabled
571 */
572struct rxrpc_call *rxrpc_find_server_call(struct rxrpc_sock *rx,
573 unsigned long user_call_ID)
574{
575 struct rxrpc_call *call;
576 struct rb_node *p;
577
578 _enter("%p,%lx", rx, user_call_ID);
579
580 /* search the extant calls for one that matches the specified user
581 * ID */
582 read_lock(&rx->call_lock);
583
584 p = rx->calls.rb_node;
585 while (p) {
586 call = rb_entry(p, struct rxrpc_call, sock_node);
587
588 if (user_call_ID < call->user_call_ID)
589 p = p->rb_left;
590 else if (user_call_ID > call->user_call_ID)
591 p = p->rb_right;
592 else
593 goto found_extant_call;
594 }
595
596 read_unlock(&rx->call_lock);
597 _leave(" = NULL");
598 return NULL;
599
600 /* we found the call in the list immediately */
601found_extant_call:
602 rxrpc_get_call(call);
603 read_unlock(&rx->call_lock);
604 _leave(" = %p [%d]", call, atomic_read(&call->usage));
605 return call;
606}
607
608/*
609 * detach a call from a socket and set up for release 575 * detach a call from a socket and set up for release
610 */ 576 */
611void rxrpc_release_call(struct rxrpc_call *call) 577void rxrpc_release_call(struct rxrpc_call *call)
diff --git a/net/rxrpc/ar-connection.c b/net/rxrpc/ar-connection.c
index d67b1f1b5001..8ecde4b77b55 100644
--- a/net/rxrpc/ar-connection.c
+++ b/net/rxrpc/ar-connection.c
@@ -80,11 +80,6 @@ struct rxrpc_conn_bundle *rxrpc_get_bundle(struct rxrpc_sock *rx,
80 _enter("%p{%x},%x,%hx,", 80 _enter("%p{%x},%x,%hx,",
81 rx, key_serial(key), trans->debug_id, service_id); 81 rx, key_serial(key), trans->debug_id, service_id);
82 82
83 if (rx->trans == trans && rx->bundle) {
84 atomic_inc(&rx->bundle->usage);
85 return rx->bundle;
86 }
87
88 /* search the extant bundles first for one that matches the specified 83 /* search the extant bundles first for one that matches the specified
89 * user ID */ 84 * user ID */
90 spin_lock(&trans->client_lock); 85 spin_lock(&trans->client_lock);
@@ -138,10 +133,6 @@ struct rxrpc_conn_bundle *rxrpc_get_bundle(struct rxrpc_sock *rx,
138 rb_insert_color(&bundle->node, &trans->bundles); 133 rb_insert_color(&bundle->node, &trans->bundles);
139 spin_unlock(&trans->client_lock); 134 spin_unlock(&trans->client_lock);
140 _net("BUNDLE new on trans %d", trans->debug_id); 135 _net("BUNDLE new on trans %d", trans->debug_id);
141 if (!rx->bundle && rx->sk.sk_state == RXRPC_CLIENT_CONNECTED) {
142 atomic_inc(&bundle->usage);
143 rx->bundle = bundle;
144 }
145 _leave(" = %p [new]", bundle); 136 _leave(" = %p [new]", bundle);
146 return bundle; 137 return bundle;
147 138
@@ -150,10 +141,6 @@ found_extant_bundle:
150 atomic_inc(&bundle->usage); 141 atomic_inc(&bundle->usage);
151 spin_unlock(&trans->client_lock); 142 spin_unlock(&trans->client_lock);
152 _net("BUNDLE old on trans %d", trans->debug_id); 143 _net("BUNDLE old on trans %d", trans->debug_id);
153 if (!rx->bundle && rx->sk.sk_state == RXRPC_CLIENT_CONNECTED) {
154 atomic_inc(&bundle->usage);
155 rx->bundle = bundle;
156 }
157 _leave(" = %p [extant %d]", bundle, atomic_read(&bundle->usage)); 144 _leave(" = %p [extant %d]", bundle, atomic_read(&bundle->usage));
158 return bundle; 145 return bundle;
159 146
@@ -163,10 +150,6 @@ found_extant_second:
163 spin_unlock(&trans->client_lock); 150 spin_unlock(&trans->client_lock);
164 kfree(candidate); 151 kfree(candidate);
165 _net("BUNDLE old2 on trans %d", trans->debug_id); 152 _net("BUNDLE old2 on trans %d", trans->debug_id);
166 if (!rx->bundle && rx->sk.sk_state == RXRPC_CLIENT_CONNECTED) {
167 atomic_inc(&bundle->usage);
168 rx->bundle = bundle;
169 }
170 _leave(" = %p [second %d]", bundle, atomic_read(&bundle->usage)); 153 _leave(" = %p [second %d]", bundle, atomic_read(&bundle->usage));
171 return bundle; 154 return bundle;
172} 155}
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
index 18ab5c50ba87..b89dcdcbc65a 100644
--- a/net/rxrpc/ar-internal.h
+++ b/net/rxrpc/ar-internal.h
@@ -39,9 +39,9 @@ struct rxrpc_crypt {
39 * sk_state for RxRPC sockets 39 * sk_state for RxRPC sockets
40 */ 40 */
41enum { 41enum {
42 RXRPC_UNCONNECTED = 0, 42 RXRPC_UNBOUND = 0,
43 RXRPC_CLIENT_UNBOUND, /* Unbound socket used as client */
43 RXRPC_CLIENT_BOUND, /* client local address bound */ 44 RXRPC_CLIENT_BOUND, /* client local address bound */
44 RXRPC_CLIENT_CONNECTED, /* client is connected */
45 RXRPC_SERVER_BOUND, /* server local address bound */ 45 RXRPC_SERVER_BOUND, /* server local address bound */
46 RXRPC_SERVER_LISTENING, /* server listening for connections */ 46 RXRPC_SERVER_LISTENING, /* server listening for connections */
47 RXRPC_CLOSE, /* socket is being closed */ 47 RXRPC_CLOSE, /* socket is being closed */
@@ -55,8 +55,6 @@ struct rxrpc_sock {
55 struct sock sk; 55 struct sock sk;
56 rxrpc_interceptor_t interceptor; /* kernel service Rx interceptor function */ 56 rxrpc_interceptor_t interceptor; /* kernel service Rx interceptor function */
57 struct rxrpc_local *local; /* local endpoint */ 57 struct rxrpc_local *local; /* local endpoint */
58 struct rxrpc_transport *trans; /* transport handler */
59 struct rxrpc_conn_bundle *bundle; /* virtual connection bundle */
60 struct rxrpc_connection *conn; /* exclusive virtual connection */ 58 struct rxrpc_connection *conn; /* exclusive virtual connection */
61 struct list_head listen_link; /* link in the local endpoint's listen list */ 59 struct list_head listen_link; /* link in the local endpoint's listen list */
62 struct list_head secureq; /* calls awaiting connection security clearance */ 60 struct list_head secureq; /* calls awaiting connection security clearance */
@@ -65,11 +63,13 @@ struct rxrpc_sock {
65 struct key *securities; /* list of server security descriptors */ 63 struct key *securities; /* list of server security descriptors */
66 struct rb_root calls; /* outstanding calls on this socket */ 64 struct rb_root calls; /* outstanding calls on this socket */
67 unsigned long flags; 65 unsigned long flags;
66#define RXRPC_SOCK_CONNECTED 0 /* connect_srx is set */
68#define RXRPC_SOCK_EXCLUSIVE_CONN 1 /* exclusive connection for a client socket */ 67#define RXRPC_SOCK_EXCLUSIVE_CONN 1 /* exclusive connection for a client socket */
69 rwlock_t call_lock; /* lock for calls */ 68 rwlock_t call_lock; /* lock for calls */
70 u32 min_sec_level; /* minimum security level */ 69 u32 min_sec_level; /* minimum security level */
71#define RXRPC_SECURITY_MAX RXRPC_SECURITY_ENCRYPT 70#define RXRPC_SECURITY_MAX RXRPC_SECURITY_ENCRYPT
72 struct sockaddr_rxrpc srx; /* local address */ 71 struct sockaddr_rxrpc srx; /* local address */
72 struct sockaddr_rxrpc connect_srx; /* Default client address from connect() */
73 sa_family_t proto; /* protocol created with */ 73 sa_family_t proto; /* protocol created with */
74}; 74};
75 75
@@ -477,6 +477,10 @@ extern u32 rxrpc_epoch;
477extern atomic_t rxrpc_debug_id; 477extern atomic_t rxrpc_debug_id;
478extern struct workqueue_struct *rxrpc_workqueue; 478extern struct workqueue_struct *rxrpc_workqueue;
479 479
480extern struct rxrpc_transport *rxrpc_name_to_transport(struct rxrpc_sock *,
481 struct sockaddr *,
482 int, int, gfp_t);
483
480/* 484/*
481 * ar-accept.c 485 * ar-accept.c
482 */ 486 */
@@ -502,14 +506,14 @@ extern rwlock_t rxrpc_call_lock;
502 506
503struct rxrpc_call *rxrpc_find_call_hash(struct rxrpc_host_header *, 507struct rxrpc_call *rxrpc_find_call_hash(struct rxrpc_host_header *,
504 void *, sa_family_t, const void *); 508 void *, sa_family_t, const void *);
505struct rxrpc_call *rxrpc_get_client_call(struct rxrpc_sock *, 509struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *, unsigned long);
510struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *,
506 struct rxrpc_transport *, 511 struct rxrpc_transport *,
507 struct rxrpc_conn_bundle *, 512 struct rxrpc_conn_bundle *,
508 unsigned long, int, gfp_t); 513 unsigned long, gfp_t);
509struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *, 514struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *,
510 struct rxrpc_connection *, 515 struct rxrpc_connection *,
511 struct rxrpc_host_header *); 516 struct rxrpc_host_header *);
512struct rxrpc_call *rxrpc_find_server_call(struct rxrpc_sock *, unsigned long);
513void rxrpc_release_call(struct rxrpc_call *); 517void rxrpc_release_call(struct rxrpc_call *);
514void rxrpc_release_calls_on_socket(struct rxrpc_sock *); 518void rxrpc_release_calls_on_socket(struct rxrpc_sock *);
515void __rxrpc_put_call(struct rxrpc_call *); 519void __rxrpc_put_call(struct rxrpc_call *);
@@ -581,9 +585,7 @@ int rxrpc_get_server_data_key(struct rxrpc_connection *, const void *, time_t,
581extern unsigned int rxrpc_resend_timeout; 585extern unsigned int rxrpc_resend_timeout;
582 586
583int rxrpc_send_packet(struct rxrpc_transport *, struct sk_buff *); 587int rxrpc_send_packet(struct rxrpc_transport *, struct sk_buff *);
584int rxrpc_client_sendmsg(struct rxrpc_sock *, struct rxrpc_transport *, 588int rxrpc_do_sendmsg(struct rxrpc_sock *, struct msghdr *, size_t);
585 struct msghdr *, size_t);
586int rxrpc_server_sendmsg(struct rxrpc_sock *, struct msghdr *, size_t);
587 589
588/* 590/*
589 * ar-peer.c 591 * ar-peer.c
diff --git a/net/rxrpc/ar-output.c b/net/rxrpc/ar-output.c
index ea619535f0ed..2e3c4064e29c 100644
--- a/net/rxrpc/ar-output.c
+++ b/net/rxrpc/ar-output.c
@@ -32,13 +32,13 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
32/* 32/*
33 * extract control messages from the sendmsg() control buffer 33 * extract control messages from the sendmsg() control buffer
34 */ 34 */
35static int rxrpc_sendmsg_cmsg(struct rxrpc_sock *rx, struct msghdr *msg, 35static int rxrpc_sendmsg_cmsg(struct msghdr *msg,
36 unsigned long *user_call_ID, 36 unsigned long *user_call_ID,
37 enum rxrpc_command *command, 37 enum rxrpc_command *command,
38 u32 *abort_code, 38 u32 *abort_code)
39 bool server)
40{ 39{
41 struct cmsghdr *cmsg; 40 struct cmsghdr *cmsg;
41 bool got_user_ID = false;
42 int len; 42 int len;
43 43
44 *command = RXRPC_CMD_SEND_DATA; 44 *command = RXRPC_CMD_SEND_DATA;
@@ -70,6 +70,7 @@ static int rxrpc_sendmsg_cmsg(struct rxrpc_sock *rx, struct msghdr *msg,
70 CMSG_DATA(cmsg); 70 CMSG_DATA(cmsg);
71 } 71 }
72 _debug("User Call ID %lx", *user_call_ID); 72 _debug("User Call ID %lx", *user_call_ID);
73 got_user_ID = true;
73 break; 74 break;
74 75
75 case RXRPC_ABORT: 76 case RXRPC_ABORT:
@@ -90,8 +91,6 @@ static int rxrpc_sendmsg_cmsg(struct rxrpc_sock *rx, struct msghdr *msg,
90 *command = RXRPC_CMD_ACCEPT; 91 *command = RXRPC_CMD_ACCEPT;
91 if (len != 0) 92 if (len != 0)
92 return -EINVAL; 93 return -EINVAL;
93 if (!server)
94 return -EISCONN;
95 break; 94 break;
96 95
97 default: 96 default:
@@ -99,6 +98,8 @@ static int rxrpc_sendmsg_cmsg(struct rxrpc_sock *rx, struct msghdr *msg,
99 } 98 }
100 } 99 }
101 100
101 if (!got_user_ID)
102 return -EINVAL;
102 _leave(" = 0"); 103 _leave(" = 0");
103 return 0; 104 return 0;
104} 105}
@@ -126,55 +127,96 @@ static void rxrpc_send_abort(struct rxrpc_call *call, u32 abort_code)
126} 127}
127 128
128/* 129/*
130 * Create a new client call for sendmsg().
131 */
132static struct rxrpc_call *
133rxrpc_new_client_call_for_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg,
134 unsigned long user_call_ID)
135{
136 struct rxrpc_conn_bundle *bundle;
137 struct rxrpc_transport *trans;
138 struct rxrpc_call *call;
139 struct key *key;
140 long ret;
141
142 DECLARE_SOCKADDR(struct sockaddr_rxrpc *, srx, msg->msg_name);
143
144 _enter("");
145
146 if (!msg->msg_name)
147 return ERR_PTR(-EDESTADDRREQ);
148
149 trans = rxrpc_name_to_transport(rx, msg->msg_name, msg->msg_namelen, 0,
150 GFP_KERNEL);
151 if (IS_ERR(trans)) {
152 ret = PTR_ERR(trans);
153 goto out;
154 }
155
156 key = rx->key;
157 if (key && !rx->key->payload.data[0])
158 key = NULL;
159 bundle = rxrpc_get_bundle(rx, trans, key, srx->srx_service, GFP_KERNEL);
160 if (IS_ERR(bundle)) {
161 ret = PTR_ERR(bundle);
162 goto out_trans;
163 }
164
165 call = rxrpc_new_client_call(rx, trans, bundle, user_call_ID,
166 GFP_KERNEL);
167 rxrpc_put_bundle(trans, bundle);
168 rxrpc_put_transport(trans);
169 if (IS_ERR(call)) {
170 ret = PTR_ERR(call);
171 goto out_trans;
172 }
173
174 _leave(" = %p\n", call);
175 return call;
176
177out_trans:
178 rxrpc_put_transport(trans);
179out:
180 _leave(" = %ld", ret);
181 return ERR_PTR(ret);
182}
183
184/*
129 * send a message forming part of a client call through an RxRPC socket 185 * send a message forming part of a client call through an RxRPC socket
130 * - caller holds the socket locked 186 * - caller holds the socket locked
131 * - the socket may be either a client socket or a server socket 187 * - the socket may be either a client socket or a server socket
132 */ 188 */
133int rxrpc_client_sendmsg(struct rxrpc_sock *rx, struct rxrpc_transport *trans, 189int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
134 struct msghdr *msg, size_t len)
135{ 190{
136 struct rxrpc_conn_bundle *bundle;
137 enum rxrpc_command cmd; 191 enum rxrpc_command cmd;
138 struct rxrpc_call *call; 192 struct rxrpc_call *call;
139 unsigned long user_call_ID = 0; 193 unsigned long user_call_ID = 0;
140 struct key *key;
141 u16 service_id;
142 u32 abort_code = 0; 194 u32 abort_code = 0;
143 int ret; 195 int ret;
144 196
145 _enter(""); 197 _enter("");
146 198
147 ASSERT(trans != NULL); 199 ret = rxrpc_sendmsg_cmsg(msg, &user_call_ID, &cmd, &abort_code);
148
149 ret = rxrpc_sendmsg_cmsg(rx, msg, &user_call_ID, &cmd, &abort_code,
150 false);
151 if (ret < 0) 200 if (ret < 0)
152 return ret; 201 return ret;
153 202
154 bundle = NULL; 203 if (cmd == RXRPC_CMD_ACCEPT) {
155 if (trans) { 204 if (rx->sk.sk_state != RXRPC_SERVER_LISTENING)
156 service_id = rx->srx.srx_service; 205 return -EINVAL;
157 if (msg->msg_name) { 206 call = rxrpc_accept_call(rx, user_call_ID);
158 DECLARE_SOCKADDR(struct sockaddr_rxrpc *, srx, 207 if (IS_ERR(call))
159 msg->msg_name); 208 return PTR_ERR(call);
160 service_id = srx->srx_service; 209 rxrpc_put_call(call);
161 } 210 return 0;
162 key = rx->key;
163 if (key && !rx->key->payload.data[0])
164 key = NULL;
165 bundle = rxrpc_get_bundle(rx, trans, key, service_id,
166 GFP_KERNEL);
167 if (IS_ERR(bundle))
168 return PTR_ERR(bundle);
169 } 211 }
170 212
171 call = rxrpc_get_client_call(rx, trans, bundle, user_call_ID, 213 call = rxrpc_find_call_by_user_ID(rx, user_call_ID);
172 abort_code == 0, GFP_KERNEL); 214 if (!call) {
173 if (trans) 215 if (cmd != RXRPC_CMD_SEND_DATA)
174 rxrpc_put_bundle(trans, bundle); 216 return -EBADSLT;
175 if (IS_ERR(call)) { 217 call = rxrpc_new_client_call_for_sendmsg(rx, msg, user_call_ID);
176 _leave(" = %ld", PTR_ERR(call)); 218 if (IS_ERR(call))
177 return PTR_ERR(call); 219 return PTR_ERR(call);
178 } 220 }
179 221
180 _debug("CALL %d USR %lx ST %d on CONN %p", 222 _debug("CALL %d USR %lx ST %d on CONN %p",
@@ -182,14 +224,21 @@ int rxrpc_client_sendmsg(struct rxrpc_sock *rx, struct rxrpc_transport *trans,
182 224
183 if (call->state >= RXRPC_CALL_COMPLETE) { 225 if (call->state >= RXRPC_CALL_COMPLETE) {
184 /* it's too late for this call */ 226 /* it's too late for this call */
185 ret = -ESHUTDOWN; 227 ret = -ECONNRESET;
186 } else if (cmd == RXRPC_CMD_SEND_ABORT) { 228 } else if (cmd == RXRPC_CMD_SEND_ABORT) {
187 rxrpc_send_abort(call, abort_code); 229 rxrpc_send_abort(call, abort_code);
230 ret = 0;
188 } else if (cmd != RXRPC_CMD_SEND_DATA) { 231 } else if (cmd != RXRPC_CMD_SEND_DATA) {
189 ret = -EINVAL; 232 ret = -EINVAL;
190 } else if (call->state != RXRPC_CALL_CLIENT_SEND_REQUEST) { 233 } else if (!call->in_clientflag &&
234 call->state != RXRPC_CALL_CLIENT_SEND_REQUEST) {
191 /* request phase complete for this client call */ 235 /* request phase complete for this client call */
192 ret = -EPROTO; 236 ret = -EPROTO;
237 } else if (call->in_clientflag &&
238 call->state != RXRPC_CALL_SERVER_ACK_REQUEST &&
239 call->state != RXRPC_CALL_SERVER_SEND_REPLY) {
240 /* Reply phase not begun or not complete for service call. */
241 ret = -EPROTO;
193 } else { 242 } else {
194 ret = rxrpc_send_data(rx, call, msg, len); 243 ret = rxrpc_send_data(rx, call, msg, len);
195 } 244 }
@@ -268,67 +317,6 @@ void rxrpc_kernel_abort_call(struct rxrpc_call *call, u32 abort_code)
268EXPORT_SYMBOL(rxrpc_kernel_abort_call); 317EXPORT_SYMBOL(rxrpc_kernel_abort_call);
269 318
270/* 319/*
271 * send a message through a server socket
272 * - caller holds the socket locked
273 */
274int rxrpc_server_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
275{
276 enum rxrpc_command cmd;
277 struct rxrpc_call *call;
278 unsigned long user_call_ID = 0;
279 u32 abort_code = 0;
280 int ret;
281
282 _enter("");
283
284 ret = rxrpc_sendmsg_cmsg(rx, msg, &user_call_ID, &cmd, &abort_code,
285 true);
286 if (ret < 0)
287 return ret;
288
289 if (cmd == RXRPC_CMD_ACCEPT) {
290 call = rxrpc_accept_call(rx, user_call_ID);
291 if (IS_ERR(call))
292 return PTR_ERR(call);
293 rxrpc_put_call(call);
294 return 0;
295 }
296
297 call = rxrpc_find_server_call(rx, user_call_ID);
298 if (!call)
299 return -EBADSLT;
300 if (call->state >= RXRPC_CALL_COMPLETE) {
301 ret = -ESHUTDOWN;
302 goto out;
303 }
304
305 switch (cmd) {
306 case RXRPC_CMD_SEND_DATA:
307 if (call->state != RXRPC_CALL_CLIENT_SEND_REQUEST &&
308 call->state != RXRPC_CALL_SERVER_ACK_REQUEST &&
309 call->state != RXRPC_CALL_SERVER_SEND_REPLY) {
310 /* Tx phase not yet begun for this call */
311 ret = -EPROTO;
312 break;
313 }
314
315 ret = rxrpc_send_data(rx, call, msg, len);
316 break;
317
318 case RXRPC_CMD_SEND_ABORT:
319 rxrpc_send_abort(call, abort_code);
320 break;
321 default:
322 BUG();
323 }
324
325 out:
326 rxrpc_put_call(call);
327 _leave(" = %d", ret);
328 return ret;
329}
330
331/*
332 * send a packet through the transport endpoint 320 * send a packet through the transport endpoint
333 */ 321 */
334int rxrpc_send_packet(struct rxrpc_transport *trans, struct sk_buff *skb) 322int rxrpc_send_packet(struct rxrpc_transport *trans, struct sk_buff *skb)