Lines Matching refs:conn
46 struct rxrpc_connection *conn)
48 idr_remove(&local->conn_ids, conn->proto.cid >> RXRPC_CIDSHIFT);
56 struct rxrpc_connection *conn;
60 idr_for_each_entry(&local->conn_ids, conn, id) {
61 pr_err("AF_RXRPC: Leaked client conn %p {%d}\n",
62 conn, refcount_read(&conn->ref));
147 struct rxrpc_connection *conn;
154 conn = rxrpc_alloc_connection(rxnet, GFP_ATOMIC | __GFP_NOWARN);
155 if (!conn)
158 id = idr_alloc_cyclic(&local->conn_ids, conn, 1, 0x40000000,
161 kfree(conn);
165 refcount_set(&conn->ref, 1);
166 conn->proto.cid = id << RXRPC_CIDSHIFT;
167 conn->proto.epoch = local->rxnet->epoch;
168 conn->out_clientflag = RXRPC_CLIENT_INITIATED;
169 conn->bundle = rxrpc_get_bundle(bundle, rxrpc_bundle_get_client_conn);
170 conn->local = rxrpc_get_local(bundle->local, rxrpc_local_get_client_conn);
171 conn->peer = rxrpc_get_peer(bundle->peer, rxrpc_peer_get_client_conn);
172 conn->key = key_get(bundle->key);
173 conn->security = bundle->security;
174 conn->exclusive = bundle->exclusive;
175 conn->upgrade = bundle->upgrade;
176 conn->orig_service_id = bundle->service_id;
177 conn->security_level = bundle->security_level;
178 conn->state = RXRPC_CONN_CLIENT_UNSECURED;
179 conn->service_id = conn->orig_service_id;
181 if (conn->security == &rxrpc_no_security)
182 conn->state = RXRPC_CONN_CLIENT;
186 list_add_tail(&conn->proc_link, &rxnet->conn_proc_list);
189 rxrpc_see_connection(conn, rxrpc_conn_new_client);
192 trace_rxrpc_client(conn, -1, rxrpc_client_alloc);
193 return conn;
199 static bool rxrpc_may_reuse_conn(struct rxrpc_connection *conn)
204 if (!conn)
207 rxnet = conn->rxnet;
208 if (test_bit(RXRPC_CONN_DONT_REUSE, &conn->flags))
211 if ((conn->state != RXRPC_CONN_CLIENT_UNSECURED &&
212 conn->state != RXRPC_CONN_CLIENT) ||
213 conn->proto.epoch != rxnet->epoch)
222 id_cursor = idr_get_cursor(&conn->local->conn_ids);
223 id = conn->proto.cid >> RXRPC_CIDSHIFT;
234 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags);
240 * Look up the conn bundle that matches the connection parameters, adding it if
334 struct rxrpc_connection *conn, *old;
345 conn = rxrpc_alloc_client_connection(bundle);
346 if (IS_ERR(conn)) {
347 bundle->alloc_error = PTR_ERR(conn);
352 conn->bundle_shift = shift;
353 bundle->conns[slot] = conn;
403 static void rxrpc_activate_one_channel(struct rxrpc_connection *conn,
406 struct rxrpc_channel *chan = &conn->channels[channel];
407 struct rxrpc_bundle *bundle = conn->bundle;
412 _enter("C=%x,%u", conn->debug_id, channel);
416 trace_rxrpc_client(conn, channel, rxrpc_client_chan_activate);
421 clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags);
422 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans);
425 call->conn = rxrpc_get_connection(conn, rxrpc_conn_get_activate_call);
426 call->cid = conn->proto.cid | channel;
428 call->dest_srx.srx_service = conn->service_id;
450 static void rxrpc_unidle_conn(struct rxrpc_connection *conn)
452 if (!list_empty(&conn->cache_link)) {
453 list_del_init(&conn->cache_link);
454 rxrpc_put_connection(conn, rxrpc_conn_put_unidle);
463 struct rxrpc_connection *conn;
482 conn = bundle->conns[slot];
483 if (!conn)
487 set_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags);
488 rxrpc_unidle_conn(conn);
491 conn->act_chans |= 1 << channel;
492 rxrpc_activate_one_channel(conn, channel);
524 struct rxrpc_connection *conn = call->conn;
525 struct rxrpc_channel *chan = &conn->channels[channel];
535 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags);
536 trace_rxrpc_client(conn, channel, rxrpc_client_exposed);
563 struct rxrpc_connection *conn;
575 conn = call->conn;
576 if (!conn) {
586 chan = &conn->channels[channel];
587 trace_rxrpc_client(conn, channel, rxrpc_client_chan_disconnect);
592 may_reuse = rxrpc_may_reuse_conn(conn);
605 __rxrpc_disconnect_call(conn, call);
607 if (test_and_clear_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags)) {
608 trace_rxrpc_client(conn, channel, rxrpc_client_to_active);
617 trace_rxrpc_client(conn, channel, rxrpc_client_chan_pass);
618 rxrpc_activate_one_channel(conn, channel);
632 set_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags);
633 rxrpc_reduce_conn_timer(conn, final_ack_at);
638 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans);
639 conn->act_chans &= ~(1 << channel);
645 if (!conn->act_chans) {
646 trace_rxrpc_client(conn, channel, rxrpc_client_to_idle);
647 conn->idle_timestamp = jiffies;
649 rxrpc_get_connection(conn, rxrpc_conn_get_idle);
650 list_move_tail(&conn->cache_link, &local->idle_client_conns);
659 static void rxrpc_unbundle_conn(struct rxrpc_connection *conn)
661 struct rxrpc_bundle *bundle = conn->bundle;
665 _enter("C=%x", conn->debug_id);
667 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK)
668 rxrpc_process_delayed_final_acks(conn, true);
670 bindex = conn->bundle_shift / RXRPC_MAXCALLS;
671 if (bundle->conns[bindex] == conn) {
675 clear_bit(conn->bundle_shift + i, &bundle->avail_chans);
676 rxrpc_put_client_connection_id(bundle->local, conn);
678 rxrpc_put_connection(conn, rxrpc_conn_put_unbundle);
710 void rxrpc_kill_client_conn(struct rxrpc_connection *conn)
712 struct rxrpc_local *local = conn->local;
715 _enter("C=%x", conn->debug_id);
717 trace_rxrpc_client(conn, -1, rxrpc_client_cleanup);
720 rxrpc_put_client_connection_id(local, conn);
724 * Discard expired client connections from the idle list. Each conn in the
727 * This may be called from conn setup or from a work item so cannot be
732 struct rxrpc_connection *conn;
744 conn = list_first_entry_or_null(&local->idle_client_conns,
746 if (!conn)
758 if (conn->local->service_closed)
761 conn_expires_at = conn->idle_timestamp + expiry;
768 atomic_dec(&conn->active);
769 trace_rxrpc_client(conn, -1, rxrpc_client_discard);
770 list_del_init(&conn->cache_link);
772 rxrpc_unbundle_conn(conn);
774 rxrpc_put_connection(conn, rxrpc_conn_put_discard_idle);
799 struct rxrpc_connection *conn;
807 while ((conn = list_first_entry_or_null(&local->idle_client_conns,
809 list_del_init(&conn->cache_link);
810 atomic_dec(&conn->active);
811 trace_rxrpc_client(conn, -1, rxrpc_client_discard);
812 rxrpc_unbundle_conn(conn);
813 rxrpc_put_connection(conn, rxrpc_conn_put_local_dead);