Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /* rxrpc network namespace handling.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (C) 2017 Red Hat, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Written by David Howells (dhowells@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include "ar-internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) unsigned int rxrpc_net_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) static void rxrpc_client_conn_reap_timeout(struct timer_list *timer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 	struct rxrpc_net *rxnet =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 		container_of(timer, struct rxrpc_net, client_conn_reap_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	if (rxnet->live)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 		rxrpc_queue_work(&rxnet->client_conn_reaper);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) static void rxrpc_service_conn_reap_timeout(struct timer_list *timer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	struct rxrpc_net *rxnet =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 		container_of(timer, struct rxrpc_net, service_conn_reap_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	if (rxnet->live)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 		rxrpc_queue_work(&rxnet->service_conn_reaper);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) static void rxrpc_peer_keepalive_timeout(struct timer_list *timer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	struct rxrpc_net *rxnet =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 		container_of(timer, struct rxrpc_net, peer_keepalive_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	if (rxnet->live)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 		rxrpc_queue_work(&rxnet->peer_keepalive_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  * Initialise a per-network namespace record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) static __net_init int rxrpc_init_net(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	struct rxrpc_net *rxnet = rxrpc_net(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	rxnet->live = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	get_random_bytes(&rxnet->epoch, sizeof(rxnet->epoch));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	rxnet->epoch |= RXRPC_RANDOM_EPOCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	INIT_LIST_HEAD(&rxnet->calls);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	rwlock_init(&rxnet->call_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	atomic_set(&rxnet->nr_calls, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	atomic_set(&rxnet->nr_conns, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	INIT_LIST_HEAD(&rxnet->conn_proc_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	INIT_LIST_HEAD(&rxnet->service_conns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	rwlock_init(&rxnet->conn_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	INIT_WORK(&rxnet->service_conn_reaper,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		  rxrpc_service_connection_reaper);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	timer_setup(&rxnet->service_conn_reap_timer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 		    rxrpc_service_conn_reap_timeout, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	atomic_set(&rxnet->nr_client_conns, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	rxnet->kill_all_client_conns = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	spin_lock_init(&rxnet->client_conn_cache_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	spin_lock_init(&rxnet->client_conn_discard_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	INIT_LIST_HEAD(&rxnet->idle_client_conns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	INIT_WORK(&rxnet->client_conn_reaper,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 		  rxrpc_discard_expired_client_conns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	timer_setup(&rxnet->client_conn_reap_timer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		    rxrpc_client_conn_reap_timeout, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	INIT_LIST_HEAD(&rxnet->local_endpoints);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	mutex_init(&rxnet->local_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	hash_init(rxnet->peer_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	spin_lock_init(&rxnet->peer_hash_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	for (i = 0; i < ARRAY_SIZE(rxnet->peer_keepalive); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		INIT_LIST_HEAD(&rxnet->peer_keepalive[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	INIT_LIST_HEAD(&rxnet->peer_keepalive_new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	timer_setup(&rxnet->peer_keepalive_timer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		    rxrpc_peer_keepalive_timeout, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	INIT_WORK(&rxnet->peer_keepalive_work, rxrpc_peer_keepalive_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	rxnet->peer_keepalive_base = ktime_get_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	rxnet->proc_net = proc_net_mkdir(net, "rxrpc", net->proc_net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	if (!rxnet->proc_net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 		goto err_proc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	proc_create_net("calls", 0444, rxnet->proc_net, &rxrpc_call_seq_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 			sizeof(struct seq_net_private));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	proc_create_net("conns", 0444, rxnet->proc_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 			&rxrpc_connection_seq_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 			sizeof(struct seq_net_private));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	proc_create_net("peers", 0444, rxnet->proc_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 			&rxrpc_peer_seq_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 			sizeof(struct seq_net_private));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) err_proc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	rxnet->live = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)  * Clean up a per-network namespace record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static __net_exit void rxrpc_exit_net(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	struct rxrpc_net *rxnet = rxrpc_net(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	rxnet->live = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	del_timer_sync(&rxnet->peer_keepalive_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	cancel_work_sync(&rxnet->peer_keepalive_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	rxrpc_destroy_all_calls(rxnet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	rxrpc_destroy_all_connections(rxnet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	rxrpc_destroy_all_peers(rxnet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	rxrpc_destroy_all_locals(rxnet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	proc_remove(rxnet->proc_net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct pernet_operations rxrpc_net_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	.init	= rxrpc_init_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	.exit	= rxrpc_exit_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	.id	= &rxrpc_net_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	.size	= sizeof(struct rxrpc_net),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) };