]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - net/rxrpc/ar-internal.h
rxrpc: Support network namespacing
[mirror_ubuntu-artful-kernel.git] / net / rxrpc / ar-internal.h
index 7486926e60a88a56a364b727800f3cd1a671d808..067dbb3121d0b1f87170852551cec3eec785716b 100644 (file)
@@ -11,6 +11,8 @@
 
 #include <linux/atomic.h>
 #include <linux/seqlock.h>
+#include <net/net_namespace.h>
+#include <net/netns/generic.h>
 #include <net/sock.h>
 #include <net/af_rxrpc.h>
 #include <rxrpc/packet.h>
@@ -64,6 +66,37 @@ enum {
        RXRPC_CLOSE,                    /* socket is being closed */
 };
 
+/*
+ * Per-network namespace data.
+ */
+struct rxrpc_net {
+       struct proc_dir_entry   *proc_net;      /* Subdir in /proc/net */
+       u32                     epoch;          /* Local epoch for detecting local-end reset */
+       struct list_head        calls;          /* List of calls active in this namespace */
+       rwlock_t                call_lock;      /* Lock for ->calls */
+
+       struct list_head        conn_proc_list; /* List of conns in this namespace for proc */
+       struct list_head        service_conns;  /* Service conns in this namespace */
+       rwlock_t                conn_lock;      /* Lock for ->conn_proc_list, ->service_conns */
+       struct delayed_work     service_conn_reaper;
+
+       unsigned int            nr_client_conns;
+       unsigned int            nr_active_client_conns;
+       bool                    kill_all_client_conns;
+       spinlock_t              client_conn_cache_lock; /* Lock for ->*_client_conns */
+       spinlock_t              client_conn_discard_lock; /* Prevent multiple discarders */
+       struct list_head        waiting_client_conns;
+       struct list_head        active_client_conns;
+       struct list_head        idle_client_conns;
+       struct delayed_work     client_conn_reaper;
+
+       struct list_head        local_endpoints;
+       struct mutex            local_mutex;    /* Lock for ->local_endpoints */
+
+       spinlock_t              peer_hash_lock; /* Lock for ->peer_hash */
+       DECLARE_HASHTABLE       (peer_hash, 10);
+};
+
 /*
  * Service backlog preallocation.
  *
@@ -211,6 +244,7 @@ struct rxrpc_security {
 struct rxrpc_local {
        struct rcu_head         rcu;
        atomic_t                usage;
+       struct rxrpc_net        *rxnet;         /* The network ns in which this resides */
        struct list_head        link;
        struct socket           *socket;        /* my UDP socket */
        struct work_struct      processor;
@@ -601,7 +635,6 @@ struct rxrpc_ack_summary {
  * af_rxrpc.c
  */
 extern atomic_t rxrpc_n_tx_skbs, rxrpc_n_rx_skbs;
-extern u32 rxrpc_epoch;
 extern atomic_t rxrpc_debug_id;
 extern struct workqueue_struct *rxrpc_workqueue;
 
@@ -634,8 +667,6 @@ extern const char *const rxrpc_call_states[];
 extern const char *const rxrpc_call_completions[];
 extern unsigned int rxrpc_max_call_lifetime;
 extern struct kmem_cache *rxrpc_call_jar;
-extern struct list_head rxrpc_calls;
-extern rwlock_t rxrpc_call_lock;
 
 struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *, unsigned long);
 struct rxrpc_call *rxrpc_alloc_call(gfp_t);
@@ -653,7 +684,7 @@ void rxrpc_see_call(struct rxrpc_call *);
 void rxrpc_get_call(struct rxrpc_call *, enum rxrpc_call_trace);
 void rxrpc_put_call(struct rxrpc_call *, enum rxrpc_call_trace);
 void rxrpc_cleanup_call(struct rxrpc_call *);
-void __exit rxrpc_destroy_all_calls(void);
+void rxrpc_destroy_all_calls(struct rxrpc_net *);
 
 static inline bool rxrpc_is_service_call(const struct rxrpc_call *call)
 {
@@ -773,7 +804,8 @@ int rxrpc_connect_call(struct rxrpc_call *, struct rxrpc_conn_parameters *,
 void rxrpc_expose_client_call(struct rxrpc_call *);
 void rxrpc_disconnect_client_call(struct rxrpc_call *);
 void rxrpc_put_client_conn(struct rxrpc_connection *);
-void __exit rxrpc_destroy_all_client_connections(void);
+void rxrpc_discard_expired_client_conns(struct work_struct *);
+void rxrpc_destroy_all_client_connections(struct rxrpc_net *);
 
 /*
  * conn_event.c
@@ -784,9 +816,6 @@ void rxrpc_process_connection(struct work_struct *);
  * conn_object.c
  */
 extern unsigned int rxrpc_connection_expiry;
-extern struct list_head rxrpc_connections;
-extern struct list_head rxrpc_connection_proc_list;
-extern rwlock_t rxrpc_connection_lock;
 
 int rxrpc_extract_addr_from_skb(struct sockaddr_rxrpc *, struct sk_buff *);
 struct rxrpc_connection *rxrpc_alloc_connection(gfp_t);
@@ -800,7 +829,8 @@ void rxrpc_see_connection(struct rxrpc_connection *);
 void rxrpc_get_connection(struct rxrpc_connection *);
 struct rxrpc_connection *rxrpc_get_connection_maybe(struct rxrpc_connection *);
 void rxrpc_put_service_conn(struct rxrpc_connection *);
-void __exit rxrpc_destroy_all_connections(void);
+void rxrpc_service_connection_reaper(struct work_struct *);
+void rxrpc_destroy_all_connections(struct rxrpc_net *);
 
 static inline bool rxrpc_conn_is_client(const struct rxrpc_connection *conn)
 {
@@ -828,7 +858,7 @@ static inline void rxrpc_put_connection(struct rxrpc_connection *conn)
  */
 struct rxrpc_connection *rxrpc_find_service_conn_rcu(struct rxrpc_peer *,
                                                     struct sk_buff *);
-struct rxrpc_connection *rxrpc_prealloc_service_connection(gfp_t);
+struct rxrpc_connection *rxrpc_prealloc_service_connection(struct rxrpc_net *, gfp_t);
 void rxrpc_new_incoming_connection(struct rxrpc_connection *, struct sk_buff *);
 void rxrpc_unpublish_service_conn(struct rxrpc_connection *);
 
@@ -861,9 +891,9 @@ extern void rxrpc_process_local_events(struct rxrpc_local *);
 /*
  * local_object.c
  */
-struct rxrpc_local *rxrpc_lookup_local(const struct sockaddr_rxrpc *);
+struct rxrpc_local *rxrpc_lookup_local(struct net *, const struct sockaddr_rxrpc *);
 void __rxrpc_put_local(struct rxrpc_local *);
-void __exit rxrpc_destroy_all_locals(void);
+void rxrpc_destroy_all_locals(struct rxrpc_net *);
 
 static inline void rxrpc_get_local(struct rxrpc_local *local)
 {
@@ -901,6 +931,17 @@ extern unsigned int rxrpc_resend_timeout;
 
 extern const s8 rxrpc_ack_priority[];
 
+/*
+ * net_ns.c
+ */
+extern unsigned int rxrpc_net_id;
+extern struct pernet_operations rxrpc_net_ops;
+
+static inline struct rxrpc_net *rxrpc_net(struct net *net)
+{
+       return net_generic(net, rxrpc_net_id);
+}
+
 /*
  * output.c
  */