rxrpc: Fix firewall route keepalive
Fix the firewall route keepalive part of AF_RXRPC which is currently function incorrectly by replying to VERSION REPLY packets from the server with VERSION REQUEST packets. Instead, send VERSION REPLY packets to the peers of service connections to act as keep-alives 20s after the latest packet was transmitted to that peer. Also, just discard VERSION REPLY packets rather than replying to them. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -32,13 +32,22 @@ static void rxrpc_service_conn_reap_timeout(struct timer_list *timer)
|
||||
rxrpc_queue_work(&rxnet->service_conn_reaper);
|
||||
}
|
||||
|
||||
static void rxrpc_peer_keepalive_timeout(struct timer_list *timer)
|
||||
{
|
||||
struct rxrpc_net *rxnet =
|
||||
container_of(timer, struct rxrpc_net, peer_keepalive_timer);
|
||||
|
||||
if (rxnet->live)
|
||||
rxrpc_queue_work(&rxnet->peer_keepalive_work);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialise a per-network namespace record.
|
||||
*/
|
||||
static __net_init int rxrpc_init_net(struct net *net)
|
||||
{
|
||||
struct rxrpc_net *rxnet = rxrpc_net(net);
|
||||
int ret;
|
||||
int ret, i;
|
||||
|
||||
rxnet->live = true;
|
||||
get_random_bytes(&rxnet->epoch, sizeof(rxnet->epoch));
|
||||
@@ -70,8 +79,16 @@ static __net_init int rxrpc_init_net(struct net *net)
|
||||
|
||||
INIT_LIST_HEAD(&rxnet->local_endpoints);
|
||||
mutex_init(&rxnet->local_mutex);
|
||||
|
||||
hash_init(rxnet->peer_hash);
|
||||
spin_lock_init(&rxnet->peer_hash_lock);
|
||||
for (i = 0; i < ARRAY_SIZE(rxnet->peer_keepalive); i++)
|
||||
INIT_HLIST_HEAD(&rxnet->peer_keepalive[i]);
|
||||
INIT_HLIST_HEAD(&rxnet->peer_keepalive_new);
|
||||
timer_setup(&rxnet->peer_keepalive_timer,
|
||||
rxrpc_peer_keepalive_timeout, 0);
|
||||
INIT_WORK(&rxnet->peer_keepalive_work, rxrpc_peer_keepalive_worker);
|
||||
rxnet->peer_keepalive_base = ktime_add(ktime_get_real(), NSEC_PER_SEC);
|
||||
|
||||
ret = -ENOMEM;
|
||||
rxnet->proc_net = proc_net_mkdir(net, "rxrpc", net->proc_net);
|
||||
@@ -95,6 +112,8 @@ static __net_exit void rxrpc_exit_net(struct net *net)
|
||||
struct rxrpc_net *rxnet = rxrpc_net(net);
|
||||
|
||||
rxnet->live = false;
|
||||
del_timer_sync(&rxnet->peer_keepalive_timer);
|
||||
cancel_work_sync(&rxnet->peer_keepalive_work);
|
||||
rxrpc_destroy_all_calls(rxnet);
|
||||
rxrpc_destroy_all_connections(rxnet);
|
||||
rxrpc_destroy_all_locals(rxnet);
|
||||
|
Reference in New Issue
Block a user