Lines Matching refs:conn

51 static int rxrpc_get_client_connection_id(struct rxrpc_connection *conn,  in rxrpc_get_client_connection_id()  argument
54 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_get_client_connection_id()
62 id = idr_alloc_cyclic(&rxrpc_client_conn_ids, conn, in rxrpc_get_client_connection_id()
70 conn->proto.epoch = rxnet->epoch; in rxrpc_get_client_connection_id()
71 conn->proto.cid = id << RXRPC_CIDSHIFT; in rxrpc_get_client_connection_id()
72 set_bit(RXRPC_CONN_HAS_IDR, &conn->flags); in rxrpc_get_client_connection_id()
73 _leave(" [CID %x]", conn->proto.cid); in rxrpc_get_client_connection_id()
86 static void rxrpc_put_client_connection_id(struct rxrpc_connection *conn) in rxrpc_put_client_connection_id() argument
88 if (test_bit(RXRPC_CONN_HAS_IDR, &conn->flags)) { in rxrpc_put_client_connection_id()
91 conn->proto.cid >> RXRPC_CIDSHIFT); in rxrpc_put_client_connection_id()
101 struct rxrpc_connection *conn; in rxrpc_destroy_client_conn_ids() local
105 idr_for_each_entry(&rxrpc_client_conn_ids, conn, id) { in rxrpc_destroy_client_conn_ids()
107 conn, refcount_read(&conn->ref)); in rxrpc_destroy_client_conn_ids()
166 struct rxrpc_connection *conn; in rxrpc_alloc_client_connection() local
172 conn = rxrpc_alloc_connection(gfp); in rxrpc_alloc_client_connection()
173 if (!conn) { in rxrpc_alloc_client_connection()
178 refcount_set(&conn->ref, 1); in rxrpc_alloc_client_connection()
179 conn->bundle = bundle; in rxrpc_alloc_client_connection()
180 conn->params = bundle->params; in rxrpc_alloc_client_connection()
181 conn->out_clientflag = RXRPC_CLIENT_INITIATED; in rxrpc_alloc_client_connection()
182 conn->state = RXRPC_CONN_CLIENT; in rxrpc_alloc_client_connection()
183 conn->service_id = conn->params.service_id; in rxrpc_alloc_client_connection()
185 ret = rxrpc_get_client_connection_id(conn, gfp); in rxrpc_alloc_client_connection()
189 ret = rxrpc_init_client_conn_security(conn); in rxrpc_alloc_client_connection()
193 ret = conn->security->prime_packet_security(conn); in rxrpc_alloc_client_connection()
199 list_add_tail(&conn->proc_link, &rxnet->conn_proc_list); in rxrpc_alloc_client_connection()
203 rxrpc_get_peer(conn->params.peer); in rxrpc_alloc_client_connection()
204 rxrpc_get_local(conn->params.local); in rxrpc_alloc_client_connection()
205 key_get(conn->params.key); in rxrpc_alloc_client_connection()
207 trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_client, in rxrpc_alloc_client_connection()
208 refcount_read(&conn->ref), in rxrpc_alloc_client_connection()
212 trace_rxrpc_client(conn, -1, rxrpc_client_alloc); in rxrpc_alloc_client_connection()
213 _leave(" = %p", conn); in rxrpc_alloc_client_connection()
214 return conn; in rxrpc_alloc_client_connection()
217 conn->security->clear(conn); in rxrpc_alloc_client_connection()
219 rxrpc_put_client_connection_id(conn); in rxrpc_alloc_client_connection()
221 kfree(conn); in rxrpc_alloc_client_connection()
229 static bool rxrpc_may_reuse_conn(struct rxrpc_connection *conn) in rxrpc_may_reuse_conn() argument
234 if (!conn) in rxrpc_may_reuse_conn()
237 rxnet = conn->params.local->rxnet; in rxrpc_may_reuse_conn()
238 if (test_bit(RXRPC_CONN_DONT_REUSE, &conn->flags)) in rxrpc_may_reuse_conn()
241 if (conn->state != RXRPC_CONN_CLIENT || in rxrpc_may_reuse_conn()
242 conn->proto.epoch != rxnet->epoch) in rxrpc_may_reuse_conn()
252 id = conn->proto.cid >> RXRPC_CIDSHIFT; in rxrpc_may_reuse_conn()
263 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_may_reuse_conn()
519 static void rxrpc_activate_one_channel(struct rxrpc_connection *conn, in rxrpc_activate_one_channel() argument
522 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_activate_one_channel()
523 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_activate_one_channel()
528 _enter("C=%x,%u", conn->debug_id, channel); in rxrpc_activate_one_channel()
530 trace_rxrpc_client(conn, channel, rxrpc_client_chan_activate); in rxrpc_activate_one_channel()
535 clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_activate_one_channel()
536 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); in rxrpc_activate_one_channel()
540 call->peer = rxrpc_get_peer(conn->params.peer); in rxrpc_activate_one_channel()
541 call->conn = rxrpc_get_connection(conn); in rxrpc_activate_one_channel()
542 call->cid = conn->proto.cid | channel; in rxrpc_activate_one_channel()
544 call->security = conn->security; in rxrpc_activate_one_channel()
545 call->security_ix = conn->security_ix; in rxrpc_activate_one_channel()
546 call->service_id = conn->service_id; in rxrpc_activate_one_channel()
550 call->cid, call->call_id, call->debug_id, conn->debug_id); in rxrpc_activate_one_channel()
577 static void rxrpc_unidle_conn(struct rxrpc_bundle *bundle, struct rxrpc_connection *conn) in rxrpc_unidle_conn() argument
582 if (!list_empty(&conn->cache_link)) { in rxrpc_unidle_conn()
585 if (!list_empty(&conn->cache_link)) { in rxrpc_unidle_conn()
586 list_del_init(&conn->cache_link); in rxrpc_unidle_conn()
591 rxrpc_put_connection(conn); in rxrpc_unidle_conn()
601 struct rxrpc_connection *conn; in rxrpc_activate_channels_locked() local
618 conn = bundle->conns[slot]; in rxrpc_activate_channels_locked()
619 if (!conn) in rxrpc_activate_channels_locked()
623 set_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags); in rxrpc_activate_channels_locked()
624 rxrpc_unidle_conn(bundle, conn); in rxrpc_activate_channels_locked()
627 conn->act_chans |= 1 << channel; in rxrpc_activate_channels_locked()
628 rxrpc_activate_one_channel(conn, channel); in rxrpc_activate_channels_locked()
755 trace_rxrpc_client(call->conn, ret, rxrpc_client_chan_wait_failed); in rxrpc_connect_call()
768 struct rxrpc_connection *conn = call->conn; in rxrpc_expose_client_call() local
769 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_expose_client_call()
779 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_expose_client_call()
780 trace_rxrpc_client(conn, channel, rxrpc_client_exposed); in rxrpc_expose_client_call()
803 struct rxrpc_connection *conn; in rxrpc_disconnect_client_call() local
818 conn = call->conn; in rxrpc_disconnect_client_call()
819 if (!conn) { in rxrpc_disconnect_client_call()
829 chan = &conn->channels[channel]; in rxrpc_disconnect_client_call()
830 trace_rxrpc_client(conn, channel, rxrpc_client_chan_disconnect); in rxrpc_disconnect_client_call()
837 may_reuse = rxrpc_may_reuse_conn(conn); in rxrpc_disconnect_client_call()
850 __rxrpc_disconnect_call(conn, call); in rxrpc_disconnect_client_call()
852 if (test_and_clear_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags)) { in rxrpc_disconnect_client_call()
853 trace_rxrpc_client(conn, channel, rxrpc_client_to_active); in rxrpc_disconnect_client_call()
863 trace_rxrpc_client(conn, channel, rxrpc_client_chan_pass); in rxrpc_disconnect_client_call()
864 rxrpc_activate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
878 set_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_disconnect_client_call()
879 rxrpc_reduce_conn_timer(conn, final_ack_at); in rxrpc_disconnect_client_call()
884 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans); in rxrpc_disconnect_client_call()
885 conn->act_chans &= ~(1 << channel); in rxrpc_disconnect_client_call()
891 if (!conn->act_chans) { in rxrpc_disconnect_client_call()
892 trace_rxrpc_client(conn, channel, rxrpc_client_to_idle); in rxrpc_disconnect_client_call()
893 conn->idle_timestamp = jiffies; in rxrpc_disconnect_client_call()
895 rxrpc_get_connection(conn); in rxrpc_disconnect_client_call()
897 list_move_tail(&conn->cache_link, &rxnet->idle_client_conns); in rxrpc_disconnect_client_call()
912 static void rxrpc_unbundle_conn(struct rxrpc_connection *conn) in rxrpc_unbundle_conn() argument
914 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_unbundle_conn()
919 _enter("C=%x", conn->debug_id); in rxrpc_unbundle_conn()
921 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK) in rxrpc_unbundle_conn()
922 rxrpc_process_delayed_final_acks(conn, true); in rxrpc_unbundle_conn()
925 bindex = conn->bundle_shift / RXRPC_MAXCALLS; in rxrpc_unbundle_conn()
926 if (bundle->conns[bindex] == conn) { in rxrpc_unbundle_conn()
930 clear_bit(conn->bundle_shift + i, &bundle->avail_chans); in rxrpc_unbundle_conn()
937 rxrpc_put_connection(conn); in rxrpc_unbundle_conn()
965 static void rxrpc_kill_client_conn(struct rxrpc_connection *conn) in rxrpc_kill_client_conn() argument
967 struct rxrpc_local *local = conn->params.local; in rxrpc_kill_client_conn()
970 _enter("C=%x", conn->debug_id); in rxrpc_kill_client_conn()
972 trace_rxrpc_client(conn, -1, rxrpc_client_cleanup); in rxrpc_kill_client_conn()
975 rxrpc_put_client_connection_id(conn); in rxrpc_kill_client_conn()
976 rxrpc_kill_connection(conn); in rxrpc_kill_client_conn()
982 void rxrpc_put_client_conn(struct rxrpc_connection *conn) in rxrpc_put_client_conn() argument
985 unsigned int debug_id = conn->debug_id; in rxrpc_put_client_conn()
989 dead = __refcount_dec_and_test(&conn->ref, &r); in rxrpc_put_client_conn()
992 rxrpc_kill_client_conn(conn); in rxrpc_put_client_conn()
1004 struct rxrpc_connection *conn; in rxrpc_discard_expired_client_conns() local
1034 conn = list_entry(rxnet->idle_client_conns.next, in rxrpc_discard_expired_client_conns()
1046 if (conn->params.local->service_closed) in rxrpc_discard_expired_client_conns()
1049 conn_expires_at = conn->idle_timestamp + expiry; in rxrpc_discard_expired_client_conns()
1056 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_discard_expired_client_conns()
1057 list_del_init(&conn->cache_link); in rxrpc_discard_expired_client_conns()
1061 rxrpc_unbundle_conn(conn); in rxrpc_discard_expired_client_conns()
1062 rxrpc_put_connection(conn); /* Drop the ->cache_link ref */ in rxrpc_discard_expired_client_conns()
1110 struct rxrpc_connection *conn, *tmp; in rxrpc_clean_up_local_conns() local
1118 list_for_each_entry_safe(conn, tmp, &rxnet->idle_client_conns, in rxrpc_clean_up_local_conns()
1120 if (conn->params.local == local) { in rxrpc_clean_up_local_conns()
1121 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_clean_up_local_conns()
1122 list_move(&conn->cache_link, &graveyard); in rxrpc_clean_up_local_conns()
1129 conn = list_entry(graveyard.next, in rxrpc_clean_up_local_conns()
1131 list_del_init(&conn->cache_link); in rxrpc_clean_up_local_conns()
1132 rxrpc_unbundle_conn(conn); in rxrpc_clean_up_local_conns()
1133 rxrpc_put_connection(conn); in rxrpc_clean_up_local_conns()