diff options
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r-- | net/tipc/node.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index d6a490f991a4..a3fc0a3f4077 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include "name_distr.h" | 40 | #include "name_distr.h" |
41 | #include "socket.h" | 41 | #include "socket.h" |
42 | #include "bcast.h" | 42 | #include "bcast.h" |
43 | #include "monitor.h" | ||
43 | #include "discover.h" | 44 | #include "discover.h" |
44 | #include "netlink.h" | 45 | #include "netlink.h" |
45 | 46 | ||
@@ -205,17 +206,6 @@ u16 tipc_node_get_capabilities(struct net *net, u32 addr) | |||
205 | return caps; | 206 | return caps; |
206 | } | 207 | } |
207 | 208 | ||
208 | /* | ||
209 | * A trivial power-of-two bitmask technique is used for speed, since this | ||
210 | * operation is done for every incoming TIPC packet. The number of hash table | ||
211 | * entries has been chosen so that no hash chain exceeds 8 nodes and will | ||
212 | * usually be much smaller (typically only a single node). | ||
213 | */ | ||
214 | static unsigned int tipc_hashfn(u32 addr) | ||
215 | { | ||
216 | return addr & (NODE_HTABLE_SIZE - 1); | ||
217 | } | ||
218 | |||
219 | static void tipc_node_kref_release(struct kref *kref) | 209 | static void tipc_node_kref_release(struct kref *kref) |
220 | { | 210 | { |
221 | struct tipc_node *n = container_of(kref, struct tipc_node, kref); | 211 | struct tipc_node *n = container_of(kref, struct tipc_node, kref); |
@@ -279,6 +269,7 @@ static void tipc_node_write_unlock(struct tipc_node *n) | |||
279 | u32 addr = 0; | 269 | u32 addr = 0; |
280 | u32 flags = n->action_flags; | 270 | u32 flags = n->action_flags; |
281 | u32 link_id = 0; | 271 | u32 link_id = 0; |
272 | u32 bearer_id; | ||
282 | struct list_head *publ_list; | 273 | struct list_head *publ_list; |
283 | 274 | ||
284 | if (likely(!flags)) { | 275 | if (likely(!flags)) { |
@@ -288,6 +279,7 @@ static void tipc_node_write_unlock(struct tipc_node *n) | |||
288 | 279 | ||
289 | addr = n->addr; | 280 | addr = n->addr; |
290 | link_id = n->link_id; | 281 | link_id = n->link_id; |
282 | bearer_id = link_id & 0xffff; | ||
291 | publ_list = &n->publ_list; | 283 | publ_list = &n->publ_list; |
292 | 284 | ||
293 | n->action_flags &= ~(TIPC_NOTIFY_NODE_DOWN | TIPC_NOTIFY_NODE_UP | | 285 | n->action_flags &= ~(TIPC_NOTIFY_NODE_DOWN | TIPC_NOTIFY_NODE_UP | |
@@ -301,13 +293,16 @@ static void tipc_node_write_unlock(struct tipc_node *n) | |||
301 | if (flags & TIPC_NOTIFY_NODE_UP) | 293 | if (flags & TIPC_NOTIFY_NODE_UP) |
302 | tipc_named_node_up(net, addr); | 294 | tipc_named_node_up(net, addr); |
303 | 295 | ||
304 | if (flags & TIPC_NOTIFY_LINK_UP) | 296 | if (flags & TIPC_NOTIFY_LINK_UP) { |
297 | tipc_mon_peer_up(net, addr, bearer_id); | ||
305 | tipc_nametbl_publish(net, TIPC_LINK_STATE, addr, addr, | 298 | tipc_nametbl_publish(net, TIPC_LINK_STATE, addr, addr, |
306 | TIPC_NODE_SCOPE, link_id, addr); | 299 | TIPC_NODE_SCOPE, link_id, addr); |
307 | 300 | } | |
308 | if (flags & TIPC_NOTIFY_LINK_DOWN) | 301 | if (flags & TIPC_NOTIFY_LINK_DOWN) { |
302 | tipc_mon_peer_down(net, addr, bearer_id); | ||
309 | tipc_nametbl_withdraw(net, TIPC_LINK_STATE, addr, | 303 | tipc_nametbl_withdraw(net, TIPC_LINK_STATE, addr, |
310 | link_id, addr); | 304 | link_id, addr); |
305 | } | ||
311 | } | 306 | } |
312 | 307 | ||
313 | struct tipc_node *tipc_node_create(struct net *net, u32 addr, u16 capabilities) | 308 | struct tipc_node *tipc_node_create(struct net *net, u32 addr, u16 capabilities) |
@@ -691,6 +686,7 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) | |||
691 | struct tipc_link *l = le->link; | 686 | struct tipc_link *l = le->link; |
692 | struct tipc_media_addr *maddr; | 687 | struct tipc_media_addr *maddr; |
693 | struct sk_buff_head xmitq; | 688 | struct sk_buff_head xmitq; |
689 | int old_bearer_id = bearer_id; | ||
694 | 690 | ||
695 | if (!l) | 691 | if (!l) |
696 | return; | 692 | return; |
@@ -710,6 +706,8 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) | |||
710 | tipc_link_fsm_evt(l, LINK_RESET_EVT); | 706 | tipc_link_fsm_evt(l, LINK_RESET_EVT); |
711 | } | 707 | } |
712 | tipc_node_write_unlock(n); | 708 | tipc_node_write_unlock(n); |
709 | if (delete) | ||
710 | tipc_mon_remove_peer(n->net, n->addr, old_bearer_id); | ||
713 | tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); | 711 | tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); |
714 | tipc_sk_rcv(n->net, &le->inputq); | 712 | tipc_sk_rcv(n->net, &le->inputq); |
715 | } | 713 | } |