diff options
Diffstat (limited to 'net/tipc')
-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 |