Lines Matching refs:conn

200 	struct rxrpc_connection *conn;  in rxrpc_alloc_connection()  local
204 conn = kzalloc(sizeof(struct rxrpc_connection), gfp); in rxrpc_alloc_connection()
205 if (conn) { in rxrpc_alloc_connection()
206 INIT_WORK(&conn->processor, &rxrpc_process_connection); in rxrpc_alloc_connection()
207 INIT_LIST_HEAD(&conn->bundle_link); in rxrpc_alloc_connection()
208 conn->calls = RB_ROOT; in rxrpc_alloc_connection()
209 skb_queue_head_init(&conn->rx_queue); in rxrpc_alloc_connection()
210 rwlock_init(&conn->lock); in rxrpc_alloc_connection()
211 spin_lock_init(&conn->state_lock); in rxrpc_alloc_connection()
212 atomic_set(&conn->usage, 1); in rxrpc_alloc_connection()
213 conn->debug_id = atomic_inc_return(&rxrpc_debug_id); in rxrpc_alloc_connection()
214 conn->avail_calls = RXRPC_MAXCALLS; in rxrpc_alloc_connection()
215 conn->size_align = 4; in rxrpc_alloc_connection()
216 conn->header_size = sizeof(struct rxrpc_header); in rxrpc_alloc_connection()
219 _leave(" = %p{%d}", conn, conn ? conn->debug_id : 0); in rxrpc_alloc_connection()
220 return conn; in rxrpc_alloc_connection()
228 static void rxrpc_assign_connection_id(struct rxrpc_connection *conn) in rxrpc_assign_connection_id() argument
237 epoch = conn->epoch; in rxrpc_assign_connection_id()
239 write_lock_bh(&conn->trans->conn_lock); in rxrpc_assign_connection_id()
241 conn->trans->conn_idcounter += RXRPC_CID_INC; in rxrpc_assign_connection_id()
242 if (conn->trans->conn_idcounter < RXRPC_CID_INC) in rxrpc_assign_connection_id()
243 conn->trans->conn_idcounter = RXRPC_CID_INC; in rxrpc_assign_connection_id()
244 real_conn_id = conn->trans->conn_idcounter; in rxrpc_assign_connection_id()
248 p = &conn->trans->client_conns.rb_node; in rxrpc_assign_connection_id()
268 rb_link_node(&conn->node, parent, p); in rxrpc_assign_connection_id()
269 rb_insert_color(&conn->node, &conn->trans->client_conns); in rxrpc_assign_connection_id()
271 conn->real_conn_id = real_conn_id; in rxrpc_assign_connection_id()
272 conn->cid = htonl(real_conn_id); in rxrpc_assign_connection_id()
273 write_unlock_bh(&conn->trans->conn_lock); in rxrpc_assign_connection_id()
274 _leave(" [CONNID %x CID %x]", real_conn_id, ntohl(conn->cid)); in rxrpc_assign_connection_id()
284 conn->trans->conn_idcounter = real_conn_id; in rxrpc_assign_connection_id()
302 static void rxrpc_add_call_ID_to_conn(struct rxrpc_connection *conn, in rxrpc_add_call_ID_to_conn() argument
309 write_lock_bh(&conn->lock); in rxrpc_add_call_ID_to_conn()
312 p = &conn->calls.rb_node; in rxrpc_add_call_ID_to_conn()
327 rb_insert_color(&call->conn_node, &conn->calls); in rxrpc_add_call_ID_to_conn()
329 write_unlock_bh(&conn->lock); in rxrpc_add_call_ID_to_conn()
341 struct rxrpc_connection *conn; in rxrpc_connect_exclusive() local
346 conn = rx->conn; in rxrpc_connect_exclusive()
347 if (!conn) { in rxrpc_connect_exclusive()
350 conn = rxrpc_alloc_connection(gfp); in rxrpc_connect_exclusive()
351 if (!conn) { in rxrpc_connect_exclusive()
356 conn->trans = trans; in rxrpc_connect_exclusive()
357 conn->bundle = NULL; in rxrpc_connect_exclusive()
358 conn->service_id = service_id; in rxrpc_connect_exclusive()
359 conn->epoch = rxrpc_epoch; in rxrpc_connect_exclusive()
360 conn->in_clientflag = 0; in rxrpc_connect_exclusive()
361 conn->out_clientflag = RXRPC_CLIENT_INITIATED; in rxrpc_connect_exclusive()
362 conn->cid = 0; in rxrpc_connect_exclusive()
363 conn->state = RXRPC_CONN_CLIENT; in rxrpc_connect_exclusive()
364 conn->avail_calls = RXRPC_MAXCALLS - 1; in rxrpc_connect_exclusive()
365 conn->security_level = rx->min_sec_level; in rxrpc_connect_exclusive()
366 conn->key = key_get(rx->key); in rxrpc_connect_exclusive()
368 ret = rxrpc_init_client_conn_security(conn); in rxrpc_connect_exclusive()
370 key_put(conn->key); in rxrpc_connect_exclusive()
371 kfree(conn); in rxrpc_connect_exclusive()
377 list_add_tail(&conn->link, &rxrpc_connections); in rxrpc_connect_exclusive()
384 conn->debug_id, conn->trans->debug_id); in rxrpc_connect_exclusive()
386 rxrpc_assign_connection_id(conn); in rxrpc_connect_exclusive()
387 rx->conn = conn; in rxrpc_connect_exclusive()
398 if (!conn->channels[chan]) in rxrpc_connect_exclusive()
403 atomic_inc(&conn->usage); in rxrpc_connect_exclusive()
404 conn->channels[chan] = call; in rxrpc_connect_exclusive()
405 call->conn = conn; in rxrpc_connect_exclusive()
407 call->cid = conn->cid | htonl(chan); in rxrpc_connect_exclusive()
408 call->call_id = htonl(++conn->call_counter); in rxrpc_connect_exclusive()
411 conn->debug_id, chan, ntohl(call->call_id)); in rxrpc_connect_exclusive()
415 rxrpc_add_call_ID_to_conn(conn, call); in rxrpc_connect_exclusive()
435 struct rxrpc_connection *conn, *candidate; in rxrpc_connect_call() local
451 conn = list_entry(bundle->avail_conns.next, in rxrpc_connect_call()
454 if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { in rxrpc_connect_call()
455 list_del_init(&conn->bundle_link); in rxrpc_connect_call()
459 if (--conn->avail_calls == 0) in rxrpc_connect_call()
460 list_move(&conn->bundle_link, in rxrpc_connect_call()
462 ASSERTCMP(conn->avail_calls, <, RXRPC_MAXCALLS); in rxrpc_connect_call()
463 ASSERT(conn->channels[0] == NULL || in rxrpc_connect_call()
464 conn->channels[1] == NULL || in rxrpc_connect_call()
465 conn->channels[2] == NULL || in rxrpc_connect_call()
466 conn->channels[3] == NULL); in rxrpc_connect_call()
467 atomic_inc(&conn->usage); in rxrpc_connect_call()
473 conn = list_entry(bundle->unused_conns.next, in rxrpc_connect_call()
476 if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) { in rxrpc_connect_call()
477 list_del_init(&conn->bundle_link); in rxrpc_connect_call()
481 ASSERTCMP(conn->avail_calls, ==, RXRPC_MAXCALLS); in rxrpc_connect_call()
482 conn->avail_calls = RXRPC_MAXCALLS - 1; in rxrpc_connect_call()
483 ASSERT(conn->channels[0] == NULL && in rxrpc_connect_call()
484 conn->channels[1] == NULL && in rxrpc_connect_call()
485 conn->channels[2] == NULL && in rxrpc_connect_call()
486 conn->channels[3] == NULL); in rxrpc_connect_call()
487 atomic_inc(&conn->usage); in rxrpc_connect_call()
488 list_move(&conn->bundle_link, &bundle->avail_conns); in rxrpc_connect_call()
584 if (!conn->channels[chan]) in rxrpc_connect_call()
586 ASSERT(conn->channels[0] == NULL || in rxrpc_connect_call()
587 conn->channels[1] == NULL || in rxrpc_connect_call()
588 conn->channels[2] == NULL || in rxrpc_connect_call()
589 conn->channels[3] == NULL); in rxrpc_connect_call()
593 conn->channels[chan] = call; in rxrpc_connect_call()
594 call->conn = conn; in rxrpc_connect_call()
596 call->cid = conn->cid | htonl(chan); in rxrpc_connect_call()
597 call->call_id = htonl(++conn->call_counter); in rxrpc_connect_call()
600 conn->debug_id, chan, ntohl(call->call_id)); in rxrpc_connect_call()
602 ASSERTCMP(conn->avail_calls, <, RXRPC_MAXCALLS); in rxrpc_connect_call()
605 rxrpc_add_call_ID_to_conn(conn, call); in rxrpc_connect_call()
626 struct rxrpc_connection *conn, *candidate = NULL; in rxrpc_incoming_connection() local
644 conn = rb_entry(p, struct rxrpc_connection, node); in rxrpc_incoming_connection()
646 _debug("maybe %x", conn->real_conn_id); in rxrpc_incoming_connection()
648 if (epoch < conn->epoch) in rxrpc_incoming_connection()
650 else if (epoch > conn->epoch) in rxrpc_incoming_connection()
652 else if (conn_id < conn->real_conn_id) in rxrpc_incoming_connection()
654 else if (conn_id > conn->real_conn_id) in rxrpc_incoming_connection()
687 conn = rb_entry(p, struct rxrpc_connection, node); in rxrpc_incoming_connection()
689 if (epoch < conn->epoch) in rxrpc_incoming_connection()
691 else if (epoch > conn->epoch) in rxrpc_incoming_connection()
693 else if (conn_id < conn->real_conn_id) in rxrpc_incoming_connection()
695 else if (conn_id > conn->real_conn_id) in rxrpc_incoming_connection()
702 conn = candidate; in rxrpc_incoming_connection()
704 rb_link_node(&conn->node, p, pp); in rxrpc_incoming_connection()
705 rb_insert_color(&conn->node, &trans->server_conns); in rxrpc_incoming_connection()
706 atomic_inc(&conn->trans->usage); in rxrpc_incoming_connection()
711 list_add_tail(&conn->link, &rxrpc_connections); in rxrpc_incoming_connection()
717 _net("CONNECTION %s %d {%x}", new, conn->debug_id, conn->real_conn_id); in rxrpc_incoming_connection()
719 _leave(" = %p {u=%d}", conn, atomic_read(&conn->usage)); in rxrpc_incoming_connection()
720 return conn; in rxrpc_incoming_connection()
724 if (hdr->securityIndex != conn->security_ix) { in rxrpc_incoming_connection()
728 atomic_inc(&conn->usage); in rxrpc_incoming_connection()
734 if (hdr->securityIndex != conn->security_ix) { in rxrpc_incoming_connection()
738 atomic_inc(&conn->usage); in rxrpc_incoming_connection()
756 struct rxrpc_connection *conn; in rxrpc_find_connection() local
774 conn = rb_entry(p, struct rxrpc_connection, node); in rxrpc_find_connection()
776 _debug("maybe %x", conn->real_conn_id); in rxrpc_find_connection()
778 if (epoch < conn->epoch) in rxrpc_find_connection()
780 else if (epoch > conn->epoch) in rxrpc_find_connection()
782 else if (conn_id < conn->real_conn_id) in rxrpc_find_connection()
784 else if (conn_id > conn->real_conn_id) in rxrpc_find_connection()
795 atomic_inc(&conn->usage); in rxrpc_find_connection()
797 _leave(" = %p", conn); in rxrpc_find_connection()
798 return conn; in rxrpc_find_connection()
804 void rxrpc_put_connection(struct rxrpc_connection *conn) in rxrpc_put_connection() argument
807 conn, atomic_read(&conn->usage), conn->debug_id); in rxrpc_put_connection()
809 ASSERTCMP(atomic_read(&conn->usage), >, 0); in rxrpc_put_connection()
811 conn->put_time = get_seconds(); in rxrpc_put_connection()
812 if (atomic_dec_and_test(&conn->usage)) { in rxrpc_put_connection()
823 static void rxrpc_destroy_connection(struct rxrpc_connection *conn) in rxrpc_destroy_connection() argument
825 _enter("%p{%d}", conn, atomic_read(&conn->usage)); in rxrpc_destroy_connection()
827 ASSERTCMP(atomic_read(&conn->usage), ==, 0); in rxrpc_destroy_connection()
829 _net("DESTROY CONN %d", conn->debug_id); in rxrpc_destroy_connection()
831 if (conn->bundle) in rxrpc_destroy_connection()
832 rxrpc_put_bundle(conn->trans, conn->bundle); in rxrpc_destroy_connection()
834 ASSERT(RB_EMPTY_ROOT(&conn->calls)); in rxrpc_destroy_connection()
835 rxrpc_purge_queue(&conn->rx_queue); in rxrpc_destroy_connection()
837 rxrpc_clear_conn_security(conn); in rxrpc_destroy_connection()
838 rxrpc_put_transport(conn->trans); in rxrpc_destroy_connection()
839 kfree(conn); in rxrpc_destroy_connection()
848 struct rxrpc_connection *conn, *_p; in rxrpc_connection_reaper() local
859 list_for_each_entry_safe(conn, _p, &rxrpc_connections, link) { in rxrpc_connection_reaper()
861 conn->debug_id, atomic_read(&conn->usage), in rxrpc_connection_reaper()
862 (long) now - (long) conn->put_time); in rxrpc_connection_reaper()
864 if (likely(atomic_read(&conn->usage) > 0)) in rxrpc_connection_reaper()
867 spin_lock(&conn->trans->client_lock); in rxrpc_connection_reaper()
868 write_lock(&conn->trans->conn_lock); in rxrpc_connection_reaper()
869 reap_time = conn->put_time + rxrpc_connection_expiry; in rxrpc_connection_reaper()
871 if (atomic_read(&conn->usage) > 0) { in rxrpc_connection_reaper()
874 list_move_tail(&conn->link, &graveyard); in rxrpc_connection_reaper()
875 if (conn->out_clientflag) in rxrpc_connection_reaper()
876 rb_erase(&conn->node, in rxrpc_connection_reaper()
877 &conn->trans->client_conns); in rxrpc_connection_reaper()
879 rb_erase(&conn->node, in rxrpc_connection_reaper()
880 &conn->trans->server_conns); in rxrpc_connection_reaper()
881 if (conn->bundle) { in rxrpc_connection_reaper()
882 list_del_init(&conn->bundle_link); in rxrpc_connection_reaper()
883 conn->bundle->num_conns--; in rxrpc_connection_reaper()
890 write_unlock(&conn->trans->conn_lock); in rxrpc_connection_reaper()
891 spin_unlock(&conn->trans->client_lock); in rxrpc_connection_reaper()
904 conn = list_entry(graveyard.next, struct rxrpc_connection, in rxrpc_connection_reaper()
906 list_del_init(&conn->link); in rxrpc_connection_reaper()
908 ASSERTCMP(atomic_read(&conn->usage), ==, 0); in rxrpc_connection_reaper()
909 rxrpc_destroy_connection(conn); in rxrpc_connection_reaper()