diff options
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r-- | net/tipc/node.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 198dbc7adbe1..6cc1ae600820 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -157,7 +157,7 @@ static void tipc_node_timeout(unsigned long data); | |||
157 | static void tipc_node_fsm_evt(struct tipc_node *n, int evt); | 157 | static void tipc_node_fsm_evt(struct tipc_node *n, int evt); |
158 | static struct tipc_node *tipc_node_find(struct net *net, u32 addr); | 158 | static struct tipc_node *tipc_node_find(struct net *net, u32 addr); |
159 | static void tipc_node_put(struct tipc_node *node); | 159 | static void tipc_node_put(struct tipc_node *node); |
160 | static bool tipc_node_is_up(struct tipc_node *n); | 160 | static bool node_is_up(struct tipc_node *n); |
161 | 161 | ||
162 | struct tipc_sock_conn { | 162 | struct tipc_sock_conn { |
163 | u32 port; | 163 | u32 port; |
@@ -657,7 +657,7 @@ static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id, | |||
657 | *slot1 = i; | 657 | *slot1 = i; |
658 | } | 658 | } |
659 | 659 | ||
660 | if (!tipc_node_is_up(n)) { | 660 | if (!node_is_up(n)) { |
661 | if (tipc_link_peer_is_down(l)) | 661 | if (tipc_link_peer_is_down(l)) |
662 | tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT); | 662 | tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT); |
663 | tipc_node_fsm_evt(n, SELF_LOST_CONTACT_EVT); | 663 | tipc_node_fsm_evt(n, SELF_LOST_CONTACT_EVT); |
@@ -717,11 +717,27 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) | |||
717 | tipc_sk_rcv(n->net, &le->inputq); | 717 | tipc_sk_rcv(n->net, &le->inputq); |
718 | } | 718 | } |
719 | 719 | ||
720 | static bool tipc_node_is_up(struct tipc_node *n) | 720 | static bool node_is_up(struct tipc_node *n) |
721 | { | 721 | { |
722 | return n->active_links[0] != INVALID_BEARER_ID; | 722 | return n->active_links[0] != INVALID_BEARER_ID; |
723 | } | 723 | } |
724 | 724 | ||
725 | bool tipc_node_is_up(struct net *net, u32 addr) | ||
726 | { | ||
727 | struct tipc_node *n; | ||
728 | bool retval = false; | ||
729 | |||
730 | if (in_own_node(net, addr)) | ||
731 | return true; | ||
732 | |||
733 | n = tipc_node_find(net, addr); | ||
734 | if (!n) | ||
735 | return false; | ||
736 | retval = node_is_up(n); | ||
737 | tipc_node_put(n); | ||
738 | return retval; | ||
739 | } | ||
740 | |||
725 | void tipc_node_check_dest(struct net *net, u32 onode, | 741 | void tipc_node_check_dest(struct net *net, u32 onode, |
726 | struct tipc_bearer *b, | 742 | struct tipc_bearer *b, |
727 | u16 capabilities, u32 signature, | 743 | u16 capabilities, u32 signature, |
@@ -1149,7 +1165,7 @@ static int __tipc_nl_add_node(struct tipc_nl_msg *msg, struct tipc_node *node) | |||
1149 | 1165 | ||
1150 | if (nla_put_u32(msg->skb, TIPC_NLA_NODE_ADDR, node->addr)) | 1166 | if (nla_put_u32(msg->skb, TIPC_NLA_NODE_ADDR, node->addr)) |
1151 | goto attr_msg_full; | 1167 | goto attr_msg_full; |
1152 | if (tipc_node_is_up(node)) | 1168 | if (node_is_up(node)) |
1153 | if (nla_put_flag(msg->skb, TIPC_NLA_NODE_UP)) | 1169 | if (nla_put_flag(msg->skb, TIPC_NLA_NODE_UP)) |
1154 | goto attr_msg_full; | 1170 | goto attr_msg_full; |
1155 | 1171 | ||
@@ -1249,7 +1265,7 @@ void tipc_node_broadcast(struct net *net, struct sk_buff *skb) | |||
1249 | dst = n->addr; | 1265 | dst = n->addr; |
1250 | if (in_own_node(net, dst)) | 1266 | if (in_own_node(net, dst)) |
1251 | continue; | 1267 | continue; |
1252 | if (!tipc_node_is_up(n)) | 1268 | if (!node_is_up(n)) |
1253 | continue; | 1269 | continue; |
1254 | txskb = pskb_copy(skb, GFP_ATOMIC); | 1270 | txskb = pskb_copy(skb, GFP_ATOMIC); |
1255 | if (!txskb) | 1271 | if (!txskb) |