rxrpc: Fix firewall route keepalive
[linux-2.6-microblaze.git] / net / rxrpc / net_ns.c
index f18c924..66baf2b 100644 (file)
@@ -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);