aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/tipc/Makefile4
-rw-r--r--net/tipc/name_distr.c52
-rw-r--r--net/tipc/name_distr.h1
-rw-r--r--net/tipc/name_table.c2
-rw-r--r--net/tipc/name_table.h6
-rw-r--r--net/tipc/node.c6
-rw-r--r--net/tipc/node.h5
-rw-r--r--net/tipc/node_subscr.c96
-rw-r--r--net/tipc/node_subscr.h63
9 files changed, 56 insertions, 179 deletions
diff --git a/net/tipc/Makefile b/net/tipc/Makefile
index b8a13caad59a..333e4592772c 100644
--- a/net/tipc/Makefile
+++ b/net/tipc/Makefile
@@ -7,8 +7,8 @@ obj-$(CONFIG_TIPC) := tipc.o
7tipc-y += addr.o bcast.o bearer.o config.o \ 7tipc-y += addr.o bcast.o bearer.o config.o \
8 core.o link.o discover.o msg.o \ 8 core.o link.o discover.o msg.o \
9 name_distr.o subscr.o name_table.o net.o \ 9 name_distr.o subscr.o name_table.o net.o \
10 netlink.o node.o node_subscr.o \ 10 netlink.o node.o socket.o log.o eth_media.o \
11 socket.o log.o eth_media.o server.o 11 server.o
12 12
13tipc-$(CONFIG_TIPC_MEDIA_IB) += ib_media.o 13tipc-$(CONFIG_TIPC_MEDIA_IB) += ib_media.o
14tipc-$(CONFIG_SYSCTL) += sysctl.o 14tipc-$(CONFIG_SYSCTL) += sysctl.o
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c
index 376d2bb51d8d..6c2638d3c659 100644
--- a/net/tipc/name_distr.c
+++ b/net/tipc/name_distr.c
@@ -250,13 +250,45 @@ void tipc_named_node_up(u32 dnode)
250 tipc_link_xmit(buf_chain, dnode, dnode); 250 tipc_link_xmit(buf_chain, dnode, dnode);
251} 251}
252 252
253static void tipc_publ_subscribe(struct publication *publ, u32 addr)
254{
255 struct tipc_node *node;
256
257 if (in_own_node(addr))
258 return;
259
260 node = tipc_node_find(addr);
261 if (!node) {
262 pr_warn("Node subscription rejected, unknown node 0x%x\n",
263 addr);
264 return;
265 }
266
267 tipc_node_lock(node);
268 list_add_tail(&publ->nodesub_list, &node->publ_list);
269 tipc_node_unlock(node);
270}
271
272static void tipc_publ_unsubscribe(struct publication *publ, u32 addr)
273{
274 struct tipc_node *node;
275
276 node = tipc_node_find(addr);
277 if (!node)
278 return;
279
280 tipc_node_lock(node);
281 list_del_init(&publ->nodesub_list);
282 tipc_node_unlock(node);
283}
284
253/** 285/**
254 * named_purge_publ - remove publication associated with a failed node 286 * tipc_publ_purge - remove publication associated with a failed node
255 * 287 *
256 * Invoked for each publication issued by a newly failed node. 288 * Invoked for each publication issued by a newly failed node.
257 * Removes publication structure from name table & deletes it. 289 * Removes publication structure from name table & deletes it.
258 */ 290 */
259static void named_purge_publ(struct publication *publ) 291static void tipc_publ_purge(struct publication *publ, u32 addr)
260{ 292{
261 struct publication *p; 293 struct publication *p;
262 294
@@ -264,7 +296,7 @@ static void named_purge_publ(struct publication *publ)
264 p = tipc_nametbl_remove_publ(publ->type, publ->lower, 296 p = tipc_nametbl_remove_publ(publ->type, publ->lower,
265 publ->node, publ->ref, publ->key); 297 publ->node, publ->ref, publ->key);
266 if (p) 298 if (p)
267 tipc_nodesub_unsubscribe(&p->subscr); 299 tipc_publ_unsubscribe(p, addr);
268 write_unlock_bh(&tipc_nametbl_lock); 300 write_unlock_bh(&tipc_nametbl_lock);
269 301
270 if (p != publ) { 302 if (p != publ) {
@@ -277,6 +309,14 @@ static void named_purge_publ(struct publication *publ)
277 kfree(p); 309 kfree(p);
278} 310}
279 311
312void tipc_publ_notify(struct list_head *nsub_list, u32 addr)
313{
314 struct publication *publ, *tmp;
315
316 list_for_each_entry_safe(publ, tmp, nsub_list, nodesub_list)
317 tipc_publ_purge(publ, addr);
318}
319
280/** 320/**
281 * tipc_update_nametbl - try to process a nametable update and notify 321 * tipc_update_nametbl - try to process a nametable update and notify
282 * subscribers 322 * subscribers
@@ -294,9 +334,7 @@ static bool tipc_update_nametbl(struct distr_item *i, u32 node, u32 dtype)
294 TIPC_CLUSTER_SCOPE, node, 334 TIPC_CLUSTER_SCOPE, node,
295 ntohl(i->ref), ntohl(i->key)); 335 ntohl(i->ref), ntohl(i->key));
296 if (publ) { 336 if (publ) {
297 tipc_nodesub_subscribe(&publ->subscr, node, publ, 337 tipc_publ_subscribe(publ, node);
298 (net_ev_handler)
299 named_purge_publ);
300 return true; 338 return true;
301 } 339 }
302 } else if (dtype == WITHDRAWAL) { 340 } else if (dtype == WITHDRAWAL) {
@@ -304,7 +342,7 @@ static bool tipc_update_nametbl(struct distr_item *i, u32 node, u32 dtype)
304 node, ntohl(i->ref), 342 node, ntohl(i->ref),
305 ntohl(i->key)); 343 ntohl(i->key));
306 if (publ) { 344 if (publ) {
307 tipc_nodesub_unsubscribe(&publ->subscr); 345 tipc_publ_unsubscribe(publ, node);
308 kfree(publ); 346 kfree(publ);
309 return true; 347 return true;
310 } 348 }
diff --git a/net/tipc/name_distr.h b/net/tipc/name_distr.h
index b9e75feb3434..cef55cedcfb2 100644
--- a/net/tipc/name_distr.h
+++ b/net/tipc/name_distr.h
@@ -74,5 +74,6 @@ void tipc_named_node_up(u32 dnode);
74void tipc_named_rcv(struct sk_buff *buf); 74void tipc_named_rcv(struct sk_buff *buf);
75void tipc_named_reinit(void); 75void tipc_named_reinit(void);
76void tipc_named_process_backlog(void); 76void tipc_named_process_backlog(void);
77void tipc_publ_notify(struct list_head *nsub_list, u32 addr);
77 78
78#endif 79#endif
diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
index 7cfb7a4aa58f..772be1cd8bf6 100644
--- a/net/tipc/name_table.c
+++ b/net/tipc/name_table.c
@@ -144,7 +144,7 @@ static struct publication *publ_create(u32 type, u32 lower, u32 upper,
144 publ->key = key; 144 publ->key = key;
145 INIT_LIST_HEAD(&publ->local_list); 145 INIT_LIST_HEAD(&publ->local_list);
146 INIT_LIST_HEAD(&publ->pport_list); 146 INIT_LIST_HEAD(&publ->pport_list);
147 INIT_LIST_HEAD(&publ->subscr.nodesub_list); 147 INIT_LIST_HEAD(&publ->nodesub_list);
148 return publ; 148 return publ;
149} 149}
150 150
diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h
index b38ebecac766..c62877826655 100644
--- a/net/tipc/name_table.h
+++ b/net/tipc/name_table.h
@@ -37,8 +37,6 @@
37#ifndef _TIPC_NAME_TABLE_H 37#ifndef _TIPC_NAME_TABLE_H
38#define _TIPC_NAME_TABLE_H 38#define _TIPC_NAME_TABLE_H
39 39
40#include "node_subscr.h"
41
42struct tipc_subscription; 40struct tipc_subscription;
43struct tipc_port_list; 41struct tipc_port_list;
44 42
@@ -56,7 +54,7 @@ struct tipc_port_list;
56 * @node: network address of publishing port's node 54 * @node: network address of publishing port's node
57 * @ref: publishing port 55 * @ref: publishing port
58 * @key: publication key 56 * @key: publication key
59 * @subscr: subscription to "node down" event (for off-node publications only) 57 * @nodesub_list: subscription to "node down" event (off-node publication only)
60 * @local_list: adjacent entries in list of publications made by this node 58 * @local_list: adjacent entries in list of publications made by this node
61 * @pport_list: adjacent entries in list of publications made by this port 59 * @pport_list: adjacent entries in list of publications made by this port
62 * @node_list: adjacent matching name seq publications with >= node scope 60 * @node_list: adjacent matching name seq publications with >= node scope
@@ -73,7 +71,7 @@ struct publication {
73 u32 node; 71 u32 node;
74 u32 ref; 72 u32 ref;
75 u32 key; 73 u32 key;
76 struct tipc_node_subscr subscr; 74 struct list_head nodesub_list;
77 struct list_head local_list; 75 struct list_head local_list;
78 struct list_head pport_list; 76 struct list_head pport_list;
79 struct list_head node_list; 77 struct list_head node_list;
diff --git a/net/tipc/node.c b/net/tipc/node.c
index 82e5edddc376..17b8092f9c40 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -113,7 +113,7 @@ struct tipc_node *tipc_node_create(u32 addr)
113 spin_lock_init(&n_ptr->lock); 113 spin_lock_init(&n_ptr->lock);
114 INIT_HLIST_NODE(&n_ptr->hash); 114 INIT_HLIST_NODE(&n_ptr->hash);
115 INIT_LIST_HEAD(&n_ptr->list); 115 INIT_LIST_HEAD(&n_ptr->list);
116 INIT_LIST_HEAD(&n_ptr->nsub); 116 INIT_LIST_HEAD(&n_ptr->publ_list);
117 INIT_LIST_HEAD(&n_ptr->conn_sks); 117 INIT_LIST_HEAD(&n_ptr->conn_sks);
118 __skb_queue_head_init(&n_ptr->waiting_sks); 118 __skb_queue_head_init(&n_ptr->waiting_sks);
119 119
@@ -574,7 +574,7 @@ void tipc_node_unlock(struct tipc_node *node)
574 skb_queue_splice_init(&node->waiting_sks, &waiting_sks); 574 skb_queue_splice_init(&node->waiting_sks, &waiting_sks);
575 575
576 if (flags & TIPC_NOTIFY_NODE_DOWN) { 576 if (flags & TIPC_NOTIFY_NODE_DOWN) {
577 list_replace_init(&node->nsub, &nsub_list); 577 list_replace_init(&node->publ_list, &nsub_list);
578 list_replace_init(&node->conn_sks, &conn_sks); 578 list_replace_init(&node->conn_sks, &conn_sks);
579 } 579 }
580 node->action_flags &= ~(TIPC_WAKEUP_USERS | TIPC_NOTIFY_NODE_DOWN | 580 node->action_flags &= ~(TIPC_WAKEUP_USERS | TIPC_NOTIFY_NODE_DOWN |
@@ -591,7 +591,7 @@ void tipc_node_unlock(struct tipc_node *node)
591 tipc_node_abort_sock_conns(&conn_sks); 591 tipc_node_abort_sock_conns(&conn_sks);
592 592
593 if (!list_empty(&nsub_list)) 593 if (!list_empty(&nsub_list))
594 tipc_nodesub_notify(&nsub_list); 594 tipc_publ_notify(&nsub_list, addr);
595 595
596 if (flags & TIPC_WAKEUP_BCAST_USERS) 596 if (flags & TIPC_WAKEUP_BCAST_USERS)
597 tipc_bclink_wakeup_users(); 597 tipc_bclink_wakeup_users();
diff --git a/net/tipc/node.h b/net/tipc/node.h
index 005fbcef3212..f1994511f033 100644
--- a/net/tipc/node.h
+++ b/net/tipc/node.h
@@ -37,7 +37,6 @@
37#ifndef _TIPC_NODE_H 37#ifndef _TIPC_NODE_H
38#define _TIPC_NODE_H 38#define _TIPC_NODE_H
39 39
40#include "node_subscr.h"
41#include "addr.h" 40#include "addr.h"
42#include "net.h" 41#include "net.h"
43#include "bearer.h" 42#include "bearer.h"
@@ -104,7 +103,7 @@ struct tipc_node_bclink {
104 * @link_cnt: number of links to node 103 * @link_cnt: number of links to node
105 * @signature: node instance identifier 104 * @signature: node instance identifier
106 * @link_id: local and remote bearer ids of changing link, if any 105 * @link_id: local and remote bearer ids of changing link, if any
107 * @nsub: list of "node down" subscriptions monitoring node 106 * @publ_list: list of publications
108 * @rcu: rcu struct for tipc_node 107 * @rcu: rcu struct for tipc_node
109 */ 108 */
110struct tipc_node { 109struct tipc_node {
@@ -121,7 +120,7 @@ struct tipc_node {
121 int working_links; 120 int working_links;
122 u32 signature; 121 u32 signature;
123 u32 link_id; 122 u32 link_id;
124 struct list_head nsub; 123 struct list_head publ_list;
125 struct sk_buff_head waiting_sks; 124 struct sk_buff_head waiting_sks;
126 struct list_head conn_sks; 125 struct list_head conn_sks;
127 struct rcu_head rcu; 126 struct rcu_head rcu;
diff --git a/net/tipc/node_subscr.c b/net/tipc/node_subscr.c
deleted file mode 100644
index 2d13eea8574a..000000000000
--- a/net/tipc/node_subscr.c
+++ /dev/null
@@ -1,96 +0,0 @@
1/*
2 * net/tipc/node_subscr.c: TIPC "node down" subscription handling
3 *
4 * Copyright (c) 1995-2006, Ericsson AB
5 * Copyright (c) 2005, 2010-2011, Wind River Systems
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the names of the copyright holders nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * Alternatively, this software may be distributed under the terms of the
21 * GNU General Public License ("GPL") version 2 as published by the Free
22 * Software Foundation.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#include "core.h"
38#include "node_subscr.h"
39#include "node.h"
40
41/**
42 * tipc_nodesub_subscribe - create "node down" subscription for specified node
43 */
44void tipc_nodesub_subscribe(struct tipc_node_subscr *node_sub, u32 addr,
45 void *usr_handle, net_ev_handler handle_down)
46{
47 if (in_own_node(addr)) {
48 node_sub->node = NULL;
49 return;
50 }
51
52 node_sub->node = tipc_node_find(addr);
53 if (!node_sub->node) {
54 pr_warn("Node subscription rejected, unknown node 0x%x\n",
55 addr);
56 return;
57 }
58 node_sub->handle_node_down = handle_down;
59 node_sub->usr_handle = usr_handle;
60
61 tipc_node_lock(node_sub->node);
62 list_add_tail(&node_sub->nodesub_list, &node_sub->node->nsub);
63 tipc_node_unlock(node_sub->node);
64}
65
66/**
67 * tipc_nodesub_unsubscribe - cancel "node down" subscription (if any)
68 */
69void tipc_nodesub_unsubscribe(struct tipc_node_subscr *node_sub)
70{
71 if (!node_sub->node)
72 return;
73
74 tipc_node_lock(node_sub->node);
75 list_del_init(&node_sub->nodesub_list);
76 tipc_node_unlock(node_sub->node);
77}
78
79/**
80 * tipc_nodesub_notify - notify subscribers that a node is unreachable
81 *
82 * Note: node is locked by caller
83 */
84void tipc_nodesub_notify(struct list_head *nsub_list)
85{
86 struct tipc_node_subscr *ns, *safe;
87 net_ev_handler handle_node_down;
88
89 list_for_each_entry_safe(ns, safe, nsub_list, nodesub_list) {
90 handle_node_down = ns->handle_node_down;
91 if (handle_node_down) {
92 ns->handle_node_down = NULL;
93 handle_node_down(ns->usr_handle);
94 }
95 }
96}
diff --git a/net/tipc/node_subscr.h b/net/tipc/node_subscr.h
deleted file mode 100644
index d91b8cc81e3d..000000000000
--- a/net/tipc/node_subscr.h
+++ /dev/null
@@ -1,63 +0,0 @@
1/*
2 * net/tipc/node_subscr.h: Include file for TIPC "node down" subscription handling
3 *
4 * Copyright (c) 1995-2006, Ericsson AB
5 * Copyright (c) 2005, 2010-2011, Wind River Systems
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the names of the copyright holders nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * Alternatively, this software may be distributed under the terms of the
21 * GNU General Public License ("GPL") version 2 as published by the Free
22 * Software Foundation.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#ifndef _TIPC_NODE_SUBSCR_H
38#define _TIPC_NODE_SUBSCR_H
39
40#include "addr.h"
41
42typedef void (*net_ev_handler) (void *usr_handle);
43
44/**
45 * struct tipc_node_subscr - "node down" subscription entry
46 * @node: ptr to node structure of interest (or NULL, if none)
47 * @handle_node_down: routine to invoke when node fails
48 * @usr_handle: argument to pass to routine when node fails
49 * @nodesub_list: adjacent entries in list of subscriptions for the node
50 */
51struct tipc_node_subscr {
52 struct tipc_node *node;
53 net_ev_handler handle_node_down;
54 void *usr_handle;
55 struct list_head nodesub_list;
56};
57
58void tipc_nodesub_subscribe(struct tipc_node_subscr *node_sub, u32 addr,
59 void *usr_handle, net_ev_handler handle_down);
60void tipc_nodesub_unsubscribe(struct tipc_node_subscr *node_sub);
61void tipc_nodesub_notify(struct list_head *nsub_list);
62
63#endif