diff options
| -rw-r--r-- | net/tipc/node.c | 25 | ||||
| -rw-r--r-- | net/tipc/node.h | 17 |
2 files changed, 38 insertions, 4 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 5b44c3041be4..d959343043fd 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * net/tipc/node.c: TIPC node management routines | 2 | * net/tipc/node.c: TIPC node management routines |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2000-2006, 2012 Ericsson AB | 4 | * Copyright (c) 2000-2006, 2012-2014, Ericsson AB |
| 5 | * Copyright (c) 2005-2006, 2010-2014, Wind River Systems | 5 | * Copyright (c) 2005-2006, 2010-2014, Wind River Systems |
| 6 | * All rights reserved. | 6 | * All rights reserved. |
| 7 | * | 7 | * |
| @@ -155,21 +155,25 @@ void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr) | |||
| 155 | if (!active[0]) { | 155 | if (!active[0]) { |
| 156 | active[0] = active[1] = l_ptr; | 156 | active[0] = active[1] = l_ptr; |
| 157 | node_established_contact(n_ptr); | 157 | node_established_contact(n_ptr); |
| 158 | return; | 158 | goto exit; |
| 159 | } | 159 | } |
| 160 | if (l_ptr->priority < active[0]->priority) { | 160 | if (l_ptr->priority < active[0]->priority) { |
| 161 | pr_info("New link <%s> becomes standby\n", l_ptr->name); | 161 | pr_info("New link <%s> becomes standby\n", l_ptr->name); |
| 162 | return; | 162 | goto exit; |
| 163 | } | 163 | } |
| 164 | tipc_link_dup_queue_xmit(active[0], l_ptr); | 164 | tipc_link_dup_queue_xmit(active[0], l_ptr); |
| 165 | if (l_ptr->priority == active[0]->priority) { | 165 | if (l_ptr->priority == active[0]->priority) { |
| 166 | active[0] = l_ptr; | 166 | active[0] = l_ptr; |
| 167 | return; | 167 | goto exit; |
| 168 | } | 168 | } |
| 169 | pr_info("Old link <%s> becomes standby\n", active[0]->name); | 169 | pr_info("Old link <%s> becomes standby\n", active[0]->name); |
| 170 | if (active[1] != active[0]) | 170 | if (active[1] != active[0]) |
| 171 | pr_info("Old link <%s> becomes standby\n", active[1]->name); | 171 | pr_info("Old link <%s> becomes standby\n", active[1]->name); |
| 172 | active[0] = active[1] = l_ptr; | 172 | active[0] = active[1] = l_ptr; |
| 173 | exit: | ||
| 174 | /* Leave room for changeover header when returning 'mtu' to users: */ | ||
| 175 | n_ptr->act_mtus[0] = active[0]->max_pkt - INT_H_SIZE; | ||
| 176 | n_ptr->act_mtus[1] = active[1]->max_pkt - INT_H_SIZE; | ||
| 173 | } | 177 | } |
| 174 | 178 | ||
| 175 | /** | 179 | /** |
| @@ -229,6 +233,19 @@ void tipc_node_link_down(struct tipc_node *n_ptr, struct tipc_link *l_ptr) | |||
| 229 | tipc_link_failover_send_queue(l_ptr); | 233 | tipc_link_failover_send_queue(l_ptr); |
| 230 | else | 234 | else |
| 231 | node_lost_contact(n_ptr); | 235 | node_lost_contact(n_ptr); |
| 236 | |||
| 237 | /* Leave room for changeover header when returning 'mtu' to users: */ | ||
| 238 | if (active[0]) { | ||
| 239 | n_ptr->act_mtus[0] = active[0]->max_pkt - INT_H_SIZE; | ||
| 240 | n_ptr->act_mtus[1] = active[1]->max_pkt - INT_H_SIZE; | ||
| 241 | return; | ||
| 242 | } | ||
| 243 | |||
| 244 | /* Loopback link went down? No fragmentation needed from now on. */ | ||
| 245 | if (n_ptr->addr == tipc_own_addr) { | ||
| 246 | n_ptr->act_mtus[0] = MAX_MSG_SIZE; | ||
| 247 | n_ptr->act_mtus[1] = MAX_MSG_SIZE; | ||
| 248 | } | ||
| 232 | } | 249 | } |
| 233 | 250 | ||
| 234 | int tipc_node_active_links(struct tipc_node *n_ptr) | 251 | int tipc_node_active_links(struct tipc_node *n_ptr) |
diff --git a/net/tipc/node.h b/net/tipc/node.h index 9087063793f2..b61716a8218e 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include "addr.h" | 41 | #include "addr.h" |
| 42 | #include "net.h" | 42 | #include "net.h" |
| 43 | #include "bearer.h" | 43 | #include "bearer.h" |
| 44 | #include "msg.h" | ||
| 44 | 45 | ||
| 45 | /* | 46 | /* |
| 46 | * Out-of-range value for node signature | 47 | * Out-of-range value for node signature |
| @@ -105,6 +106,7 @@ struct tipc_node { | |||
| 105 | spinlock_t lock; | 106 | spinlock_t lock; |
| 106 | struct hlist_node hash; | 107 | struct hlist_node hash; |
| 107 | struct tipc_link *active_links[2]; | 108 | struct tipc_link *active_links[2]; |
| 109 | u32 act_mtus[2]; | ||
| 108 | struct tipc_link *links[MAX_BEARERS]; | 110 | struct tipc_link *links[MAX_BEARERS]; |
| 109 | unsigned int action_flags; | 111 | unsigned int action_flags; |
| 110 | struct tipc_node_bclink bclink; | 112 | struct tipc_node_bclink bclink; |
| @@ -143,4 +145,19 @@ static inline bool tipc_node_blocked(struct tipc_node *node) | |||
| 143 | TIPC_NOTIFY_NODE_DOWN | TIPC_WAIT_OWN_LINKS_DOWN)); | 145 | TIPC_NOTIFY_NODE_DOWN | TIPC_WAIT_OWN_LINKS_DOWN)); |
| 144 | } | 146 | } |
| 145 | 147 | ||
| 148 | static inline uint tipc_node_get_mtu(u32 addr, u32 selector) | ||
| 149 | { | ||
| 150 | struct tipc_node *node; | ||
| 151 | u32 mtu; | ||
| 152 | |||
| 153 | node = tipc_node_find(addr); | ||
| 154 | |||
| 155 | if (likely(node)) | ||
| 156 | mtu = node->act_mtus[selector & 1]; | ||
| 157 | else | ||
| 158 | mtu = MAX_MSG_SIZE; | ||
| 159 | |||
| 160 | return mtu; | ||
| 161 | } | ||
| 162 | |||
| 146 | #endif | 163 | #endif |
