diff options
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r-- | net/tipc/node.c | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index e01e2c71b5a1..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) |
@@ -378,14 +373,13 @@ static void tipc_node_calculate_timer(struct tipc_node *n, struct tipc_link *l) | |||
378 | { | 373 | { |
379 | unsigned long tol = tipc_link_tolerance(l); | 374 | unsigned long tol = tipc_link_tolerance(l); |
380 | unsigned long intv = ((tol / 4) > 500) ? 500 : tol / 4; | 375 | unsigned long intv = ((tol / 4) > 500) ? 500 : tol / 4; |
381 | unsigned long keepalive_intv = msecs_to_jiffies(intv); | ||
382 | 376 | ||
383 | /* Link with lowest tolerance determines timer interval */ | 377 | /* Link with lowest tolerance determines timer interval */ |
384 | if (keepalive_intv < n->keepalive_intv) | 378 | if (intv < n->keepalive_intv) |
385 | n->keepalive_intv = keepalive_intv; | 379 | n->keepalive_intv = intv; |
386 | 380 | ||
387 | /* Ensure link's abort limit corresponds to current interval */ | 381 | /* Ensure link's abort limit corresponds to current tolerance */ |
388 | tipc_link_set_abort_limit(l, tol / jiffies_to_msecs(n->keepalive_intv)); | 382 | tipc_link_set_abort_limit(l, tol / n->keepalive_intv); |
389 | } | 383 | } |
390 | 384 | ||
391 | static void tipc_node_delete(struct tipc_node *node) | 385 | static void tipc_node_delete(struct tipc_node *node) |
@@ -526,7 +520,7 @@ static void tipc_node_timeout(unsigned long data) | |||
526 | if (rc & TIPC_LINK_DOWN_EVT) | 520 | if (rc & TIPC_LINK_DOWN_EVT) |
527 | tipc_node_link_down(n, bearer_id, false); | 521 | tipc_node_link_down(n, bearer_id, false); |
528 | } | 522 | } |
529 | mod_timer(&n->timer, jiffies + n->keepalive_intv); | 523 | mod_timer(&n->timer, jiffies + msecs_to_jiffies(n->keepalive_intv)); |
530 | } | 524 | } |
531 | 525 | ||
532 | /** | 526 | /** |
@@ -692,6 +686,7 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) | |||
692 | struct tipc_link *l = le->link; | 686 | struct tipc_link *l = le->link; |
693 | struct tipc_media_addr *maddr; | 687 | struct tipc_media_addr *maddr; |
694 | struct sk_buff_head xmitq; | 688 | struct sk_buff_head xmitq; |
689 | int old_bearer_id = bearer_id; | ||
695 | 690 | ||
696 | if (!l) | 691 | if (!l) |
697 | return; | 692 | return; |
@@ -711,6 +706,8 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) | |||
711 | tipc_link_fsm_evt(l, LINK_RESET_EVT); | 706 | tipc_link_fsm_evt(l, LINK_RESET_EVT); |
712 | } | 707 | } |
713 | 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); | ||
714 | tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); | 711 | tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); |
715 | tipc_sk_rcv(n->net, &le->inputq); | 712 | tipc_sk_rcv(n->net, &le->inputq); |
716 | } | 713 | } |
@@ -735,6 +732,7 @@ void tipc_node_check_dest(struct net *net, u32 onode, | |||
735 | bool accept_addr = false; | 732 | bool accept_addr = false; |
736 | bool reset = true; | 733 | bool reset = true; |
737 | char *if_name; | 734 | char *if_name; |
735 | unsigned long intv; | ||
738 | 736 | ||
739 | *dupl_addr = false; | 737 | *dupl_addr = false; |
740 | *respond = false; | 738 | *respond = false; |
@@ -840,9 +838,11 @@ void tipc_node_check_dest(struct net *net, u32 onode, | |||
840 | le->link = l; | 838 | le->link = l; |
841 | n->link_cnt++; | 839 | n->link_cnt++; |
842 | tipc_node_calculate_timer(n, l); | 840 | tipc_node_calculate_timer(n, l); |
843 | if (n->link_cnt == 1) | 841 | if (n->link_cnt == 1) { |
844 | if (!mod_timer(&n->timer, jiffies + n->keepalive_intv)) | 842 | intv = jiffies + msecs_to_jiffies(n->keepalive_intv); |
843 | if (!mod_timer(&n->timer, intv)) | ||
845 | tipc_node_get(n); | 844 | tipc_node_get(n); |
845 | } | ||
846 | } | 846 | } |
847 | memcpy(&le->maddr, maddr, sizeof(*maddr)); | 847 | memcpy(&le->maddr, maddr, sizeof(*maddr)); |
848 | exit: | 848 | exit: |
@@ -950,7 +950,7 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) | |||
950 | state = SELF_UP_PEER_UP; | 950 | state = SELF_UP_PEER_UP; |
951 | break; | 951 | break; |
952 | case SELF_LOST_CONTACT_EVT: | 952 | case SELF_LOST_CONTACT_EVT: |
953 | state = SELF_DOWN_PEER_LEAVING; | 953 | state = SELF_DOWN_PEER_DOWN; |
954 | break; | 954 | break; |
955 | case SELF_ESTABL_CONTACT_EVT: | 955 | case SELF_ESTABL_CONTACT_EVT: |
956 | case PEER_LOST_CONTACT_EVT: | 956 | case PEER_LOST_CONTACT_EVT: |
@@ -969,7 +969,7 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) | |||
969 | state = SELF_UP_PEER_UP; | 969 | state = SELF_UP_PEER_UP; |
970 | break; | 970 | break; |
971 | case PEER_LOST_CONTACT_EVT: | 971 | case PEER_LOST_CONTACT_EVT: |
972 | state = SELF_LEAVING_PEER_DOWN; | 972 | state = SELF_DOWN_PEER_DOWN; |
973 | break; | 973 | break; |
974 | case SELF_LOST_CONTACT_EVT: | 974 | case SELF_LOST_CONTACT_EVT: |
975 | case PEER_ESTABL_CONTACT_EVT: | 975 | case PEER_ESTABL_CONTACT_EVT: |