aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bcast.c27
-rw-r--r--net/tipc/bcast.h7
-rw-r--r--net/tipc/bearer.c67
-rw-r--r--net/tipc/bearer.h16
-rw-r--r--net/tipc/config.c2
-rw-r--r--net/tipc/core.h4
-rw-r--r--net/tipc/discover.c12
-rw-r--r--net/tipc/link.c41
-rw-r--r--net/tipc/link.h3
-rw-r--r--net/tipc/net.c4
10 files changed, 110 insertions, 73 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 816c0e49319f..e7c538304595 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -369,7 +369,7 @@ void tipc_bclink_update_link_state(struct net *net, struct tipc_node *n_ptr,
369 msg_set_bcgap_to(msg, to); 369 msg_set_bcgap_to(msg, to);
370 370
371 tipc_bclink_lock(); 371 tipc_bclink_lock();
372 tipc_bearer_send(MAX_BEARERS, buf, NULL); 372 tipc_bearer_send(net, MAX_BEARERS, buf, NULL);
373 bcl->stats.sent_nacks++; 373 bcl->stats.sent_nacks++;
374 tipc_bclink_unlock(); 374 tipc_bclink_unlock();
375 kfree_skb(buf); 375 kfree_skb(buf);
@@ -425,7 +425,7 @@ int tipc_bclink_xmit(struct net *net, struct sk_buff_head *list)
425 if (likely(bclink)) { 425 if (likely(bclink)) {
426 tipc_bclink_lock(); 426 tipc_bclink_lock();
427 if (likely(bclink->bcast_nodes.count)) { 427 if (likely(bclink->bcast_nodes.count)) {
428 rc = __tipc_link_xmit(bcl, list); 428 rc = __tipc_link_xmit(net, bcl, list);
429 if (likely(!rc)) { 429 if (likely(!rc)) {
430 u32 len = skb_queue_len(&bcl->outqueue); 430 u32 len = skb_queue_len(&bcl->outqueue);
431 431
@@ -682,13 +682,14 @@ static int tipc_bcbearer_send(struct sk_buff *buf, struct tipc_bearer *unused1,
682 682
683 if (bp_index == 0) { 683 if (bp_index == 0) {
684 /* Use original buffer for first bearer */ 684 /* Use original buffer for first bearer */
685 tipc_bearer_send(b->identity, buf, &b->bcast_addr); 685 tipc_bearer_send(net, b->identity, buf, &b->bcast_addr);
686 } else { 686 } else {
687 /* Avoid concurrent buffer access */ 687 /* Avoid concurrent buffer access */
688 tbuf = pskb_copy_for_clone(buf, GFP_ATOMIC); 688 tbuf = pskb_copy_for_clone(buf, GFP_ATOMIC);
689 if (!tbuf) 689 if (!tbuf)
690 break; 690 break;
691 tipc_bearer_send(b->identity, tbuf, &b->bcast_addr); 691 tipc_bearer_send(net, b->identity, tbuf,
692 &b->bcast_addr);
692 kfree_skb(tbuf); /* Bearer keeps a clone */ 693 kfree_skb(tbuf); /* Bearer keeps a clone */
693 } 694 }
694 if (bcbearer->remains_new.count == 0) 695 if (bcbearer->remains_new.count == 0)
@@ -703,8 +704,10 @@ static int tipc_bcbearer_send(struct sk_buff *buf, struct tipc_bearer *unused1,
703/** 704/**
704 * tipc_bcbearer_sort - create sets of bearer pairs used by broadcast bearer 705 * tipc_bcbearer_sort - create sets of bearer pairs used by broadcast bearer
705 */ 706 */
706void tipc_bcbearer_sort(struct tipc_node_map *nm_ptr, u32 node, bool action) 707void tipc_bcbearer_sort(struct net *net, struct tipc_node_map *nm_ptr,
708 u32 node, bool action)
707{ 709{
710 struct tipc_net *tn = net_generic(net, tipc_net_id);
708 struct tipc_bcbearer_pair *bp_temp = bcbearer->bpairs_temp; 711 struct tipc_bcbearer_pair *bp_temp = bcbearer->bpairs_temp;
709 struct tipc_bcbearer_pair *bp_curr; 712 struct tipc_bcbearer_pair *bp_curr;
710 struct tipc_bearer *b; 713 struct tipc_bearer *b;
@@ -723,7 +726,7 @@ void tipc_bcbearer_sort(struct tipc_node_map *nm_ptr, u32 node, bool action)
723 726
724 rcu_read_lock(); 727 rcu_read_lock();
725 for (b_index = 0; b_index < MAX_BEARERS; b_index++) { 728 for (b_index = 0; b_index < MAX_BEARERS; b_index++) {
726 b = rcu_dereference_rtnl(bearer_list[b_index]); 729 b = rcu_dereference_rtnl(tn->bearer_list[b_index]);
727 if (!b || !b->nodes.count) 730 if (!b || !b->nodes.count)
728 continue; 731 continue;
729 732
@@ -939,8 +942,10 @@ int tipc_bclink_set_queue_limits(u32 limit)
939 return 0; 942 return 0;
940} 943}
941 944
942int tipc_bclink_init(void) 945int tipc_bclink_init(struct net *net)
943{ 946{
947 struct tipc_net *tn = net_generic(net, tipc_net_id);
948
944 bcbearer = kzalloc(sizeof(*bcbearer), GFP_ATOMIC); 949 bcbearer = kzalloc(sizeof(*bcbearer), GFP_ATOMIC);
945 if (!bcbearer) 950 if (!bcbearer)
946 return -ENOMEM; 951 return -ENOMEM;
@@ -967,19 +972,21 @@ int tipc_bclink_init(void)
967 bcl->max_pkt = MAX_PKT_DEFAULT_MCAST; 972 bcl->max_pkt = MAX_PKT_DEFAULT_MCAST;
968 tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT); 973 tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT);
969 bcl->bearer_id = MAX_BEARERS; 974 bcl->bearer_id = MAX_BEARERS;
970 rcu_assign_pointer(bearer_list[MAX_BEARERS], &bcbearer->bearer); 975 rcu_assign_pointer(tn->bearer_list[MAX_BEARERS], &bcbearer->bearer);
971 bcl->state = WORKING_WORKING; 976 bcl->state = WORKING_WORKING;
972 strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME); 977 strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME);
973 return 0; 978 return 0;
974} 979}
975 980
976void tipc_bclink_stop(void) 981void tipc_bclink_stop(struct net *net)
977{ 982{
983 struct tipc_net *tn = net_generic(net, tipc_net_id);
984
978 tipc_bclink_lock(); 985 tipc_bclink_lock();
979 tipc_link_purge_queues(bcl); 986 tipc_link_purge_queues(bcl);
980 tipc_bclink_unlock(); 987 tipc_bclink_unlock();
981 988
982 RCU_INIT_POINTER(bearer_list[BCBEARER], NULL); 989 RCU_INIT_POINTER(tn->bearer_list[BCBEARER], NULL);
983 synchronize_net(); 990 synchronize_net();
984 kfree(bcbearer); 991 kfree(bcbearer);
985 kfree(bclink); 992 kfree(bclink);
diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h
index fd0d17a76493..692efb662253 100644
--- a/net/tipc/bcast.h
+++ b/net/tipc/bcast.h
@@ -84,8 +84,8 @@ static inline int tipc_nmap_equal(struct tipc_node_map *nm_a,
84void tipc_port_list_add(struct tipc_port_list *pl_ptr, u32 port); 84void tipc_port_list_add(struct tipc_port_list *pl_ptr, u32 port);
85void tipc_port_list_free(struct tipc_port_list *pl_ptr); 85void tipc_port_list_free(struct tipc_port_list *pl_ptr);
86 86
87int tipc_bclink_init(void); 87int tipc_bclink_init(struct net *net);
88void tipc_bclink_stop(void); 88void tipc_bclink_stop(struct net *net);
89void tipc_bclink_set_flags(unsigned int flags); 89void tipc_bclink_set_flags(unsigned int flags);
90void tipc_bclink_add_node(u32 addr); 90void tipc_bclink_add_node(u32 addr);
91void tipc_bclink_remove_node(u32 addr); 91void tipc_bclink_remove_node(u32 addr);
@@ -99,7 +99,8 @@ void tipc_bclink_update_link_state(struct net *net, struct tipc_node *n_ptr,
99int tipc_bclink_stats(char *stats_buf, const u32 buf_size); 99int tipc_bclink_stats(char *stats_buf, const u32 buf_size);
100int tipc_bclink_reset_stats(void); 100int tipc_bclink_reset_stats(void);
101int tipc_bclink_set_queue_limits(u32 limit); 101int tipc_bclink_set_queue_limits(u32 limit);
102void tipc_bcbearer_sort(struct tipc_node_map *nm_ptr, u32 node, bool action); 102void tipc_bcbearer_sort(struct net *net, struct tipc_node_map *nm_ptr,
103 u32 node, bool action);
103uint tipc_bclink_get_mtu(void); 104uint tipc_bclink_get_mtu(void);
104int tipc_bclink_xmit(struct net *net, struct sk_buff_head *list); 105int tipc_bclink_xmit(struct net *net, struct sk_buff_head *list);
105void tipc_bclink_wakeup_users(struct net *net); 106void tipc_bclink_wakeup_users(struct net *net);
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index a735c08e9d90..2fe9dcb418d4 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.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 "bearer.h" 40#include "bearer.h"
@@ -67,8 +68,6 @@ static const struct nla_policy tipc_nl_media_policy[TIPC_NLA_MEDIA_MAX + 1] = {
67 [TIPC_NLA_MEDIA_PROP] = { .type = NLA_NESTED } 68 [TIPC_NLA_MEDIA_PROP] = { .type = NLA_NESTED }
68}; 69};
69 70
70struct tipc_bearer __rcu *bearer_list[MAX_BEARERS + 1];
71
72static void bearer_disable(struct net *net, struct tipc_bearer *b_ptr, 71static void bearer_disable(struct net *net, struct tipc_bearer *b_ptr,
73 bool shutting_down); 72 bool shutting_down);
74 73
@@ -191,13 +190,14 @@ static int bearer_name_validate(const char *name,
191/** 190/**
192 * tipc_bearer_find - locates bearer object with matching bearer name 191 * tipc_bearer_find - locates bearer object with matching bearer name
193 */ 192 */
194struct tipc_bearer *tipc_bearer_find(const char *name) 193struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name)
195{ 194{
195 struct tipc_net *tn = net_generic(net, tipc_net_id);
196 struct tipc_bearer *b_ptr; 196 struct tipc_bearer *b_ptr;
197 u32 i; 197 u32 i;
198 198
199 for (i = 0; i < MAX_BEARERS; i++) { 199 for (i = 0; i < MAX_BEARERS; i++) {
200 b_ptr = rtnl_dereference(bearer_list[i]); 200 b_ptr = rtnl_dereference(tn->bearer_list[i]);
201 if (b_ptr && (!strcmp(b_ptr->name, name))) 201 if (b_ptr && (!strcmp(b_ptr->name, name)))
202 return b_ptr; 202 return b_ptr;
203 } 203 }
@@ -207,8 +207,9 @@ struct tipc_bearer *tipc_bearer_find(const char *name)
207/** 207/**
208 * tipc_bearer_get_names - record names of bearers in buffer 208 * tipc_bearer_get_names - record names of bearers in buffer
209 */ 209 */
210struct sk_buff *tipc_bearer_get_names(void) 210struct sk_buff *tipc_bearer_get_names(struct net *net)
211{ 211{
212 struct tipc_net *tn = net_generic(net, tipc_net_id);
212 struct sk_buff *buf; 213 struct sk_buff *buf;
213 struct tipc_bearer *b; 214 struct tipc_bearer *b;
214 int i, j; 215 int i, j;
@@ -219,7 +220,7 @@ struct sk_buff *tipc_bearer_get_names(void)
219 220
220 for (i = 0; media_info_array[i] != NULL; i++) { 221 for (i = 0; media_info_array[i] != NULL; i++) {
221 for (j = 0; j < MAX_BEARERS; j++) { 222 for (j = 0; j < MAX_BEARERS; j++) {
222 b = rtnl_dereference(bearer_list[j]); 223 b = rtnl_dereference(tn->bearer_list[j]);
223 if (!b) 224 if (!b)
224 continue; 225 continue;
225 if (b->media == media_info_array[i]) { 226 if (b->media == media_info_array[i]) {
@@ -232,27 +233,29 @@ struct sk_buff *tipc_bearer_get_names(void)
232 return buf; 233 return buf;
233} 234}
234 235
235void tipc_bearer_add_dest(u32 bearer_id, u32 dest) 236void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest)
236{ 237{
238 struct tipc_net *tn = net_generic(net, tipc_net_id);
237 struct tipc_bearer *b_ptr; 239 struct tipc_bearer *b_ptr;
238 240
239 rcu_read_lock(); 241 rcu_read_lock();
240 b_ptr = rcu_dereference_rtnl(bearer_list[bearer_id]); 242 b_ptr = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
241 if (b_ptr) { 243 if (b_ptr) {
242 tipc_bcbearer_sort(&b_ptr->nodes, dest, true); 244 tipc_bcbearer_sort(net, &b_ptr->nodes, dest, true);
243 tipc_disc_add_dest(b_ptr->link_req); 245 tipc_disc_add_dest(b_ptr->link_req);
244 } 246 }
245 rcu_read_unlock(); 247 rcu_read_unlock();
246} 248}
247 249
248void tipc_bearer_remove_dest(u32 bearer_id, u32 dest) 250void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest)
249{ 251{
252 struct tipc_net *tn = net_generic(net, tipc_net_id);
250 struct tipc_bearer *b_ptr; 253 struct tipc_bearer *b_ptr;
251 254
252 rcu_read_lock(); 255 rcu_read_lock();
253 b_ptr = rcu_dereference_rtnl(bearer_list[bearer_id]); 256 b_ptr = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
254 if (b_ptr) { 257 if (b_ptr) {
255 tipc_bcbearer_sort(&b_ptr->nodes, dest, false); 258 tipc_bcbearer_sort(net, &b_ptr->nodes, dest, false);
256 tipc_disc_remove_dest(b_ptr->link_req); 259 tipc_disc_remove_dest(b_ptr->link_req);
257 } 260 }
258 rcu_read_unlock(); 261 rcu_read_unlock();
@@ -264,6 +267,7 @@ void tipc_bearer_remove_dest(u32 bearer_id, u32 dest)
264int tipc_enable_bearer(struct net *net, const char *name, u32 disc_domain, 267int tipc_enable_bearer(struct net *net, const char *name, u32 disc_domain,
265 u32 priority) 268 u32 priority)
266{ 269{
270 struct tipc_net *tn = net_generic(net, tipc_net_id);
267 struct tipc_bearer *b_ptr; 271 struct tipc_bearer *b_ptr;
268 struct tipc_media *m_ptr; 272 struct tipc_media *m_ptr;
269 struct tipc_bearer_names b_names; 273 struct tipc_bearer_names b_names;
@@ -315,7 +319,7 @@ restart:
315 bearer_id = MAX_BEARERS; 319 bearer_id = MAX_BEARERS;
316 with_this_prio = 1; 320 with_this_prio = 1;
317 for (i = MAX_BEARERS; i-- != 0; ) { 321 for (i = MAX_BEARERS; i-- != 0; ) {
318 b_ptr = rtnl_dereference(bearer_list[i]); 322 b_ptr = rtnl_dereference(tn->bearer_list[i]);
319 if (!b_ptr) { 323 if (!b_ptr) {
320 bearer_id = i; 324 bearer_id = i;
321 continue; 325 continue;
@@ -349,7 +353,7 @@ restart:
349 353
350 strcpy(b_ptr->name, name); 354 strcpy(b_ptr->name, name);
351 b_ptr->media = m_ptr; 355 b_ptr->media = m_ptr;
352 res = m_ptr->enable_media(b_ptr); 356 res = m_ptr->enable_media(net, b_ptr);
353 if (res) { 357 if (res) {
354 pr_warn("Bearer <%s> rejected, enable failure (%d)\n", 358 pr_warn("Bearer <%s> rejected, enable failure (%d)\n",
355 name, -res); 359 name, -res);
@@ -371,7 +375,7 @@ restart:
371 return -EINVAL; 375 return -EINVAL;
372 } 376 }
373 377
374 rcu_assign_pointer(bearer_list[bearer_id], b_ptr); 378 rcu_assign_pointer(tn->bearer_list[bearer_id], b_ptr);
375 379
376 pr_info("Enabled bearer <%s>, discovery domain %s, priority %u\n", 380 pr_info("Enabled bearer <%s>, discovery domain %s, priority %u\n",
377 name, 381 name,
@@ -398,6 +402,7 @@ static int tipc_reset_bearer(struct net *net, struct tipc_bearer *b_ptr)
398static void bearer_disable(struct net *net, struct tipc_bearer *b_ptr, 402static void bearer_disable(struct net *net, struct tipc_bearer *b_ptr,
399 bool shutting_down) 403 bool shutting_down)
400{ 404{
405 struct tipc_net *tn = net_generic(net, tipc_net_id);
401 u32 i; 406 u32 i;
402 407
403 pr_info("Disabling bearer <%s>\n", b_ptr->name); 408 pr_info("Disabling bearer <%s>\n", b_ptr->name);
@@ -408,8 +413,8 @@ static void bearer_disable(struct net *net, struct tipc_bearer *b_ptr,
408 tipc_disc_delete(b_ptr->link_req); 413 tipc_disc_delete(b_ptr->link_req);
409 414
410 for (i = 0; i < MAX_BEARERS; i++) { 415 for (i = 0; i < MAX_BEARERS; i++) {
411 if (b_ptr == rtnl_dereference(bearer_list[i])) { 416 if (b_ptr == rtnl_dereference(tn->bearer_list[i])) {
412 RCU_INIT_POINTER(bearer_list[i], NULL); 417 RCU_INIT_POINTER(tn->bearer_list[i], NULL);
413 break; 418 break;
414 } 419 }
415 } 420 }
@@ -421,7 +426,7 @@ int tipc_disable_bearer(struct net *net, const char *name)
421 struct tipc_bearer *b_ptr; 426 struct tipc_bearer *b_ptr;
422 int res; 427 int res;
423 428
424 b_ptr = tipc_bearer_find(name); 429 b_ptr = tipc_bearer_find(net, name);
425 if (b_ptr == NULL) { 430 if (b_ptr == NULL) {
426 pr_warn("Attempt to disable unknown bearer <%s>\n", name); 431 pr_warn("Attempt to disable unknown bearer <%s>\n", name);
427 res = -EINVAL; 432 res = -EINVAL;
@@ -432,13 +437,13 @@ int tipc_disable_bearer(struct net *net, const char *name)
432 return res; 437 return res;
433} 438}
434 439
435int tipc_enable_l2_media(struct tipc_bearer *b) 440int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b)
436{ 441{
437 struct net_device *dev; 442 struct net_device *dev;
438 char *driver_name = strchr((const char *)b->name, ':') + 1; 443 char *driver_name = strchr((const char *)b->name, ':') + 1;
439 444
440 /* Find device with specified name */ 445 /* Find device with specified name */
441 dev = dev_get_by_name(&init_net, driver_name); 446 dev = dev_get_by_name(net, driver_name);
442 if (!dev) 447 if (!dev)
443 return -ENODEV; 448 return -ENODEV;
444 449
@@ -514,13 +519,14 @@ int tipc_l2_send_msg(struct sk_buff *buf, struct tipc_bearer *b,
514 * The media send routine must not alter the buffer being passed in 519 * The media send routine must not alter the buffer being passed in
515 * as it may be needed for later retransmission! 520 * as it may be needed for later retransmission!
516 */ 521 */
517void tipc_bearer_send(u32 bearer_id, struct sk_buff *buf, 522void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf,
518 struct tipc_media_addr *dest) 523 struct tipc_media_addr *dest)
519{ 524{
525 struct tipc_net *tn = net_generic(net, tipc_net_id);
520 struct tipc_bearer *b_ptr; 526 struct tipc_bearer *b_ptr;
521 527
522 rcu_read_lock(); 528 rcu_read_lock();
523 b_ptr = rcu_dereference_rtnl(bearer_list[bearer_id]); 529 b_ptr = rcu_dereference_rtnl(tn->bearer_list[bearer_id]);
524 if (likely(b_ptr)) 530 if (likely(b_ptr))
525 b_ptr->media->send_msg(buf, b_ptr, dest); 531 b_ptr->media->send_msg(buf, b_ptr, dest);
526 rcu_read_unlock(); 532 rcu_read_unlock();
@@ -630,14 +636,15 @@ void tipc_bearer_cleanup(void)
630 636
631void tipc_bearer_stop(struct net *net) 637void tipc_bearer_stop(struct net *net)
632{ 638{
639 struct tipc_net *tn = net_generic(net, tipc_net_id);
633 struct tipc_bearer *b_ptr; 640 struct tipc_bearer *b_ptr;
634 u32 i; 641 u32 i;
635 642
636 for (i = 0; i < MAX_BEARERS; i++) { 643 for (i = 0; i < MAX_BEARERS; i++) {
637 b_ptr = rtnl_dereference(bearer_list[i]); 644 b_ptr = rtnl_dereference(tn->bearer_list[i]);
638 if (b_ptr) { 645 if (b_ptr) {
639 bearer_disable(net, b_ptr, true); 646 bearer_disable(net, b_ptr, true);
640 bearer_list[i] = NULL; 647 tn->bearer_list[i] = NULL;
641 } 648 }
642 } 649 }
643} 650}
@@ -694,6 +701,8 @@ int tipc_nl_bearer_dump(struct sk_buff *skb, struct netlink_callback *cb)
694 int i = cb->args[0]; 701 int i = cb->args[0];
695 struct tipc_bearer *bearer; 702 struct tipc_bearer *bearer;
696 struct tipc_nl_msg msg; 703 struct tipc_nl_msg msg;
704 struct net *net = sock_net(skb->sk);
705 struct tipc_net *tn = net_generic(net, tipc_net_id);
697 706
698 if (i == MAX_BEARERS) 707 if (i == MAX_BEARERS)
699 return 0; 708 return 0;
@@ -704,7 +713,7 @@ int tipc_nl_bearer_dump(struct sk_buff *skb, struct netlink_callback *cb)
704 713
705 rtnl_lock(); 714 rtnl_lock();
706 for (i = 0; i < MAX_BEARERS; i++) { 715 for (i = 0; i < MAX_BEARERS; i++) {
707 bearer = rtnl_dereference(bearer_list[i]); 716 bearer = rtnl_dereference(tn->bearer_list[i]);
708 if (!bearer) 717 if (!bearer)
709 continue; 718 continue;
710 719
@@ -726,6 +735,7 @@ int tipc_nl_bearer_get(struct sk_buff *skb, struct genl_info *info)
726 struct tipc_bearer *bearer; 735 struct tipc_bearer *bearer;
727 struct tipc_nl_msg msg; 736 struct tipc_nl_msg msg;
728 struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1]; 737 struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1];
738 struct net *net = genl_info_net(info);
729 739
730 if (!info->attrs[TIPC_NLA_BEARER]) 740 if (!info->attrs[TIPC_NLA_BEARER])
731 return -EINVAL; 741 return -EINVAL;
@@ -749,7 +759,7 @@ int tipc_nl_bearer_get(struct sk_buff *skb, struct genl_info *info)
749 msg.seq = info->snd_seq; 759 msg.seq = info->snd_seq;
750 760
751 rtnl_lock(); 761 rtnl_lock();
752 bearer = tipc_bearer_find(name); 762 bearer = tipc_bearer_find(net, name);
753 if (!bearer) { 763 if (!bearer) {
754 err = -EINVAL; 764 err = -EINVAL;
755 goto err_out; 765 goto err_out;
@@ -791,7 +801,7 @@ int tipc_nl_bearer_disable(struct sk_buff *skb, struct genl_info *info)
791 name = nla_data(attrs[TIPC_NLA_BEARER_NAME]); 801 name = nla_data(attrs[TIPC_NLA_BEARER_NAME]);
792 802
793 rtnl_lock(); 803 rtnl_lock();
794 bearer = tipc_bearer_find(name); 804 bearer = tipc_bearer_find(net, name);
795 if (!bearer) { 805 if (!bearer) {
796 rtnl_unlock(); 806 rtnl_unlock();
797 return -EINVAL; 807 return -EINVAL;
@@ -861,6 +871,7 @@ int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
861 char *name; 871 char *name;
862 struct tipc_bearer *b; 872 struct tipc_bearer *b;
863 struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1]; 873 struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1];
874 struct net *net = genl_info_net(info);
864 875
865 if (!info->attrs[TIPC_NLA_BEARER]) 876 if (!info->attrs[TIPC_NLA_BEARER])
866 return -EINVAL; 877 return -EINVAL;
@@ -876,7 +887,7 @@ int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
876 name = nla_data(attrs[TIPC_NLA_BEARER_NAME]); 887 name = nla_data(attrs[TIPC_NLA_BEARER_NAME]);
877 888
878 rtnl_lock(); 889 rtnl_lock();
879 b = tipc_bearer_find(name); 890 b = tipc_bearer_find(net, name);
880 if (!b) { 891 if (!b) {
881 rtnl_unlock(); 892 rtnl_unlock();
882 return -EINVAL; 893 return -EINVAL;
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
index 91a8eeea309c..01722d6b2058 100644
--- a/net/tipc/bearer.h
+++ b/net/tipc/bearer.h
@@ -92,7 +92,7 @@ struct tipc_media {
92 int (*send_msg)(struct sk_buff *buf, 92 int (*send_msg)(struct sk_buff *buf,
93 struct tipc_bearer *b_ptr, 93 struct tipc_bearer *b_ptr,
94 struct tipc_media_addr *dest); 94 struct tipc_media_addr *dest);
95 int (*enable_media)(struct tipc_bearer *b_ptr); 95 int (*enable_media)(struct net *net, struct tipc_bearer *b_ptr);
96 void (*disable_media)(struct tipc_bearer *b_ptr); 96 void (*disable_media)(struct tipc_bearer *b_ptr);
97 int (*addr2str)(struct tipc_media_addr *addr, 97 int (*addr2str)(struct tipc_media_addr *addr,
98 char *strbuf, 98 char *strbuf,
@@ -159,8 +159,6 @@ struct tipc_bearer_names {
159 159
160struct tipc_link; 160struct tipc_link;
161 161
162extern struct tipc_bearer __rcu *bearer_list[];
163
164/* 162/*
165 * TIPC routines available to supported media types 163 * TIPC routines available to supported media types
166 */ 164 */
@@ -193,20 +191,20 @@ int tipc_media_set_priority(const char *name, u32 new_value);
193int tipc_media_set_window(const char *name, u32 new_value); 191int tipc_media_set_window(const char *name, u32 new_value);
194void tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a); 192void tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a);
195struct sk_buff *tipc_media_get_names(void); 193struct sk_buff *tipc_media_get_names(void);
196int tipc_enable_l2_media(struct tipc_bearer *b); 194int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b);
197void tipc_disable_l2_media(struct tipc_bearer *b); 195void tipc_disable_l2_media(struct tipc_bearer *b);
198int tipc_l2_send_msg(struct sk_buff *buf, struct tipc_bearer *b, 196int tipc_l2_send_msg(struct sk_buff *buf, struct tipc_bearer *b,
199 struct tipc_media_addr *dest); 197 struct tipc_media_addr *dest);
200 198
201struct sk_buff *tipc_bearer_get_names(void); 199struct sk_buff *tipc_bearer_get_names(struct net *net);
202void tipc_bearer_add_dest(u32 bearer_id, u32 dest); 200void tipc_bearer_add_dest(struct net *net, u32 bearer_id, u32 dest);
203void tipc_bearer_remove_dest(u32 bearer_id, u32 dest); 201void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest);
204struct tipc_bearer *tipc_bearer_find(const char *name); 202struct tipc_bearer *tipc_bearer_find(struct net *net, const char *name);
205struct tipc_media *tipc_media_find(const char *name); 203struct tipc_media *tipc_media_find(const char *name);
206int tipc_bearer_setup(void); 204int tipc_bearer_setup(void);
207void tipc_bearer_cleanup(void); 205void tipc_bearer_cleanup(void);
208void tipc_bearer_stop(struct net *net); 206void tipc_bearer_stop(struct net *net);
209void tipc_bearer_send(u32 bearer_id, struct sk_buff *buf, 207void tipc_bearer_send(struct net *net, u32 bearer_id, struct sk_buff *buf,
210 struct tipc_media_addr *dest); 208 struct tipc_media_addr *dest);
211 209
212#endif /* _TIPC_BEARER_H */ 210#endif /* _TIPC_BEARER_H */
diff --git a/net/tipc/config.c b/net/tipc/config.c
index cf2d417ad488..ac73291d0d32 100644
--- a/net/tipc/config.c
+++ b/net/tipc/config.c
@@ -251,7 +251,7 @@ struct sk_buff *tipc_cfg_do_cmd(struct net *net, u32 orig_node, u16 cmd,
251 rep_tlv_buf = tipc_nametbl_get(req_tlv_area, req_tlv_space); 251 rep_tlv_buf = tipc_nametbl_get(req_tlv_area, req_tlv_space);
252 break; 252 break;
253 case TIPC_CMD_GET_BEARER_NAMES: 253 case TIPC_CMD_GET_BEARER_NAMES:
254 rep_tlv_buf = tipc_bearer_get_names(); 254 rep_tlv_buf = tipc_bearer_get_names(net);
255 break; 255 break;
256 case TIPC_CMD_GET_MEDIA_NAMES: 256 case TIPC_CMD_GET_MEDIA_NAMES:
257 rep_tlv_buf = tipc_media_get_names(); 257 rep_tlv_buf = tipc_media_get_names();
diff --git a/net/tipc/core.h b/net/tipc/core.h
index 4fb113397e7b..75a332b1968e 100644
--- a/net/tipc/core.h
+++ b/net/tipc/core.h
@@ -60,6 +60,7 @@
60#include <net/netns/generic.h> 60#include <net/netns/generic.h>
61 61
62#include "node.h" 62#include "node.h"
63#include "bearer.h"
63 64
64#define TIPC_MOD_VER "2.0.0" 65#define TIPC_MOD_VER "2.0.0"
65 66
@@ -87,6 +88,9 @@ struct tipc_net {
87 struct list_head node_list; 88 struct list_head node_list;
88 u32 num_nodes; 89 u32 num_nodes;
89 u32 num_links; 90 u32 num_links;
91
92 /* Bearer list */
93 struct tipc_bearer __rcu *bearer_list[MAX_BEARERS + 1];
90}; 94};
91 95
92#ifdef CONFIG_SYSCTL 96#ifdef CONFIG_SYSCTL
diff --git a/net/tipc/discover.c b/net/tipc/discover.c
index f0fd8b449aef..f93dd3dd621b 100644
--- a/net/tipc/discover.c
+++ b/net/tipc/discover.c
@@ -51,6 +51,7 @@
51/** 51/**
52 * struct tipc_link_req - information about an ongoing link setup request 52 * struct tipc_link_req - information about an ongoing link setup request
53 * @bearer_id: identity of bearer issuing requests 53 * @bearer_id: identity of bearer issuing requests
54 * @net: network namespace instance
54 * @dest: destination address for request messages 55 * @dest: destination address for request messages
55 * @domain: network domain to which links can be established 56 * @domain: network domain to which links can be established
56 * @num_nodes: number of nodes currently discovered (i.e. with an active link) 57 * @num_nodes: number of nodes currently discovered (i.e. with an active link)
@@ -62,6 +63,7 @@
62struct tipc_link_req { 63struct tipc_link_req {
63 u32 bearer_id; 64 u32 bearer_id;
64 struct tipc_media_addr dest; 65 struct tipc_media_addr dest;
66 struct net *net;
65 u32 domain; 67 u32 domain;
66 int num_nodes; 68 int num_nodes;
67 spinlock_t lock; 69 spinlock_t lock;
@@ -254,7 +256,7 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *buf,
254 rbuf = tipc_buf_acquire(INT_H_SIZE); 256 rbuf = tipc_buf_acquire(INT_H_SIZE);
255 if (rbuf) { 257 if (rbuf) {
256 tipc_disc_init_msg(net, rbuf, DSC_RESP_MSG, bearer); 258 tipc_disc_init_msg(net, rbuf, DSC_RESP_MSG, bearer);
257 tipc_bearer_send(bearer->identity, rbuf, &maddr); 259 tipc_bearer_send(net, bearer->identity, rbuf, &maddr);
258 kfree_skb(rbuf); 260 kfree_skb(rbuf);
259 } 261 }
260 } 262 }
@@ -328,7 +330,7 @@ static void disc_timeout(unsigned long data)
328 * hold at fast polling rate if don't have any associated nodes, 330 * hold at fast polling rate if don't have any associated nodes,
329 * otherwise hold at slow polling rate 331 * otherwise hold at slow polling rate
330 */ 332 */
331 tipc_bearer_send(req->bearer_id, req->buf, &req->dest); 333 tipc_bearer_send(req->net, req->bearer_id, req->buf, &req->dest);
332 334
333 335
334 req->timer_intv *= 2; 336 req->timer_intv *= 2;
@@ -370,6 +372,7 @@ int tipc_disc_create(struct net *net, struct tipc_bearer *b_ptr,
370 372
371 tipc_disc_init_msg(net, req->buf, DSC_REQ_MSG, b_ptr); 373 tipc_disc_init_msg(net, req->buf, DSC_REQ_MSG, b_ptr);
372 memcpy(&req->dest, dest, sizeof(*dest)); 374 memcpy(&req->dest, dest, sizeof(*dest));
375 req->net = net;
373 req->bearer_id = b_ptr->identity; 376 req->bearer_id = b_ptr->identity;
374 req->domain = b_ptr->domain; 377 req->domain = b_ptr->domain;
375 req->num_nodes = 0; 378 req->num_nodes = 0;
@@ -378,7 +381,7 @@ int tipc_disc_create(struct net *net, struct tipc_bearer *b_ptr,
378 setup_timer(&req->timer, disc_timeout, (unsigned long)req); 381 setup_timer(&req->timer, disc_timeout, (unsigned long)req);
379 mod_timer(&req->timer, jiffies + req->timer_intv); 382 mod_timer(&req->timer, jiffies + req->timer_intv);
380 b_ptr->link_req = req; 383 b_ptr->link_req = req;
381 tipc_bearer_send(req->bearer_id, req->buf, &req->dest); 384 tipc_bearer_send(net, req->bearer_id, req->buf, &req->dest);
382 return 0; 385 return 0;
383} 386}
384 387
@@ -405,11 +408,12 @@ void tipc_disc_reset(struct net *net, struct tipc_bearer *b_ptr)
405 408
406 spin_lock_bh(&req->lock); 409 spin_lock_bh(&req->lock);
407 tipc_disc_init_msg(net, req->buf, DSC_REQ_MSG, b_ptr); 410 tipc_disc_init_msg(net, req->buf, DSC_REQ_MSG, b_ptr);
411 req->net = net;
408 req->bearer_id = b_ptr->identity; 412 req->bearer_id = b_ptr->identity;
409 req->domain = b_ptr->domain; 413 req->domain = b_ptr->domain;
410 req->num_nodes = 0; 414 req->num_nodes = 0;
411 req->timer_intv = TIPC_LINK_REQ_INIT; 415 req->timer_intv = TIPC_LINK_REQ_INIT;
412 mod_timer(&req->timer, jiffies + req->timer_intv); 416 mod_timer(&req->timer, jiffies + req->timer_intv);
413 tipc_bearer_send(req->bearer_id, req->buf, &req->dest); 417 tipc_bearer_send(net, req->bearer_id, req->buf, &req->dest);
414 spin_unlock_bh(&req->lock); 418 spin_unlock_bh(&req->lock);
415} 419}
diff --git a/net/tipc/link.c b/net/tipc/link.c
index f6505652742e..be21e6ac73fe 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -129,11 +129,13 @@ static unsigned int align(unsigned int i)
129 129
130static void link_init_max_pkt(struct tipc_link *l_ptr) 130static void link_init_max_pkt(struct tipc_link *l_ptr)
131{ 131{
132 struct tipc_node *node = l_ptr->owner;
133 struct tipc_net *tn = net_generic(node->net, tipc_net_id);
132 struct tipc_bearer *b_ptr; 134 struct tipc_bearer *b_ptr;
133 u32 max_pkt; 135 u32 max_pkt;
134 136
135 rcu_read_lock(); 137 rcu_read_lock();
136 b_ptr = rcu_dereference_rtnl(bearer_list[l_ptr->bearer_id]); 138 b_ptr = rcu_dereference_rtnl(tn->bearer_list[l_ptr->bearer_id]);
137 if (!b_ptr) { 139 if (!b_ptr) {
138 rcu_read_unlock(); 140 rcu_read_unlock();
139 return; 141 return;
@@ -431,7 +433,7 @@ void tipc_link_reset(struct tipc_link *l_ptr)
431 return; 433 return;
432 434
433 tipc_node_link_down(l_ptr->owner, l_ptr); 435 tipc_node_link_down(l_ptr->owner, l_ptr);
434 tipc_bearer_remove_dest(l_ptr->bearer_id, l_ptr->addr); 436 tipc_bearer_remove_dest(owner->net, l_ptr->bearer_id, l_ptr->addr);
435 437
436 if (was_active_link && tipc_node_active_links(l_ptr->owner)) { 438 if (was_active_link && tipc_node_active_links(l_ptr->owner)) {
437 l_ptr->reset_checkpoint = checkpoint; 439 l_ptr->reset_checkpoint = checkpoint;
@@ -471,11 +473,14 @@ void tipc_link_reset_list(struct net *net, unsigned int bearer_id)
471 rcu_read_unlock(); 473 rcu_read_unlock();
472} 474}
473 475
474static void link_activate(struct tipc_link *l_ptr) 476static void link_activate(struct tipc_link *link)
475{ 477{
476 l_ptr->next_in_no = l_ptr->stats.recv_info = 1; 478 struct tipc_node *node = link->owner;
477 tipc_node_link_up(l_ptr->owner, l_ptr); 479
478 tipc_bearer_add_dest(l_ptr->bearer_id, l_ptr->addr); 480 link->next_in_no = 1;
481 link->stats.recv_info = 1;
482 tipc_node_link_up(node, link);
483 tipc_bearer_add_dest(node->net, link->bearer_id, link->addr);
479} 484}
480 485
481/** 486/**
@@ -707,7 +712,8 @@ drop:
707 * Only the socket functions tipc_send_stream() and tipc_send_packet() need 712 * Only the socket functions tipc_send_stream() and tipc_send_packet() need
708 * to act on the return value, since they may need to do more send attempts. 713 * to act on the return value, since they may need to do more send attempts.
709 */ 714 */
710int __tipc_link_xmit(struct tipc_link *link, struct sk_buff_head *list) 715int __tipc_link_xmit(struct net *net, struct tipc_link *link,
716 struct sk_buff_head *list)
711{ 717{
712 struct tipc_msg *msg = buf_msg(skb_peek(list)); 718 struct tipc_msg *msg = buf_msg(skb_peek(list));
713 uint psz = msg_size(msg); 719 uint psz = msg_size(msg);
@@ -740,7 +746,8 @@ int __tipc_link_xmit(struct tipc_link *link, struct sk_buff_head *list)
740 746
741 if (skb_queue_len(outqueue) < sndlim) { 747 if (skb_queue_len(outqueue) < sndlim) {
742 __skb_queue_tail(outqueue, skb); 748 __skb_queue_tail(outqueue, skb);
743 tipc_bearer_send(link->bearer_id, skb, addr); 749 tipc_bearer_send(net, link->bearer_id,
750 skb, addr);
744 link->next_out = NULL; 751 link->next_out = NULL;
745 link->unacked_window = 0; 752 link->unacked_window = 0;
746 } else if (tipc_msg_bundle(outqueue, skb, mtu)) { 753 } else if (tipc_msg_bundle(outqueue, skb, mtu)) {
@@ -774,7 +781,7 @@ static int __tipc_link_xmit_skb(struct tipc_link *link, struct sk_buff *skb)
774 struct sk_buff_head head; 781 struct sk_buff_head head;
775 782
776 skb2list(skb, &head); 783 skb2list(skb, &head);
777 return __tipc_link_xmit(link, &head); 784 return __tipc_link_xmit(link->owner->net, link, &head);
778} 785}
779 786
780int tipc_link_xmit_skb(struct net *net, struct sk_buff *skb, u32 dnode, 787int tipc_link_xmit_skb(struct net *net, struct sk_buff *skb, u32 dnode,
@@ -808,7 +815,7 @@ int tipc_link_xmit(struct net *net, struct sk_buff_head *list, u32 dnode,
808 tipc_node_lock(node); 815 tipc_node_lock(node);
809 link = node->active_links[selector & 1]; 816 link = node->active_links[selector & 1];
810 if (link) 817 if (link)
811 rc = __tipc_link_xmit(link, list); 818 rc = __tipc_link_xmit(net, link, list);
812 tipc_node_unlock(node); 819 tipc_node_unlock(node);
813 } 820 }
814 821
@@ -900,7 +907,8 @@ void tipc_link_push_packets(struct tipc_link *l_ptr)
900 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 907 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in);
901 if (msg_user(msg) == MSG_BUNDLER) 908 if (msg_user(msg) == MSG_BUNDLER)
902 TIPC_SKB_CB(skb)->bundling = false; 909 TIPC_SKB_CB(skb)->bundling = false;
903 tipc_bearer_send(l_ptr->bearer_id, skb, 910 tipc_bearer_send(l_ptr->owner->net,
911 l_ptr->bearer_id, skb,
904 &l_ptr->media_addr); 912 &l_ptr->media_addr);
905 l_ptr->next_out = tipc_skb_queue_next(outqueue, skb); 913 l_ptr->next_out = tipc_skb_queue_next(outqueue, skb);
906 } else { 914 } else {
@@ -997,7 +1005,8 @@ void tipc_link_retransmit(struct tipc_link *l_ptr, struct sk_buff *skb,
997 msg = buf_msg(skb); 1005 msg = buf_msg(skb);
998 msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); 1006 msg_set_ack(msg, mod(l_ptr->next_in_no - 1));
999 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 1007 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in);
1000 tipc_bearer_send(l_ptr->bearer_id, skb, &l_ptr->media_addr); 1008 tipc_bearer_send(l_ptr->owner->net, l_ptr->bearer_id, skb,
1009 &l_ptr->media_addr);
1001 retransmits--; 1010 retransmits--;
1002 l_ptr->stats.retransmitted++; 1011 l_ptr->stats.retransmitted++;
1003 } 1012 }
@@ -1459,7 +1468,8 @@ void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int probe_msg,
1459 skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg)); 1468 skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg));
1460 buf->priority = TC_PRIO_CONTROL; 1469 buf->priority = TC_PRIO_CONTROL;
1461 1470
1462 tipc_bearer_send(l_ptr->bearer_id, buf, &l_ptr->media_addr); 1471 tipc_bearer_send(l_ptr->owner->net, l_ptr->bearer_id, buf,
1472 &l_ptr->media_addr);
1463 l_ptr->unacked_window = 0; 1473 l_ptr->unacked_window = 0;
1464 kfree_skb(buf); 1474 kfree_skb(buf);
1465} 1475}
@@ -2037,7 +2047,7 @@ static int link_cmd_set_value(struct net *net, const char *name, u32 new_value,
2037 return res; 2047 return res;
2038 } 2048 }
2039 2049
2040 b_ptr = tipc_bearer_find(name); 2050 b_ptr = tipc_bearer_find(net, name);
2041 if (b_ptr) { 2051 if (b_ptr) {
2042 switch (cmd) { 2052 switch (cmd) {
2043 case TIPC_CMD_SET_LINK_TOL: 2053 case TIPC_CMD_SET_LINK_TOL:
@@ -2295,10 +2305,11 @@ struct sk_buff *tipc_link_cmd_show_stats(struct net *net,
2295 2305
2296static void link_print(struct tipc_link *l_ptr, const char *str) 2306static void link_print(struct tipc_link *l_ptr, const char *str)
2297{ 2307{
2308 struct tipc_net *tn = net_generic(l_ptr->owner->net, tipc_net_id);
2298 struct tipc_bearer *b_ptr; 2309 struct tipc_bearer *b_ptr;
2299 2310
2300 rcu_read_lock(); 2311 rcu_read_lock();
2301 b_ptr = rcu_dereference_rtnl(bearer_list[l_ptr->bearer_id]); 2312 b_ptr = rcu_dereference_rtnl(tn->bearer_list[l_ptr->bearer_id]);
2302 if (b_ptr) 2313 if (b_ptr)
2303 pr_info("%s Link %x<%s>:", str, l_ptr->addr, b_ptr->name); 2314 pr_info("%s Link %x<%s>:", str, l_ptr->addr, b_ptr->name);
2304 rcu_read_unlock(); 2315 rcu_read_unlock();
diff --git a/net/tipc/link.h b/net/tipc/link.h
index 380e27ee0f70..9df7fa4d3bdd 100644
--- a/net/tipc/link.h
+++ b/net/tipc/link.h
@@ -223,7 +223,8 @@ int tipc_link_xmit_skb(struct net *net, struct sk_buff *skb, u32 dest,
223 u32 selector); 223 u32 selector);
224int tipc_link_xmit(struct net *net, struct sk_buff_head *list, u32 dest, 224int tipc_link_xmit(struct net *net, struct sk_buff_head *list, u32 dest,
225 u32 selector); 225 u32 selector);
226int __tipc_link_xmit(struct tipc_link *link, struct sk_buff_head *list); 226int __tipc_link_xmit(struct net *net, struct tipc_link *link,
227 struct sk_buff_head *list);
227void tipc_link_bundle_rcv(struct net *net, struct sk_buff *buf); 228void tipc_link_bundle_rcv(struct net *net, struct sk_buff *buf);
228void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int prob, 229void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int prob,
229 u32 gap, u32 tolerance, u32 priority, u32 acked_mtu); 230 u32 gap, u32 tolerance, u32 priority, u32 acked_mtu);
diff --git a/net/tipc/net.c b/net/tipc/net.c
index de18aacf3d64..38633e5f8a7d 100644
--- a/net/tipc/net.c
+++ b/net/tipc/net.c
@@ -117,7 +117,7 @@ int tipc_net_start(struct net *net, u32 addr)
117 tipc_own_addr = addr; 117 tipc_own_addr = addr;
118 tipc_named_reinit(); 118 tipc_named_reinit();
119 tipc_sk_reinit(); 119 tipc_sk_reinit();
120 res = tipc_bclink_init(); 120 res = tipc_bclink_init(net);
121 if (res) 121 if (res)
122 return res; 122 return res;
123 123
@@ -140,7 +140,7 @@ void tipc_net_stop(struct net *net)
140 tipc_own_addr); 140 tipc_own_addr);
141 rtnl_lock(); 141 rtnl_lock();
142 tipc_bearer_stop(net); 142 tipc_bearer_stop(net);
143 tipc_bclink_stop(); 143 tipc_bclink_stop(net);
144 tipc_node_stop(net); 144 tipc_node_stop(net);
145 rtnl_unlock(); 145 rtnl_unlock();
146 146