From: David Ahern <dsah...@gmail.com>

Convert neigh_table_init and neigh_table_clear to use an address family
instead of the NEIGH_*_TABLE macros which are effectively the same thing
only setup as index into neigh_tables. The functions can do that mapping
internally.

Further, add net to the arg list for both and remove the dependence on
init_net.

Signed-off-by: David Ahern <dsah...@gmail.com>
---
 include/net/neighbour.h |  4 ++--
 net/core/neighbour.c    | 40 ++++++++++++++++++++++++++++++++--------
 net/decnet/dn_neigh.c   |  4 ++--
 net/ipv4/arp.c          |  2 +-
 net/ipv6/ndisc.c        |  4 ++--
 5 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 6cf9ce16eac8..b70afea05f86 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -304,8 +304,8 @@ static inline struct neighbour *__neigh_lookup_noref(struct 
neigh_table *tbl,
        return ___neigh_lookup_noref(tbl, tbl->key_eq, tbl->hash, pkey, dev);
 }
 
-void neigh_table_init(int index, struct neigh_table *tbl);
-int neigh_table_clear(int index, struct neigh_table *tbl);
+void neigh_table_init(struct net *net, struct neigh_table *tbl);
+int neigh_table_clear(struct net *net, struct neigh_table *tbl);
 struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,
                               struct net_device *dev);
 struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net,
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 41841d8e4ea4..8bdaeb080ce4 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -1548,14 +1548,15 @@ static struct lock_class_key 
neigh_table_proxy_queue_class;
 
 static struct neigh_table *neigh_tables[NEIGH_NR_TABLES] __read_mostly;
 
-void neigh_table_init(int index, struct neigh_table *tbl)
+void neigh_table_init(struct net *net, struct neigh_table *tbl)
 {
        unsigned long now = jiffies;
+       u8 family = tbl->family;
        unsigned long phsize;
 
        INIT_LIST_HEAD(&tbl->parms_list);
        list_add(&tbl->parms.list, &tbl->parms_list);
-       write_pnet(&tbl->parms.net, &init_net);
+       write_pnet(&tbl->parms.net, net);
        refcount_set(&tbl->parms.refcnt, 1);
        tbl->parms.reachable_time =
                          neigh_rand_reach_time(NEIGH_VAR(&tbl->parms, 
BASE_REACHABLE_TIME));
@@ -1565,8 +1566,8 @@ void neigh_table_init(int index, struct neigh_table *tbl)
                panic("cannot create neighbour cache statistics");
 
 #ifdef CONFIG_PROC_FS
-       if (!proc_create_seq_data(tbl->id, 0, init_net.proc_net_stat,
-                             &neigh_stat_seq_ops, tbl))
+       if (!proc_create_seq_data(tbl->id, 0, net->proc_net_stat,
+                                 &neigh_stat_seq_ops, tbl))
                panic("cannot create neighbour proc dir entry");
 #endif
 
@@ -1595,13 +1596,36 @@ void neigh_table_init(int index, struct neigh_table 
*tbl)
        tbl->last_flush = now;
        tbl->last_rand  = now + tbl->parms.reachable_time * 20;
 
-       neigh_tables[index] = tbl;
+       switch (family) {
+       case AF_INET:
+               neigh_tables[NEIGH_ARP_TABLE] = tbl;
+               break;
+       case AF_INET6:
+               neigh_tables[NEIGH_ND_TABLE] = tbl;
+               break;
+       case AF_DECnet:
+               neigh_tables[NEIGH_DN_TABLE] = tbl;
+               break;
+       }
 }
 EXPORT_SYMBOL(neigh_table_init);
 
-int neigh_table_clear(int index, struct neigh_table *tbl)
+int neigh_table_clear(struct net *net, struct neigh_table *tbl)
 {
-       neigh_tables[index] = NULL;
+       u8 family = tbl->family;
+
+       switch (family) {
+       case AF_INET:
+               neigh_tables[NEIGH_ARP_TABLE] = NULL;
+               break;
+       case AF_INET6:
+               neigh_tables[NEIGH_ND_TABLE] = NULL;
+               break;
+       case AF_DECnet:
+               neigh_tables[NEIGH_DN_TABLE] = NULL;
+               break;
+       }
+
        /* It is not clean... Fix it to unload IPv6 module safely */
        cancel_delayed_work_sync(&tbl->gc_work);
        del_timer_sync(&tbl->proxy_timer);
@@ -1617,7 +1641,7 @@ int neigh_table_clear(int index, struct neigh_table *tbl)
        kfree(tbl->phash_buckets);
        tbl->phash_buckets = NULL;
 
-       remove_proc_entry(tbl->id, init_net.proc_net_stat);
+       remove_proc_entry(tbl->id, net->proc_net_stat);
 
        free_percpu(tbl->stats);
        tbl->stats = NULL;
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c
index 74112777beb0..6d5078ddffac 100644
--- a/net/decnet/dn_neigh.c
+++ b/net/decnet/dn_neigh.c
@@ -593,7 +593,7 @@ static const struct seq_operations dn_neigh_seq_ops = {
 
 void __init dn_neigh_init(void)
 {
-       neigh_table_init(NEIGH_DN_TABLE, &dn_neigh_table);
+       neigh_table_init(&init_net, &dn_neigh_table);
        proc_create_net("decnet_neigh", 0444, init_net.proc_net,
                        &dn_neigh_seq_ops, sizeof(struct neigh_seq_state));
 }
@@ -601,5 +601,5 @@ void __init dn_neigh_init(void)
 void __exit dn_neigh_cleanup(void)
 {
        remove_proc_entry("decnet_neigh", init_net.proc_net);
-       neigh_table_clear(NEIGH_DN_TABLE, &dn_neigh_table);
+       neigh_table_clear(&init_net, &dn_neigh_table);
 }
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index 7b27faefa01b..707b40f76852 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -1291,7 +1291,7 @@ static int arp_proc_init(void);
 
 void __init arp_init(void)
 {
-       neigh_table_init(NEIGH_ARP_TABLE, &arp_tbl);
+       neigh_table_init(&init_net, &arp_tbl);
 
        dev_add_pack(&arp_packet_type);
        arp_proc_init();
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 5103d8641b04..6105530fe865 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -1908,7 +1908,7 @@ int __init ndisc_init(void)
        /*
         * Initialize the neighbour table
         */
-       neigh_table_init(NEIGH_ND_TABLE, &nd_tbl);
+       neigh_table_init(&init_net, &nd_tbl);
 
 #ifdef CONFIG_SYSCTL
        err = neigh_sysctl_register(NULL, &nd_tbl.parms,
@@ -1941,6 +1941,6 @@ void ndisc_cleanup(void)
 #ifdef CONFIG_SYSCTL
        neigh_sysctl_unregister(&nd_tbl.parms);
 #endif
-       neigh_table_clear(NEIGH_ND_TABLE, &nd_tbl);
+       neigh_table_clear(&init_net, &nd_tbl);
        unregister_pernet_subsys(&ndisc_net_ops);
 }
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to