Lines Matching full:call
8 * call so as to handle retransmitted DATA packets in case the server didn't
15 * or a call ID counter overflows.
346 * Create or find a client bundle to use for a call.
348 * If we return with a connection, the call will be on its waiting list. It's
349 * left to the caller to assign a channel and wake up the call.
352 struct rxrpc_call *call, in rxrpc_prep_call() argument
359 _enter("{%d,%lx},", call->debug_id, call->user_call_ID); in rxrpc_prep_call()
365 call->cong_cwnd = cp->peer->cong_cwnd; in rxrpc_prep_call()
366 if (call->cong_cwnd >= call->cong_ssthresh) in rxrpc_prep_call()
367 call->cong_mode = RXRPC_CALL_CONGEST_AVOIDANCE; in rxrpc_prep_call()
369 call->cong_mode = RXRPC_CALL_SLOW_START; in rxrpc_prep_call()
371 __set_bit(RXRPC_CALL_UPGRADE, &call->flags); in rxrpc_prep_call()
378 /* Get this call queued. Someone else may activate it whilst we're in rxrpc_prep_call()
382 list_add_tail(&call->chan_wait_link, &bundle->waiting_calls); in rxrpc_prep_call()
465 struct rxrpc_call *call; in rxrpc_maybe_add_conn() local
479 call = list_first_entry(&bundle->waiting_calls, in rxrpc_maybe_add_conn()
481 if (test_bit(RXRPC_CALL_UPGRADE, &call->flags)) in rxrpc_maybe_add_conn()
503 * Assign a channel to the call at the front of the queue and wake the call up.
512 struct rxrpc_call *call = list_entry(bundle->waiting_calls.next, in rxrpc_activate_one_channel() local
520 /* Cancel the final ACK on the previous call if it hasn't been sent yet in rxrpc_activate_one_channel()
526 rxrpc_see_call(call); in rxrpc_activate_one_channel()
527 list_del_init(&call->chan_wait_link); in rxrpc_activate_one_channel()
528 call->peer = rxrpc_get_peer(conn->params.peer); in rxrpc_activate_one_channel()
529 call->conn = rxrpc_get_connection(conn); in rxrpc_activate_one_channel()
530 call->cid = conn->proto.cid | channel; in rxrpc_activate_one_channel()
531 call->call_id = call_id; in rxrpc_activate_one_channel()
532 call->security = conn->security; in rxrpc_activate_one_channel()
533 call->security_ix = conn->security_ix; in rxrpc_activate_one_channel()
534 call->service_id = conn->service_id; in rxrpc_activate_one_channel()
536 trace_rxrpc_connect_call(call); in rxrpc_activate_one_channel()
537 _net("CONNECT call %08x:%08x as call %d on conn %d", in rxrpc_activate_one_channel()
538 call->cid, call->call_id, call->debug_id, conn->debug_id); in rxrpc_activate_one_channel()
540 write_lock_bh(&call->state_lock); in rxrpc_activate_one_channel()
541 call->state = RXRPC_CALL_CLIENT_SEND_REQUEST; in rxrpc_activate_one_channel()
542 write_unlock_bh(&call->state_lock); in rxrpc_activate_one_channel()
549 * confirm it until the call is about to be exposed. in rxrpc_activate_one_channel()
552 * at the call ID through a connection channel. in rxrpc_activate_one_channel()
557 chan->call_debug_id = call->debug_id; in rxrpc_activate_one_channel()
558 rcu_assign_pointer(chan->call, call); in rxrpc_activate_one_channel()
559 wake_up(&call->waitq); in rxrpc_activate_one_channel()
639 * Wait for a callNumber and a channel to be granted to a call.
642 struct rxrpc_call *call, gfp_t gfp) in rxrpc_wait_for_channel() argument
647 _enter("%d", call->debug_id); in rxrpc_wait_for_channel()
656 add_wait_queue_exclusive(&call->waitq, &myself); in rxrpc_wait_for_channel()
664 switch (call->interruptibility) { in rxrpc_wait_for_channel()
674 if (READ_ONCE(call->state) != RXRPC_CALL_CLIENT_AWAIT_CONN) in rxrpc_wait_for_channel()
676 if ((call->interruptibility == RXRPC_INTERRUPTIBLE || in rxrpc_wait_for_channel()
677 call->interruptibility == RXRPC_PREINTERRUPTIBLE) && in rxrpc_wait_for_channel()
684 remove_wait_queue(&call->waitq, &myself); in rxrpc_wait_for_channel()
693 * find a connection for a call
697 struct rxrpc_call *call, in rxrpc_connect_call() argument
706 _enter("{%d,%lx},", call->debug_id, call->user_call_ID); in rxrpc_connect_call()
710 bundle = rxrpc_prep_call(rx, call, cp, srx, gfp); in rxrpc_connect_call()
716 if (call->state == RXRPC_CALL_CLIENT_AWAIT_CONN) { in rxrpc_connect_call()
717 ret = rxrpc_wait_for_channel(bundle, call, gfp); in rxrpc_connect_call()
734 list_del_init(&call->chan_wait_link); in rxrpc_connect_call()
737 if (call->state != RXRPC_CALL_CLIENT_AWAIT_CONN) { in rxrpc_connect_call()
742 trace_rxrpc_client(call->conn, ret, rxrpc_client_chan_wait_failed); in rxrpc_connect_call()
743 rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR, 0, ret); in rxrpc_connect_call()
744 rxrpc_disconnect_client_call(bundle, call); in rxrpc_connect_call()
749 * Note that a call, and thus a connection, is about to be exposed to the
752 void rxrpc_expose_client_call(struct rxrpc_call *call) in rxrpc_expose_client_call() argument
754 unsigned int channel = call->cid & RXRPC_CHANNELMASK; in rxrpc_expose_client_call()
755 struct rxrpc_connection *conn = call->conn; in rxrpc_expose_client_call()
758 if (!test_and_set_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_expose_client_call()
759 /* Mark the call ID as being used. If the callNumber counter in rxrpc_expose_client_call()
786 * Disconnect a client call.
788 void rxrpc_disconnect_client_call(struct rxrpc_bundle *bundle, struct rxrpc_call *call) in rxrpc_disconnect_client_call() argument
797 _enter("c=%x", call->debug_id); in rxrpc_disconnect_client_call()
800 set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); in rxrpc_disconnect_client_call()
805 conn = call->conn; in rxrpc_disconnect_client_call()
807 _debug("call is waiting"); in rxrpc_disconnect_client_call()
808 ASSERTCMP(call->call_id, ==, 0); in rxrpc_disconnect_client_call()
809 ASSERT(!test_bit(RXRPC_CALL_EXPOSED, &call->flags)); in rxrpc_disconnect_client_call()
810 list_del_init(&call->chan_wait_link); in rxrpc_disconnect_client_call()
814 cid = call->cid; in rxrpc_disconnect_client_call()
819 if (rcu_access_pointer(chan->call) != call) { in rxrpc_disconnect_client_call()
826 /* If a client call was exposed to the world, we save the result for in rxrpc_disconnect_client_call()
829 * We use a barrier here so that the call number and abort code can be in rxrpc_disconnect_client_call()
833 * terminal retransmission without requiring access to the call. in rxrpc_disconnect_client_call()
835 if (test_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_disconnect_client_call()
836 _debug("exposed %u,%u", call->call_id, call->abort_code); in rxrpc_disconnect_client_call()
837 __rxrpc_disconnect_call(conn, call); in rxrpc_disconnect_client_call()
848 /* See if we can pass the channel directly to another call. */ in rxrpc_disconnect_client_call()
856 * can be skipped if we find a follow-on call. The first DATA packet in rxrpc_disconnect_client_call()
857 * of the follow on call will implicitly ACK this call. in rxrpc_disconnect_client_call()
859 if (call->completion == RXRPC_CALL_SUCCEEDED && in rxrpc_disconnect_client_call()
860 test_bit(RXRPC_CALL_EXPOSED, &call->flags)) { in rxrpc_disconnect_client_call()
870 rcu_assign_pointer(chan->call, NULL); in rxrpc_disconnect_client_call()