Lines Matching refs:conn

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