diff options
author | Ying Xue <ying.xue@windriver.com> | 2015-01-09 02:27:09 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-12 16:24:33 -0500 |
commit | 4ac1c8d0ee9faf3a4be185cc4db1381fa0d81280 (patch) | |
tree | 361ea817ed30f0dd959ea2d87d658c8d85feebb2 | |
parent | e05b31f4bf8994d49322e9afb004ad479a129db0 (diff) |
tipc: name tipc name table support net namespace
TIPC name table is used to store the mapping relationship between
TIPC service name and socket port ID. When tipc supports namespace,
it allows users to publish service names only owned by a certain
namespace. Therefore, every namespace must have its private name
table to prevent service names published to one namespace from being
contaminated by other service names in another namespace. Therefore,
The name table global variable (ie, nametbl) and its lock must be
moved to tipc_net structure, and a parameter of namespace must be
added for necessary functions so that they can obtain name table
variable defined in tipc_net structure.
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Tested-by: Tero Aho <Tero.Aho@coriant.com>
Reviewed-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/tipc/config.c | 3 | ||||
-rw-r--r-- | net/tipc/core.c | 19 | ||||
-rw-r--r-- | net/tipc/core.h | 4 | ||||
-rw-r--r-- | net/tipc/msg.c | 4 | ||||
-rw-r--r-- | net/tipc/msg.h | 2 | ||||
-rw-r--r-- | net/tipc/name_distr.c | 37 | ||||
-rw-r--r-- | net/tipc/name_distr.h | 4 | ||||
-rw-r--r-- | net/tipc/name_table.c | 128 | ||||
-rw-r--r-- | net/tipc/name_table.h | 25 | ||||
-rw-r--r-- | net/tipc/net.c | 2 | ||||
-rw-r--r-- | net/tipc/server.c | 3 | ||||
-rw-r--r-- | net/tipc/server.h | 10 | ||||
-rw-r--r-- | net/tipc/socket.c | 11 | ||||
-rw-r--r-- | net/tipc/subscr.c | 16 | ||||
-rw-r--r-- | net/tipc/subscr.h | 2 |
15 files changed, 154 insertions, 116 deletions
diff --git a/net/tipc/config.c b/net/tipc/config.c index 20b1c5812f00..974723a1e32e 100644 --- a/net/tipc/config.c +++ b/net/tipc/config.c | |||
@@ -248,7 +248,8 @@ struct sk_buff *tipc_cfg_do_cmd(struct net *net, u32 orig_node, u16 cmd, | |||
248 | req_tlv_space); | 248 | req_tlv_space); |
249 | break; | 249 | break; |
250 | case TIPC_CMD_SHOW_NAME_TABLE: | 250 | case TIPC_CMD_SHOW_NAME_TABLE: |
251 | rep_tlv_buf = tipc_nametbl_get(req_tlv_area, req_tlv_space); | 251 | rep_tlv_buf = tipc_nametbl_get(net, req_tlv_area, |
252 | req_tlv_space); | ||
252 | break; | 253 | break; |
253 | case TIPC_CMD_GET_BEARER_NAMES: | 254 | case TIPC_CMD_GET_BEARER_NAMES: |
254 | rep_tlv_buf = tipc_bearer_get_names(net); | 255 | rep_tlv_buf = tipc_bearer_get_names(net); |
diff --git a/net/tipc/core.c b/net/tipc/core.c index 23ff3caa1ce6..63cde8148aaf 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c | |||
@@ -62,12 +62,24 @@ static int __net_init tipc_init_net(struct net *net) | |||
62 | spin_lock_init(&tn->node_list_lock); | 62 | spin_lock_init(&tn->node_list_lock); |
63 | 63 | ||
64 | err = tipc_sk_rht_init(net); | 64 | err = tipc_sk_rht_init(net); |
65 | if (err) | ||
66 | goto out_sk_rht; | ||
67 | |||
68 | err = tipc_nametbl_init(net); | ||
69 | if (err) | ||
70 | goto out_nametbl; | ||
71 | return 0; | ||
72 | |||
73 | out_nametbl: | ||
74 | tipc_sk_rht_destroy(net); | ||
75 | out_sk_rht: | ||
65 | return err; | 76 | return err; |
66 | } | 77 | } |
67 | 78 | ||
68 | static void __net_exit tipc_exit_net(struct net *net) | 79 | static void __net_exit tipc_exit_net(struct net *net) |
69 | { | 80 | { |
70 | tipc_net_stop(net); | 81 | tipc_net_stop(net); |
82 | tipc_nametbl_stop(net); | ||
71 | tipc_sk_rht_destroy(net); | 83 | tipc_sk_rht_destroy(net); |
72 | } | 84 | } |
73 | 85 | ||
@@ -98,10 +110,6 @@ static int __init tipc_init(void) | |||
98 | if (err) | 110 | if (err) |
99 | goto out_pernet; | 111 | goto out_pernet; |
100 | 112 | ||
101 | err = tipc_nametbl_init(); | ||
102 | if (err) | ||
103 | goto out_nametbl; | ||
104 | |||
105 | err = tipc_netlink_start(); | 113 | err = tipc_netlink_start(); |
106 | if (err) | 114 | if (err) |
107 | goto out_netlink; | 115 | goto out_netlink; |
@@ -133,8 +141,6 @@ out_sysctl: | |||
133 | out_socket: | 141 | out_socket: |
134 | tipc_netlink_stop(); | 142 | tipc_netlink_stop(); |
135 | out_netlink: | 143 | out_netlink: |
136 | tipc_nametbl_stop(); | ||
137 | out_nametbl: | ||
138 | unregister_pernet_subsys(&tipc_net_ops); | 144 | unregister_pernet_subsys(&tipc_net_ops); |
139 | out_pernet: | 145 | out_pernet: |
140 | pr_err("Unable to start in single node mode\n"); | 146 | pr_err("Unable to start in single node mode\n"); |
@@ -147,7 +153,6 @@ static void __exit tipc_exit(void) | |||
147 | tipc_bearer_cleanup(); | 153 | tipc_bearer_cleanup(); |
148 | tipc_netlink_stop(); | 154 | tipc_netlink_stop(); |
149 | tipc_subscr_stop(); | 155 | tipc_subscr_stop(); |
150 | tipc_nametbl_stop(); | ||
151 | tipc_socket_stop(); | 156 | tipc_socket_stop(); |
152 | tipc_unregister_sysctl(); | 157 | tipc_unregister_sysctl(); |
153 | 158 | ||
diff --git a/net/tipc/core.h b/net/tipc/core.h index 1a7f81643668..893992944570 100644 --- a/net/tipc/core.h +++ b/net/tipc/core.h | |||
@@ -105,6 +105,10 @@ struct tipc_net { | |||
105 | 105 | ||
106 | /* Socket hash table */ | 106 | /* Socket hash table */ |
107 | struct rhashtable sk_rht; | 107 | struct rhashtable sk_rht; |
108 | |||
109 | /* Name table */ | ||
110 | spinlock_t nametbl_lock; | ||
111 | struct name_table *nametbl; | ||
108 | }; | 112 | }; |
109 | 113 | ||
110 | #ifdef CONFIG_SYSCTL | 114 | #ifdef CONFIG_SYSCTL |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index a38f6a680df1..642fb137463c 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -426,7 +426,7 @@ exit: | |||
426 | * Returns 0 (TIPC_OK) if message ok and we can try again, -TIPC error | 426 | * Returns 0 (TIPC_OK) if message ok and we can try again, -TIPC error |
427 | * code if message to be rejected | 427 | * code if message to be rejected |
428 | */ | 428 | */ |
429 | int tipc_msg_eval(struct sk_buff *buf, u32 *dnode) | 429 | int tipc_msg_eval(struct net *net, struct sk_buff *buf, u32 *dnode) |
430 | { | 430 | { |
431 | struct tipc_msg *msg = buf_msg(buf); | 431 | struct tipc_msg *msg = buf_msg(buf); |
432 | u32 dport; | 432 | u32 dport; |
@@ -441,7 +441,7 @@ int tipc_msg_eval(struct sk_buff *buf, u32 *dnode) | |||
441 | return -TIPC_ERR_NO_NAME; | 441 | return -TIPC_ERR_NO_NAME; |
442 | 442 | ||
443 | *dnode = addr_domain(msg_lookup_scope(msg)); | 443 | *dnode = addr_domain(msg_lookup_scope(msg)); |
444 | dport = tipc_nametbl_translate(msg_nametype(msg), | 444 | dport = tipc_nametbl_translate(net, msg_nametype(msg), |
445 | msg_nameinst(msg), | 445 | msg_nameinst(msg), |
446 | dnode); | 446 | dnode); |
447 | if (!dport) | 447 | if (!dport) |
diff --git a/net/tipc/msg.h b/net/tipc/msg.h index 75f324287244..69f37e652a8e 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h | |||
@@ -749,7 +749,7 @@ static inline u32 msg_tot_origport(struct tipc_msg *m) | |||
749 | 749 | ||
750 | struct sk_buff *tipc_buf_acquire(u32 size); | 750 | struct sk_buff *tipc_buf_acquire(u32 size); |
751 | bool tipc_msg_reverse(struct sk_buff *buf, u32 *dnode, int err); | 751 | bool tipc_msg_reverse(struct sk_buff *buf, u32 *dnode, int err); |
752 | int tipc_msg_eval(struct sk_buff *buf, u32 *dnode); | 752 | int tipc_msg_eval(struct net *net, struct sk_buff *buf, u32 *dnode); |
753 | void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, u32 hsize, | 753 | void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, u32 hsize, |
754 | u32 destnode); | 754 | u32 destnode); |
755 | struct sk_buff *tipc_msg_create(uint user, uint type, uint hdr_sz, | 755 | struct sk_buff *tipc_msg_create(uint user, uint type, uint hdr_sz, |
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c index d40df588263e..ba421321d15d 100644 --- a/net/tipc/name_distr.c +++ b/net/tipc/name_distr.c | |||
@@ -109,13 +109,14 @@ void named_cluster_distribute(struct net *net, struct sk_buff *skb) | |||
109 | /** | 109 | /** |
110 | * tipc_named_publish - tell other nodes about a new publication by this node | 110 | * tipc_named_publish - tell other nodes about a new publication by this node |
111 | */ | 111 | */ |
112 | struct sk_buff *tipc_named_publish(struct publication *publ) | 112 | struct sk_buff *tipc_named_publish(struct net *net, struct publication *publ) |
113 | { | 113 | { |
114 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
114 | struct sk_buff *buf; | 115 | struct sk_buff *buf; |
115 | struct distr_item *item; | 116 | struct distr_item *item; |
116 | 117 | ||
117 | list_add_tail_rcu(&publ->local_list, | 118 | list_add_tail_rcu(&publ->local_list, |
118 | &tipc_nametbl->publ_list[publ->scope]); | 119 | &tn->nametbl->publ_list[publ->scope]); |
119 | 120 | ||
120 | if (publ->scope == TIPC_NODE_SCOPE) | 121 | if (publ->scope == TIPC_NODE_SCOPE) |
121 | return NULL; | 122 | return NULL; |
@@ -206,15 +207,16 @@ static void named_distribute(struct net *net, struct sk_buff_head *list, | |||
206 | */ | 207 | */ |
207 | void tipc_named_node_up(struct net *net, u32 dnode) | 208 | void tipc_named_node_up(struct net *net, u32 dnode) |
208 | { | 209 | { |
210 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
209 | struct sk_buff_head head; | 211 | struct sk_buff_head head; |
210 | 212 | ||
211 | __skb_queue_head_init(&head); | 213 | __skb_queue_head_init(&head); |
212 | 214 | ||
213 | rcu_read_lock(); | 215 | rcu_read_lock(); |
214 | named_distribute(net, &head, dnode, | 216 | named_distribute(net, &head, dnode, |
215 | &tipc_nametbl->publ_list[TIPC_CLUSTER_SCOPE]); | 217 | &tn->nametbl->publ_list[TIPC_CLUSTER_SCOPE]); |
216 | named_distribute(net, &head, dnode, | 218 | named_distribute(net, &head, dnode, |
217 | &tipc_nametbl->publ_list[TIPC_ZONE_SCOPE]); | 219 | &tn->nametbl->publ_list[TIPC_ZONE_SCOPE]); |
218 | rcu_read_unlock(); | 220 | rcu_read_unlock(); |
219 | 221 | ||
220 | tipc_link_xmit(net, &head, dnode, dnode); | 222 | tipc_link_xmit(net, &head, dnode, dnode); |
@@ -262,14 +264,15 @@ static void tipc_publ_unsubscribe(struct net *net, struct publication *publ, | |||
262 | */ | 264 | */ |
263 | static void tipc_publ_purge(struct net *net, struct publication *publ, u32 addr) | 265 | static void tipc_publ_purge(struct net *net, struct publication *publ, u32 addr) |
264 | { | 266 | { |
267 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
265 | struct publication *p; | 268 | struct publication *p; |
266 | 269 | ||
267 | spin_lock_bh(&tipc_nametbl_lock); | 270 | spin_lock_bh(&tn->nametbl_lock); |
268 | p = tipc_nametbl_remove_publ(publ->type, publ->lower, | 271 | p = tipc_nametbl_remove_publ(net, publ->type, publ->lower, |
269 | publ->node, publ->ref, publ->key); | 272 | publ->node, publ->ref, publ->key); |
270 | if (p) | 273 | if (p) |
271 | tipc_publ_unsubscribe(net, p, addr); | 274 | tipc_publ_unsubscribe(net, p, addr); |
272 | spin_unlock_bh(&tipc_nametbl_lock); | 275 | spin_unlock_bh(&tn->nametbl_lock); |
273 | 276 | ||
274 | if (p != publ) { | 277 | if (p != publ) { |
275 | pr_err("Unable to remove publication from failed node\n" | 278 | pr_err("Unable to remove publication from failed node\n" |
@@ -302,7 +305,8 @@ static bool tipc_update_nametbl(struct net *net, struct distr_item *i, | |||
302 | struct publication *publ = NULL; | 305 | struct publication *publ = NULL; |
303 | 306 | ||
304 | if (dtype == PUBLICATION) { | 307 | if (dtype == PUBLICATION) { |
305 | publ = tipc_nametbl_insert_publ(ntohl(i->type), ntohl(i->lower), | 308 | publ = tipc_nametbl_insert_publ(net, ntohl(i->type), |
309 | ntohl(i->lower), | ||
306 | ntohl(i->upper), | 310 | ntohl(i->upper), |
307 | TIPC_CLUSTER_SCOPE, node, | 311 | TIPC_CLUSTER_SCOPE, node, |
308 | ntohl(i->ref), ntohl(i->key)); | 312 | ntohl(i->ref), ntohl(i->key)); |
@@ -311,7 +315,8 @@ static bool tipc_update_nametbl(struct net *net, struct distr_item *i, | |||
311 | return true; | 315 | return true; |
312 | } | 316 | } |
313 | } else if (dtype == WITHDRAWAL) { | 317 | } else if (dtype == WITHDRAWAL) { |
314 | publ = tipc_nametbl_remove_publ(ntohl(i->type), ntohl(i->lower), | 318 | publ = tipc_nametbl_remove_publ(net, ntohl(i->type), |
319 | ntohl(i->lower), | ||
315 | node, ntohl(i->ref), | 320 | node, ntohl(i->ref), |
316 | ntohl(i->key)); | 321 | ntohl(i->key)); |
317 | if (publ) { | 322 | if (publ) { |
@@ -376,19 +381,20 @@ void tipc_named_process_backlog(struct net *net) | |||
376 | */ | 381 | */ |
377 | void tipc_named_rcv(struct net *net, struct sk_buff *buf) | 382 | void tipc_named_rcv(struct net *net, struct sk_buff *buf) |
378 | { | 383 | { |
384 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
379 | struct tipc_msg *msg = buf_msg(buf); | 385 | struct tipc_msg *msg = buf_msg(buf); |
380 | struct distr_item *item = (struct distr_item *)msg_data(msg); | 386 | struct distr_item *item = (struct distr_item *)msg_data(msg); |
381 | u32 count = msg_data_sz(msg) / ITEM_SIZE; | 387 | u32 count = msg_data_sz(msg) / ITEM_SIZE; |
382 | u32 node = msg_orignode(msg); | 388 | u32 node = msg_orignode(msg); |
383 | 389 | ||
384 | spin_lock_bh(&tipc_nametbl_lock); | 390 | spin_lock_bh(&tn->nametbl_lock); |
385 | while (count--) { | 391 | while (count--) { |
386 | if (!tipc_update_nametbl(net, item, node, msg_type(msg))) | 392 | if (!tipc_update_nametbl(net, item, node, msg_type(msg))) |
387 | tipc_named_add_backlog(item, msg_type(msg), node); | 393 | tipc_named_add_backlog(item, msg_type(msg), node); |
388 | item++; | 394 | item++; |
389 | } | 395 | } |
390 | tipc_named_process_backlog(net); | 396 | tipc_named_process_backlog(net); |
391 | spin_unlock_bh(&tipc_nametbl_lock); | 397 | spin_unlock_bh(&tn->nametbl_lock); |
392 | kfree_skb(buf); | 398 | kfree_skb(buf); |
393 | } | 399 | } |
394 | 400 | ||
@@ -399,17 +405,18 @@ void tipc_named_rcv(struct net *net, struct sk_buff *buf) | |||
399 | * All name table entries published by this node are updated to reflect | 405 | * All name table entries published by this node are updated to reflect |
400 | * the node's new network address. | 406 | * the node's new network address. |
401 | */ | 407 | */ |
402 | void tipc_named_reinit(void) | 408 | void tipc_named_reinit(struct net *net) |
403 | { | 409 | { |
410 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
404 | struct publication *publ; | 411 | struct publication *publ; |
405 | int scope; | 412 | int scope; |
406 | 413 | ||
407 | spin_lock_bh(&tipc_nametbl_lock); | 414 | spin_lock_bh(&tn->nametbl_lock); |
408 | 415 | ||
409 | for (scope = TIPC_ZONE_SCOPE; scope <= TIPC_NODE_SCOPE; scope++) | 416 | for (scope = TIPC_ZONE_SCOPE; scope <= TIPC_NODE_SCOPE; scope++) |
410 | list_for_each_entry_rcu(publ, &tipc_nametbl->publ_list[scope], | 417 | list_for_each_entry_rcu(publ, &tn->nametbl->publ_list[scope], |
411 | local_list) | 418 | local_list) |
412 | publ->node = tipc_own_addr; | 419 | publ->node = tipc_own_addr; |
413 | 420 | ||
414 | spin_unlock_bh(&tipc_nametbl_lock); | 421 | spin_unlock_bh(&tn->nametbl_lock); |
415 | } | 422 | } |
diff --git a/net/tipc/name_distr.h b/net/tipc/name_distr.h index 8039d84351b3..1ed2d7e48290 100644 --- a/net/tipc/name_distr.h +++ b/net/tipc/name_distr.h | |||
@@ -67,12 +67,12 @@ struct distr_item { | |||
67 | __be32 key; | 67 | __be32 key; |
68 | }; | 68 | }; |
69 | 69 | ||
70 | struct sk_buff *tipc_named_publish(struct publication *publ); | 70 | struct sk_buff *tipc_named_publish(struct net *net, struct publication *publ); |
71 | struct sk_buff *tipc_named_withdraw(struct publication *publ); | 71 | struct sk_buff *tipc_named_withdraw(struct publication *publ); |
72 | void named_cluster_distribute(struct net *net, struct sk_buff *buf); | 72 | void named_cluster_distribute(struct net *net, struct sk_buff *buf); |
73 | void tipc_named_node_up(struct net *net, u32 dnode); | 73 | void tipc_named_node_up(struct net *net, u32 dnode); |
74 | void tipc_named_rcv(struct net *net, struct sk_buff *buf); | 74 | void tipc_named_rcv(struct net *net, struct sk_buff *buf); |
75 | void tipc_named_reinit(void); | 75 | void tipc_named_reinit(struct net *net); |
76 | void tipc_named_process_backlog(struct net *net); | 76 | void tipc_named_process_backlog(struct net *net); |
77 | void tipc_publ_notify(struct net *net, struct list_head *nsub_list, u32 addr); | 77 | void tipc_publ_notify(struct net *net, struct list_head *nsub_list, u32 addr); |
78 | 78 | ||
diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c index beed5fdda004..57e39c16a8c3 100644 --- a/net/tipc/name_table.c +++ b/net/tipc/name_table.c | |||
@@ -34,6 +34,7 @@ | |||
34 | * POSSIBILITY OF SUCH DAMAGE. | 34 | * POSSIBILITY OF SUCH DAMAGE. |
35 | */ | 35 | */ |
36 | 36 | ||
37 | #include <net/sock.h> | ||
37 | #include "core.h" | 38 | #include "core.h" |
38 | #include "config.h" | 39 | #include "config.h" |
39 | #include "name_table.h" | 40 | #include "name_table.h" |
@@ -106,9 +107,6 @@ struct name_seq { | |||
106 | struct rcu_head rcu; | 107 | struct rcu_head rcu; |
107 | }; | 108 | }; |
108 | 109 | ||
109 | struct name_table *tipc_nametbl; | ||
110 | DEFINE_SPINLOCK(tipc_nametbl_lock); | ||
111 | |||
112 | static int hash(int x) | 110 | static int hash(int x) |
113 | { | 111 | { |
114 | return x & (TIPC_NAMETBL_SIZE - 1); | 112 | return x & (TIPC_NAMETBL_SIZE - 1); |
@@ -448,12 +446,13 @@ static void tipc_nameseq_subscribe(struct name_seq *nseq, | |||
448 | } | 446 | } |
449 | } | 447 | } |
450 | 448 | ||
451 | static struct name_seq *nametbl_find_seq(u32 type) | 449 | static struct name_seq *nametbl_find_seq(struct net *net, u32 type) |
452 | { | 450 | { |
451 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
453 | struct hlist_head *seq_head; | 452 | struct hlist_head *seq_head; |
454 | struct name_seq *ns; | 453 | struct name_seq *ns; |
455 | 454 | ||
456 | seq_head = &tipc_nametbl->seq_hlist[hash(type)]; | 455 | seq_head = &tn->nametbl->seq_hlist[hash(type)]; |
457 | hlist_for_each_entry_rcu(ns, seq_head, ns_list) { | 456 | hlist_for_each_entry_rcu(ns, seq_head, ns_list) { |
458 | if (ns->type == type) | 457 | if (ns->type == type) |
459 | return ns; | 458 | return ns; |
@@ -462,11 +461,13 @@ static struct name_seq *nametbl_find_seq(u32 type) | |||
462 | return NULL; | 461 | return NULL; |
463 | }; | 462 | }; |
464 | 463 | ||
465 | struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper, | 464 | struct publication *tipc_nametbl_insert_publ(struct net *net, u32 type, |
466 | u32 scope, u32 node, u32 port, u32 key) | 465 | u32 lower, u32 upper, u32 scope, |
466 | u32 node, u32 port, u32 key) | ||
467 | { | 467 | { |
468 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
468 | struct publication *publ; | 469 | struct publication *publ; |
469 | struct name_seq *seq = nametbl_find_seq(type); | 470 | struct name_seq *seq = nametbl_find_seq(net, type); |
470 | int index = hash(type); | 471 | int index = hash(type); |
471 | 472 | ||
472 | if ((scope < TIPC_ZONE_SCOPE) || (scope > TIPC_NODE_SCOPE) || | 473 | if ((scope < TIPC_ZONE_SCOPE) || (scope > TIPC_NODE_SCOPE) || |
@@ -477,8 +478,7 @@ struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper, | |||
477 | } | 478 | } |
478 | 479 | ||
479 | if (!seq) | 480 | if (!seq) |
480 | seq = tipc_nameseq_create(type, | 481 | seq = tipc_nameseq_create(type, &tn->nametbl->seq_hlist[index]); |
481 | &tipc_nametbl->seq_hlist[index]); | ||
482 | if (!seq) | 482 | if (!seq) |
483 | return NULL; | 483 | return NULL; |
484 | 484 | ||
@@ -489,11 +489,12 @@ struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper, | |||
489 | return publ; | 489 | return publ; |
490 | } | 490 | } |
491 | 491 | ||
492 | struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, | 492 | struct publication *tipc_nametbl_remove_publ(struct net *net, u32 type, |
493 | u32 node, u32 ref, u32 key) | 493 | u32 lower, u32 node, u32 ref, |
494 | u32 key) | ||
494 | { | 495 | { |
495 | struct publication *publ; | 496 | struct publication *publ; |
496 | struct name_seq *seq = nametbl_find_seq(type); | 497 | struct name_seq *seq = nametbl_find_seq(net, type); |
497 | 498 | ||
498 | if (!seq) | 499 | if (!seq) |
499 | return NULL; | 500 | return NULL; |
@@ -524,7 +525,8 @@ struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, | |||
524 | * - if name translation is attempted and fails, sets 'destnode' to 0 | 525 | * - if name translation is attempted and fails, sets 'destnode' to 0 |
525 | * and returns 0 | 526 | * and returns 0 |
526 | */ | 527 | */ |
527 | u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode) | 528 | u32 tipc_nametbl_translate(struct net *net, u32 type, u32 instance, |
529 | u32 *destnode) | ||
528 | { | 530 | { |
529 | struct sub_seq *sseq; | 531 | struct sub_seq *sseq; |
530 | struct name_info *info; | 532 | struct name_info *info; |
@@ -537,7 +539,7 @@ u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode) | |||
537 | return 0; | 539 | return 0; |
538 | 540 | ||
539 | rcu_read_lock(); | 541 | rcu_read_lock(); |
540 | seq = nametbl_find_seq(type); | 542 | seq = nametbl_find_seq(net, type); |
541 | if (unlikely(!seq)) | 543 | if (unlikely(!seq)) |
542 | goto not_found; | 544 | goto not_found; |
543 | spin_lock_bh(&seq->lock); | 545 | spin_lock_bh(&seq->lock); |
@@ -610,8 +612,8 @@ not_found: | |||
610 | * | 612 | * |
611 | * Returns non-zero if any off-node ports overlap | 613 | * Returns non-zero if any off-node ports overlap |
612 | */ | 614 | */ |
613 | int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit, | 615 | int tipc_nametbl_mc_translate(struct net *net, u32 type, u32 lower, u32 upper, |
614 | struct tipc_port_list *dports) | 616 | u32 limit, struct tipc_port_list *dports) |
615 | { | 617 | { |
616 | struct name_seq *seq; | 618 | struct name_seq *seq; |
617 | struct sub_seq *sseq; | 619 | struct sub_seq *sseq; |
@@ -620,7 +622,7 @@ int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit, | |||
620 | int res = 0; | 622 | int res = 0; |
621 | 623 | ||
622 | rcu_read_lock(); | 624 | rcu_read_lock(); |
623 | seq = nametbl_find_seq(type); | 625 | seq = nametbl_find_seq(net, type); |
624 | if (!seq) | 626 | if (!seq) |
625 | goto exit; | 627 | goto exit; |
626 | 628 | ||
@@ -657,24 +659,25 @@ struct publication *tipc_nametbl_publish(struct net *net, u32 type, u32 lower, | |||
657 | { | 659 | { |
658 | struct publication *publ; | 660 | struct publication *publ; |
659 | struct sk_buff *buf = NULL; | 661 | struct sk_buff *buf = NULL; |
662 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
660 | 663 | ||
661 | spin_lock_bh(&tipc_nametbl_lock); | 664 | spin_lock_bh(&tn->nametbl_lock); |
662 | if (tipc_nametbl->local_publ_count >= TIPC_MAX_PUBLICATIONS) { | 665 | if (tn->nametbl->local_publ_count >= TIPC_MAX_PUBLICATIONS) { |
663 | pr_warn("Publication failed, local publication limit reached (%u)\n", | 666 | pr_warn("Publication failed, local publication limit reached (%u)\n", |
664 | TIPC_MAX_PUBLICATIONS); | 667 | TIPC_MAX_PUBLICATIONS); |
665 | spin_unlock_bh(&tipc_nametbl_lock); | 668 | spin_unlock_bh(&tn->nametbl_lock); |
666 | return NULL; | 669 | return NULL; |
667 | } | 670 | } |
668 | 671 | ||
669 | publ = tipc_nametbl_insert_publ(type, lower, upper, scope, | 672 | publ = tipc_nametbl_insert_publ(net, type, lower, upper, scope, |
670 | tipc_own_addr, port_ref, key); | 673 | tipc_own_addr, port_ref, key); |
671 | if (likely(publ)) { | 674 | if (likely(publ)) { |
672 | tipc_nametbl->local_publ_count++; | 675 | tn->nametbl->local_publ_count++; |
673 | buf = tipc_named_publish(publ); | 676 | buf = tipc_named_publish(net, publ); |
674 | /* Any pending external events? */ | 677 | /* Any pending external events? */ |
675 | tipc_named_process_backlog(net); | 678 | tipc_named_process_backlog(net); |
676 | } | 679 | } |
677 | spin_unlock_bh(&tipc_nametbl_lock); | 680 | spin_unlock_bh(&tn->nametbl_lock); |
678 | 681 | ||
679 | if (buf) | 682 | if (buf) |
680 | named_cluster_distribute(net, buf); | 683 | named_cluster_distribute(net, buf); |
@@ -689,11 +692,13 @@ int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower, u32 ref, | |||
689 | { | 692 | { |
690 | struct publication *publ; | 693 | struct publication *publ; |
691 | struct sk_buff *skb = NULL; | 694 | struct sk_buff *skb = NULL; |
695 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
692 | 696 | ||
693 | spin_lock_bh(&tipc_nametbl_lock); | 697 | spin_lock_bh(&tn->nametbl_lock); |
694 | publ = tipc_nametbl_remove_publ(type, lower, tipc_own_addr, ref, key); | 698 | publ = tipc_nametbl_remove_publ(net, type, lower, tipc_own_addr, |
699 | ref, key); | ||
695 | if (likely(publ)) { | 700 | if (likely(publ)) { |
696 | tipc_nametbl->local_publ_count--; | 701 | tn->nametbl->local_publ_count--; |
697 | skb = tipc_named_withdraw(publ); | 702 | skb = tipc_named_withdraw(publ); |
698 | /* Any pending external events? */ | 703 | /* Any pending external events? */ |
699 | tipc_named_process_backlog(net); | 704 | tipc_named_process_backlog(net); |
@@ -704,7 +709,7 @@ int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower, u32 ref, | |||
704 | "(type=%u, lower=%u, ref=%u, key=%u)\n", | 709 | "(type=%u, lower=%u, ref=%u, key=%u)\n", |
705 | type, lower, ref, key); | 710 | type, lower, ref, key); |
706 | } | 711 | } |
707 | spin_unlock_bh(&tipc_nametbl_lock); | 712 | spin_unlock_bh(&tn->nametbl_lock); |
708 | 713 | ||
709 | if (skb) { | 714 | if (skb) { |
710 | named_cluster_distribute(net, skb); | 715 | named_cluster_distribute(net, skb); |
@@ -718,15 +723,15 @@ int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower, u32 ref, | |||
718 | */ | 723 | */ |
719 | void tipc_nametbl_subscribe(struct tipc_subscription *s) | 724 | void tipc_nametbl_subscribe(struct tipc_subscription *s) |
720 | { | 725 | { |
726 | struct tipc_net *tn = net_generic(s->net, tipc_net_id); | ||
721 | u32 type = s->seq.type; | 727 | u32 type = s->seq.type; |
722 | int index = hash(type); | 728 | int index = hash(type); |
723 | struct name_seq *seq; | 729 | struct name_seq *seq; |
724 | 730 | ||
725 | spin_lock_bh(&tipc_nametbl_lock); | 731 | spin_lock_bh(&tn->nametbl_lock); |
726 | seq = nametbl_find_seq(type); | 732 | seq = nametbl_find_seq(s->net, type); |
727 | if (!seq) | 733 | if (!seq) |
728 | seq = tipc_nameseq_create(type, | 734 | seq = tipc_nameseq_create(type, &tn->nametbl->seq_hlist[index]); |
729 | &tipc_nametbl->seq_hlist[index]); | ||
730 | if (seq) { | 735 | if (seq) { |
731 | spin_lock_bh(&seq->lock); | 736 | spin_lock_bh(&seq->lock); |
732 | tipc_nameseq_subscribe(seq, s); | 737 | tipc_nameseq_subscribe(seq, s); |
@@ -735,7 +740,7 @@ void tipc_nametbl_subscribe(struct tipc_subscription *s) | |||
735 | pr_warn("Failed to create subscription for {%u,%u,%u}\n", | 740 | pr_warn("Failed to create subscription for {%u,%u,%u}\n", |
736 | s->seq.type, s->seq.lower, s->seq.upper); | 741 | s->seq.type, s->seq.lower, s->seq.upper); |
737 | } | 742 | } |
738 | spin_unlock_bh(&tipc_nametbl_lock); | 743 | spin_unlock_bh(&tn->nametbl_lock); |
739 | } | 744 | } |
740 | 745 | ||
741 | /** | 746 | /** |
@@ -743,10 +748,11 @@ void tipc_nametbl_subscribe(struct tipc_subscription *s) | |||
743 | */ | 748 | */ |
744 | void tipc_nametbl_unsubscribe(struct tipc_subscription *s) | 749 | void tipc_nametbl_unsubscribe(struct tipc_subscription *s) |
745 | { | 750 | { |
751 | struct tipc_net *tn = net_generic(s->net, tipc_net_id); | ||
746 | struct name_seq *seq; | 752 | struct name_seq *seq; |
747 | 753 | ||
748 | spin_lock_bh(&tipc_nametbl_lock); | 754 | spin_lock_bh(&tn->nametbl_lock); |
749 | seq = nametbl_find_seq(s->seq.type); | 755 | seq = nametbl_find_seq(s->net, s->seq.type); |
750 | if (seq != NULL) { | 756 | if (seq != NULL) { |
751 | spin_lock_bh(&seq->lock); | 757 | spin_lock_bh(&seq->lock); |
752 | list_del_init(&s->nameseq_list); | 758 | list_del_init(&s->nameseq_list); |
@@ -759,7 +765,7 @@ void tipc_nametbl_unsubscribe(struct tipc_subscription *s) | |||
759 | spin_unlock_bh(&seq->lock); | 765 | spin_unlock_bh(&seq->lock); |
760 | } | 766 | } |
761 | } | 767 | } |
762 | spin_unlock_bh(&tipc_nametbl_lock); | 768 | spin_unlock_bh(&tn->nametbl_lock); |
763 | } | 769 | } |
764 | 770 | ||
765 | /** | 771 | /** |
@@ -861,9 +867,10 @@ static int nametbl_header(char *buf, int len, u32 depth) | |||
861 | /** | 867 | /** |
862 | * nametbl_list - print specified name table contents into the given buffer | 868 | * nametbl_list - print specified name table contents into the given buffer |
863 | */ | 869 | */ |
864 | static int nametbl_list(char *buf, int len, u32 depth_info, | 870 | static int nametbl_list(struct net *net, char *buf, int len, u32 depth_info, |
865 | u32 type, u32 lowbound, u32 upbound) | 871 | u32 type, u32 lowbound, u32 upbound) |
866 | { | 872 | { |
873 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
867 | struct hlist_head *seq_head; | 874 | struct hlist_head *seq_head; |
868 | struct name_seq *seq; | 875 | struct name_seq *seq; |
869 | int all_types; | 876 | int all_types; |
@@ -883,7 +890,7 @@ static int nametbl_list(char *buf, int len, u32 depth_info, | |||
883 | lowbound = 0; | 890 | lowbound = 0; |
884 | upbound = ~0; | 891 | upbound = ~0; |
885 | for (i = 0; i < TIPC_NAMETBL_SIZE; i++) { | 892 | for (i = 0; i < TIPC_NAMETBL_SIZE; i++) { |
886 | seq_head = &tipc_nametbl->seq_hlist[i]; | 893 | seq_head = &tn->nametbl->seq_hlist[i]; |
887 | hlist_for_each_entry_rcu(seq, seq_head, ns_list) { | 894 | hlist_for_each_entry_rcu(seq, seq_head, ns_list) { |
888 | ret += nameseq_list(seq, buf + ret, len - ret, | 895 | ret += nameseq_list(seq, buf + ret, len - ret, |
889 | depth, seq->type, | 896 | depth, seq->type, |
@@ -899,7 +906,7 @@ static int nametbl_list(char *buf, int len, u32 depth_info, | |||
899 | } | 906 | } |
900 | ret += nametbl_header(buf + ret, len - ret, depth); | 907 | ret += nametbl_header(buf + ret, len - ret, depth); |
901 | i = hash(type); | 908 | i = hash(type); |
902 | seq_head = &tipc_nametbl->seq_hlist[i]; | 909 | seq_head = &tn->nametbl->seq_hlist[i]; |
903 | hlist_for_each_entry_rcu(seq, seq_head, ns_list) { | 910 | hlist_for_each_entry_rcu(seq, seq_head, ns_list) { |
904 | if (seq->type == type) { | 911 | if (seq->type == type) { |
905 | ret += nameseq_list(seq, buf + ret, len - ret, | 912 | ret += nameseq_list(seq, buf + ret, len - ret, |
@@ -912,7 +919,8 @@ static int nametbl_list(char *buf, int len, u32 depth_info, | |||
912 | return ret; | 919 | return ret; |
913 | } | 920 | } |
914 | 921 | ||
915 | struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space) | 922 | struct sk_buff *tipc_nametbl_get(struct net *net, const void *req_tlv_area, |
923 | int req_tlv_space) | ||
916 | { | 924 | { |
917 | struct sk_buff *buf; | 925 | struct sk_buff *buf; |
918 | struct tipc_name_table_query *argv; | 926 | struct tipc_name_table_query *argv; |
@@ -933,7 +941,7 @@ struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space) | |||
933 | pb_len = ULTRA_STRING_MAX_LEN; | 941 | pb_len = ULTRA_STRING_MAX_LEN; |
934 | argv = (struct tipc_name_table_query *)TLV_DATA(req_tlv_area); | 942 | argv = (struct tipc_name_table_query *)TLV_DATA(req_tlv_area); |
935 | rcu_read_lock(); | 943 | rcu_read_lock(); |
936 | str_len = nametbl_list(pb, pb_len, ntohl(argv->depth), | 944 | str_len = nametbl_list(net, pb, pb_len, ntohl(argv->depth), |
937 | ntohl(argv->type), | 945 | ntohl(argv->type), |
938 | ntohl(argv->lowbound), ntohl(argv->upbound)); | 946 | ntohl(argv->lowbound), ntohl(argv->upbound)); |
939 | rcu_read_unlock(); | 947 | rcu_read_unlock(); |
@@ -944,8 +952,10 @@ struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space) | |||
944 | return buf; | 952 | return buf; |
945 | } | 953 | } |
946 | 954 | ||
947 | int tipc_nametbl_init(void) | 955 | int tipc_nametbl_init(struct net *net) |
948 | { | 956 | { |
957 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
958 | struct name_table *tipc_nametbl; | ||
949 | int i; | 959 | int i; |
950 | 960 | ||
951 | tipc_nametbl = kzalloc(sizeof(*tipc_nametbl), GFP_ATOMIC); | 961 | tipc_nametbl = kzalloc(sizeof(*tipc_nametbl), GFP_ATOMIC); |
@@ -958,6 +968,8 @@ int tipc_nametbl_init(void) | |||
958 | INIT_LIST_HEAD(&tipc_nametbl->publ_list[TIPC_ZONE_SCOPE]); | 968 | INIT_LIST_HEAD(&tipc_nametbl->publ_list[TIPC_ZONE_SCOPE]); |
959 | INIT_LIST_HEAD(&tipc_nametbl->publ_list[TIPC_CLUSTER_SCOPE]); | 969 | INIT_LIST_HEAD(&tipc_nametbl->publ_list[TIPC_CLUSTER_SCOPE]); |
960 | INIT_LIST_HEAD(&tipc_nametbl->publ_list[TIPC_NODE_SCOPE]); | 970 | INIT_LIST_HEAD(&tipc_nametbl->publ_list[TIPC_NODE_SCOPE]); |
971 | tn->nametbl = tipc_nametbl; | ||
972 | spin_lock_init(&tn->nametbl_lock); | ||
961 | return 0; | 973 | return 0; |
962 | } | 974 | } |
963 | 975 | ||
@@ -966,7 +978,7 @@ int tipc_nametbl_init(void) | |||
966 | * | 978 | * |
967 | * tipc_nametbl_lock must be held when calling this function | 979 | * tipc_nametbl_lock must be held when calling this function |
968 | */ | 980 | */ |
969 | static void tipc_purge_publications(struct name_seq *seq) | 981 | static void tipc_purge_publications(struct net *net, struct name_seq *seq) |
970 | { | 982 | { |
971 | struct publication *publ, *safe; | 983 | struct publication *publ, *safe; |
972 | struct sub_seq *sseq; | 984 | struct sub_seq *sseq; |
@@ -976,8 +988,8 @@ static void tipc_purge_publications(struct name_seq *seq) | |||
976 | sseq = seq->sseqs; | 988 | sseq = seq->sseqs; |
977 | info = sseq->info; | 989 | info = sseq->info; |
978 | list_for_each_entry_safe(publ, safe, &info->zone_list, zone_list) { | 990 | list_for_each_entry_safe(publ, safe, &info->zone_list, zone_list) { |
979 | tipc_nametbl_remove_publ(publ->type, publ->lower, publ->node, | 991 | tipc_nametbl_remove_publ(net, publ->type, publ->lower, |
980 | publ->ref, publ->key); | 992 | publ->node, publ->ref, publ->key); |
981 | kfree_rcu(publ, rcu); | 993 | kfree_rcu(publ, rcu); |
982 | } | 994 | } |
983 | hlist_del_init_rcu(&seq->ns_list); | 995 | hlist_del_init_rcu(&seq->ns_list); |
@@ -987,25 +999,27 @@ static void tipc_purge_publications(struct name_seq *seq) | |||
987 | kfree_rcu(seq, rcu); | 999 | kfree_rcu(seq, rcu); |
988 | } | 1000 | } |
989 | 1001 | ||
990 | void tipc_nametbl_stop(void) | 1002 | void tipc_nametbl_stop(struct net *net) |
991 | { | 1003 | { |
992 | u32 i; | 1004 | u32 i; |
993 | struct name_seq *seq; | 1005 | struct name_seq *seq; |
994 | struct hlist_head *seq_head; | 1006 | struct hlist_head *seq_head; |
1007 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
1008 | struct name_table *tipc_nametbl = tn->nametbl; | ||
995 | 1009 | ||
996 | /* Verify name table is empty and purge any lingering | 1010 | /* Verify name table is empty and purge any lingering |
997 | * publications, then release the name table | 1011 | * publications, then release the name table |
998 | */ | 1012 | */ |
999 | spin_lock_bh(&tipc_nametbl_lock); | 1013 | spin_lock_bh(&tn->nametbl_lock); |
1000 | for (i = 0; i < TIPC_NAMETBL_SIZE; i++) { | 1014 | for (i = 0; i < TIPC_NAMETBL_SIZE; i++) { |
1001 | if (hlist_empty(&tipc_nametbl->seq_hlist[i])) | 1015 | if (hlist_empty(&tipc_nametbl->seq_hlist[i])) |
1002 | continue; | 1016 | continue; |
1003 | seq_head = &tipc_nametbl->seq_hlist[i]; | 1017 | seq_head = &tipc_nametbl->seq_hlist[i]; |
1004 | hlist_for_each_entry_rcu(seq, seq_head, ns_list) { | 1018 | hlist_for_each_entry_rcu(seq, seq_head, ns_list) { |
1005 | tipc_purge_publications(seq); | 1019 | tipc_purge_publications(net, seq); |
1006 | } | 1020 | } |
1007 | } | 1021 | } |
1008 | spin_unlock_bh(&tipc_nametbl_lock); | 1022 | spin_unlock_bh(&tn->nametbl_lock); |
1009 | 1023 | ||
1010 | synchronize_net(); | 1024 | synchronize_net(); |
1011 | kfree(tipc_nametbl); | 1025 | kfree(tipc_nametbl); |
@@ -1109,9 +1123,10 @@ static int __tipc_nl_subseq_list(struct tipc_nl_msg *msg, struct name_seq *seq, | |||
1109 | return 0; | 1123 | return 0; |
1110 | } | 1124 | } |
1111 | 1125 | ||
1112 | static int __tipc_nl_seq_list(struct tipc_nl_msg *msg, u32 *last_type, | 1126 | static int tipc_nl_seq_list(struct net *net, struct tipc_nl_msg *msg, |
1113 | u32 *last_lower, u32 *last_publ) | 1127 | u32 *last_type, u32 *last_lower, u32 *last_publ) |
1114 | { | 1128 | { |
1129 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
1115 | struct hlist_head *seq_head; | 1130 | struct hlist_head *seq_head; |
1116 | struct name_seq *seq = NULL; | 1131 | struct name_seq *seq = NULL; |
1117 | int err; | 1132 | int err; |
@@ -1123,10 +1138,10 @@ static int __tipc_nl_seq_list(struct tipc_nl_msg *msg, u32 *last_type, | |||
1123 | i = 0; | 1138 | i = 0; |
1124 | 1139 | ||
1125 | for (; i < TIPC_NAMETBL_SIZE; i++) { | 1140 | for (; i < TIPC_NAMETBL_SIZE; i++) { |
1126 | seq_head = &tipc_nametbl->seq_hlist[i]; | 1141 | seq_head = &tn->nametbl->seq_hlist[i]; |
1127 | 1142 | ||
1128 | if (*last_type) { | 1143 | if (*last_type) { |
1129 | seq = nametbl_find_seq(*last_type); | 1144 | seq = nametbl_find_seq(net, *last_type); |
1130 | if (!seq) | 1145 | if (!seq) |
1131 | return -EPIPE; | 1146 | return -EPIPE; |
1132 | } else { | 1147 | } else { |
@@ -1160,6 +1175,7 @@ int tipc_nl_name_table_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1160 | u32 last_type = cb->args[0]; | 1175 | u32 last_type = cb->args[0]; |
1161 | u32 last_lower = cb->args[1]; | 1176 | u32 last_lower = cb->args[1]; |
1162 | u32 last_publ = cb->args[2]; | 1177 | u32 last_publ = cb->args[2]; |
1178 | struct net *net = sock_net(skb->sk); | ||
1163 | struct tipc_nl_msg msg; | 1179 | struct tipc_nl_msg msg; |
1164 | 1180 | ||
1165 | if (done) | 1181 | if (done) |
@@ -1170,7 +1186,7 @@ int tipc_nl_name_table_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1170 | msg.seq = cb->nlh->nlmsg_seq; | 1186 | msg.seq = cb->nlh->nlmsg_seq; |
1171 | 1187 | ||
1172 | rcu_read_lock(); | 1188 | rcu_read_lock(); |
1173 | err = __tipc_nl_seq_list(&msg, &last_type, &last_lower, &last_publ); | 1189 | err = tipc_nl_seq_list(net, &msg, &last_type, &last_lower, &last_publ); |
1174 | if (!err) { | 1190 | if (!err) { |
1175 | done = 1; | 1191 | done = 1; |
1176 | } else if (err != -EMSGSIZE) { | 1192 | } else if (err != -EMSGSIZE) { |
diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h index efccaca7a5d5..f67b3d8d4b2f 100644 --- a/net/tipc/name_table.h +++ b/net/tipc/name_table.h | |||
@@ -95,28 +95,27 @@ struct name_table { | |||
95 | u32 local_publ_count; | 95 | u32 local_publ_count; |
96 | }; | 96 | }; |
97 | 97 | ||
98 | extern spinlock_t tipc_nametbl_lock; | ||
99 | extern struct name_table *tipc_nametbl; | ||
100 | |||
101 | int tipc_nl_name_table_dump(struct sk_buff *skb, struct netlink_callback *cb); | 98 | int tipc_nl_name_table_dump(struct sk_buff *skb, struct netlink_callback *cb); |
102 | 99 | ||
103 | struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space); | 100 | struct sk_buff *tipc_nametbl_get(struct net *net, const void *req_tlv_area, |
104 | u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *node); | 101 | int req_tlv_space); |
105 | int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit, | 102 | u32 tipc_nametbl_translate(struct net *net, u32 type, u32 instance, u32 *node); |
106 | struct tipc_port_list *dports); | 103 | int tipc_nametbl_mc_translate(struct net *net, u32 type, u32 lower, u32 upper, |
104 | u32 limit, struct tipc_port_list *dports); | ||
107 | struct publication *tipc_nametbl_publish(struct net *net, u32 type, u32 lower, | 105 | struct publication *tipc_nametbl_publish(struct net *net, u32 type, u32 lower, |
108 | u32 upper, u32 scope, u32 port_ref, | 106 | u32 upper, u32 scope, u32 port_ref, |
109 | u32 key); | 107 | u32 key); |
110 | int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower, u32 ref, | 108 | int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower, u32 ref, |
111 | u32 key); | 109 | u32 key); |
112 | struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper, | 110 | struct publication *tipc_nametbl_insert_publ(struct net *net, u32 type, |
113 | u32 scope, u32 node, u32 ref, | 111 | u32 lower, u32 upper, u32 scope, |
112 | u32 node, u32 ref, u32 key); | ||
113 | struct publication *tipc_nametbl_remove_publ(struct net *net, u32 type, | ||
114 | u32 lower, u32 node, u32 ref, | ||
114 | u32 key); | 115 | u32 key); |
115 | struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, u32 node, | ||
116 | u32 ref, u32 key); | ||
117 | void tipc_nametbl_subscribe(struct tipc_subscription *s); | 116 | void tipc_nametbl_subscribe(struct tipc_subscription *s); |
118 | void tipc_nametbl_unsubscribe(struct tipc_subscription *s); | 117 | void tipc_nametbl_unsubscribe(struct tipc_subscription *s); |
119 | int tipc_nametbl_init(void); | 118 | int tipc_nametbl_init(struct net *net); |
120 | void tipc_nametbl_stop(void); | 119 | void tipc_nametbl_stop(struct net *net); |
121 | 120 | ||
122 | #endif | 121 | #endif |
diff --git a/net/tipc/net.c b/net/tipc/net.c index 44ccf47c79a3..04445d210e45 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c | |||
@@ -116,7 +116,7 @@ int tipc_net_start(struct net *net, u32 addr) | |||
116 | int res; | 116 | int res; |
117 | 117 | ||
118 | tipc_own_addr = addr; | 118 | tipc_own_addr = addr; |
119 | tipc_named_reinit(); | 119 | tipc_named_reinit(net); |
120 | tipc_sk_reinit(net); | 120 | tipc_sk_reinit(net); |
121 | res = tipc_bclink_init(net); | 121 | res = tipc_bclink_init(net); |
122 | if (res) | 122 | if (res) |
diff --git a/net/tipc/server.c b/net/tipc/server.c index 869eb0905754..b5bdaf721d70 100644 --- a/net/tipc/server.c +++ b/net/tipc/server.c | |||
@@ -256,7 +256,8 @@ static int tipc_receive_from_sock(struct tipc_conn *con) | |||
256 | goto out_close; | 256 | goto out_close; |
257 | } | 257 | } |
258 | 258 | ||
259 | s->tipc_conn_recvmsg(con->conid, &addr, con->usr_data, buf, ret); | 259 | s->tipc_conn_recvmsg(sock_net(con->sock->sk), con->conid, &addr, |
260 | con->usr_data, buf, ret); | ||
260 | 261 | ||
261 | kmem_cache_free(s->rcvbuf_cache, buf); | 262 | kmem_cache_free(s->rcvbuf_cache, buf); |
262 | 263 | ||
diff --git a/net/tipc/server.h b/net/tipc/server.h index 87bc05c70dce..9c979a01997c 100644 --- a/net/tipc/server.h +++ b/net/tipc/server.h | |||
@@ -38,6 +38,7 @@ | |||
38 | 38 | ||
39 | #include <linux/idr.h> | 39 | #include <linux/idr.h> |
40 | #include <linux/tipc.h> | 40 | #include <linux/tipc.h> |
41 | #include <net/net_namespace.h> | ||
41 | 42 | ||
42 | #define TIPC_SERVER_NAME_LEN 32 | 43 | #define TIPC_SERVER_NAME_LEN 32 |
43 | 44 | ||
@@ -66,10 +67,11 @@ struct tipc_server { | |||
66 | struct workqueue_struct *rcv_wq; | 67 | struct workqueue_struct *rcv_wq; |
67 | struct workqueue_struct *send_wq; | 68 | struct workqueue_struct *send_wq; |
68 | int max_rcvbuf_size; | 69 | int max_rcvbuf_size; |
69 | void *(*tipc_conn_new) (int conid); | 70 | void *(*tipc_conn_new)(int conid); |
70 | void (*tipc_conn_shutdown) (int conid, void *usr_data); | 71 | void (*tipc_conn_shutdown)(int conid, void *usr_data); |
71 | void (*tipc_conn_recvmsg) (int conid, struct sockaddr_tipc *addr, | 72 | void (*tipc_conn_recvmsg)(struct net *net, int conid, |
72 | void *usr_data, void *buf, size_t len); | 73 | struct sockaddr_tipc *addr, void *usr_data, |
74 | void *buf, size_t len); | ||
73 | struct sockaddr_tipc *saddr; | 75 | struct sockaddr_tipc *saddr; |
74 | const char name[TIPC_SERVER_NAME_LEN]; | 76 | const char name[TIPC_SERVER_NAME_LEN]; |
75 | int imp; | 77 | int imp; |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index accb02cb3527..4670e1e46c89 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -778,11 +778,8 @@ void tipc_sk_mcast_rcv(struct net *net, struct sk_buff *buf) | |||
778 | scope = TIPC_NODE_SCOPE; | 778 | scope = TIPC_NODE_SCOPE; |
779 | 779 | ||
780 | /* Create destination port list: */ | 780 | /* Create destination port list: */ |
781 | tipc_nametbl_mc_translate(msg_nametype(msg), | 781 | tipc_nametbl_mc_translate(net, msg_nametype(msg), msg_namelower(msg), |
782 | msg_namelower(msg), | 782 | msg_nameupper(msg), scope, &dports); |
783 | msg_nameupper(msg), | ||
784 | scope, | ||
785 | &dports); | ||
786 | last = dports.count; | 783 | last = dports.count; |
787 | if (!last) { | 784 | if (!last) { |
788 | kfree_skb(buf); | 785 | kfree_skb(buf); |
@@ -943,7 +940,7 @@ static int tipc_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
943 | msg_set_nametype(mhdr, type); | 940 | msg_set_nametype(mhdr, type); |
944 | msg_set_nameinst(mhdr, inst); | 941 | msg_set_nameinst(mhdr, inst); |
945 | msg_set_lookup_scope(mhdr, tipc_addr_scope(domain)); | 942 | msg_set_lookup_scope(mhdr, tipc_addr_scope(domain)); |
946 | dport = tipc_nametbl_translate(type, inst, &dnode); | 943 | dport = tipc_nametbl_translate(net, type, inst, &dnode); |
947 | msg_set_destnode(mhdr, dnode); | 944 | msg_set_destnode(mhdr, dnode); |
948 | msg_set_destport(mhdr, dport); | 945 | msg_set_destport(mhdr, dport); |
949 | if (unlikely(!dport && !dnode)) { | 946 | if (unlikely(!dport && !dnode)) { |
@@ -1765,7 +1762,7 @@ int tipc_sk_rcv(struct net *net, struct sk_buff *skb) | |||
1765 | /* Validate destination and message */ | 1762 | /* Validate destination and message */ |
1766 | tsk = tipc_sk_lookup(net, dport); | 1763 | tsk = tipc_sk_lookup(net, dport); |
1767 | if (unlikely(!tsk)) { | 1764 | if (unlikely(!tsk)) { |
1768 | rc = tipc_msg_eval(skb, &dnode); | 1765 | rc = tipc_msg_eval(net, skb, &dnode); |
1769 | goto exit; | 1766 | goto exit; |
1770 | } | 1767 | } |
1771 | sk = &tsk->sk; | 1768 | sk = &tsk->sk; |
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c index e6cb959371dc..b71dbc0ae8f9 100644 --- a/net/tipc/subscr.c +++ b/net/tipc/subscr.c | |||
@@ -50,8 +50,9 @@ struct tipc_subscriber { | |||
50 | struct list_head subscription_list; | 50 | struct list_head subscription_list; |
51 | }; | 51 | }; |
52 | 52 | ||
53 | static void subscr_conn_msg_event(int conid, struct sockaddr_tipc *addr, | 53 | static void subscr_conn_msg_event(struct net *net, int conid, |
54 | void *usr_data, void *buf, size_t len); | 54 | struct sockaddr_tipc *addr, void *usr_data, |
55 | void *buf, size_t len); | ||
55 | static void *subscr_named_msg_event(int conid); | 56 | static void *subscr_named_msg_event(int conid); |
56 | static void subscr_conn_shutdown_event(int conid, void *usr_data); | 57 | static void subscr_conn_shutdown_event(int conid, void *usr_data); |
57 | 58 | ||
@@ -260,7 +261,7 @@ static void subscr_cancel(struct tipc_subscr *s, | |||
260 | * | 261 | * |
261 | * Called with subscriber lock held. | 262 | * Called with subscriber lock held. |
262 | */ | 263 | */ |
263 | static int subscr_subscribe(struct tipc_subscr *s, | 264 | static int subscr_subscribe(struct net *net, struct tipc_subscr *s, |
264 | struct tipc_subscriber *subscriber, | 265 | struct tipc_subscriber *subscriber, |
265 | struct tipc_subscription **sub_p) { | 266 | struct tipc_subscription **sub_p) { |
266 | struct tipc_subscription *sub; | 267 | struct tipc_subscription *sub; |
@@ -291,6 +292,7 @@ static int subscr_subscribe(struct tipc_subscr *s, | |||
291 | } | 292 | } |
292 | 293 | ||
293 | /* Initialize subscription object */ | 294 | /* Initialize subscription object */ |
295 | sub->net = net; | ||
294 | sub->seq.type = htohl(s->seq.type, swap); | 296 | sub->seq.type = htohl(s->seq.type, swap); |
295 | sub->seq.lower = htohl(s->seq.lower, swap); | 297 | sub->seq.lower = htohl(s->seq.lower, swap); |
296 | sub->seq.upper = htohl(s->seq.upper, swap); | 298 | sub->seq.upper = htohl(s->seq.upper, swap); |
@@ -323,14 +325,16 @@ static void subscr_conn_shutdown_event(int conid, void *usr_data) | |||
323 | } | 325 | } |
324 | 326 | ||
325 | /* Handle one request to create a new subscription for the subscriber */ | 327 | /* Handle one request to create a new subscription for the subscriber */ |
326 | static void subscr_conn_msg_event(int conid, struct sockaddr_tipc *addr, | 328 | static void subscr_conn_msg_event(struct net *net, int conid, |
327 | void *usr_data, void *buf, size_t len) | 329 | struct sockaddr_tipc *addr, void *usr_data, |
330 | void *buf, size_t len) | ||
328 | { | 331 | { |
329 | struct tipc_subscriber *subscriber = usr_data; | 332 | struct tipc_subscriber *subscriber = usr_data; |
330 | struct tipc_subscription *sub = NULL; | 333 | struct tipc_subscription *sub = NULL; |
331 | 334 | ||
332 | spin_lock_bh(&subscriber->lock); | 335 | spin_lock_bh(&subscriber->lock); |
333 | if (subscr_subscribe((struct tipc_subscr *)buf, subscriber, &sub) < 0) { | 336 | if (subscr_subscribe(net, (struct tipc_subscr *)buf, subscriber, |
337 | &sub) < 0) { | ||
334 | spin_unlock_bh(&subscriber->lock); | 338 | spin_unlock_bh(&subscriber->lock); |
335 | subscr_terminate(subscriber); | 339 | subscr_terminate(subscriber); |
336 | return; | 340 | return; |
diff --git a/net/tipc/subscr.h b/net/tipc/subscr.h index 0d3958956aca..670f57096635 100644 --- a/net/tipc/subscr.h +++ b/net/tipc/subscr.h | |||
@@ -49,6 +49,7 @@ struct tipc_subscriber; | |||
49 | * struct tipc_subscription - TIPC network topology subscription object | 49 | * struct tipc_subscription - TIPC network topology subscription object |
50 | * @subscriber: pointer to its subscriber | 50 | * @subscriber: pointer to its subscriber |
51 | * @seq: name sequence associated with subscription | 51 | * @seq: name sequence associated with subscription |
52 | * @net: point to network namespace | ||
52 | * @timeout: duration of subscription (in ms) | 53 | * @timeout: duration of subscription (in ms) |
53 | * @filter: event filtering to be done for subscription | 54 | * @filter: event filtering to be done for subscription |
54 | * @timer: timer governing subscription duration (optional) | 55 | * @timer: timer governing subscription duration (optional) |
@@ -61,6 +62,7 @@ struct tipc_subscriber; | |||
61 | struct tipc_subscription { | 62 | struct tipc_subscription { |
62 | struct tipc_subscriber *subscriber; | 63 | struct tipc_subscriber *subscriber; |
63 | struct tipc_name_seq seq; | 64 | struct tipc_name_seq seq; |
65 | struct net *net; | ||
64 | unsigned long timeout; | 66 | unsigned long timeout; |
65 | u32 filter; | 67 | u32 filter; |
66 | struct timer_list timer; | 68 | struct timer_list timer; |