aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2011-05-31 11:05:02 -0400
committerPaul Gortmaker <paul.gortmaker@windriver.com>2011-09-17 22:55:08 -0400
commit149ce37c8de72c64fc4f66c1b4cf7a0fb66b7ee9 (patch)
treecf24c93dac6f3c506aa2f4aafe80973e40ea70ce /net/tipc
parent909234cdd2b5954374e346c105b648f6c2800f55 (diff)
tipc: Prevent fragmented messages during initial name table exchange
Reduces the maximum size of messages sent during the initial exchange of name table information between two nodes to be no larger than the MTU of the first link established between the nodes. This ensures that messages will never need to be fragmented, which would add unnecessary overhead to the name table synchronization mechanism. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/name_distr.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c
index cd356e504332..21bc0281ec89 100644
--- a/net/tipc/name_distr.c
+++ b/net/tipc/name_distr.c
@@ -175,16 +175,32 @@ void tipc_named_withdraw(struct publication *publ)
175 175
176void tipc_named_node_up(unsigned long node) 176void tipc_named_node_up(unsigned long node)
177{ 177{
178 struct tipc_node *n_ptr;
179 struct link *l_ptr;
178 struct publication *publ; 180 struct publication *publ;
179 struct distr_item *item = NULL; 181 struct distr_item *item = NULL;
180 struct sk_buff *buf = NULL; 182 struct sk_buff *buf = NULL;
181 u32 left = 0; 183 u32 left = 0;
182 u32 rest; 184 u32 rest;
183 u32 max_item_buf; 185 u32 max_item_buf = 0;
186
187 /* compute maximum amount of publication data to send per message */
188
189 read_lock_bh(&tipc_net_lock);
190 n_ptr = tipc_node_find((u32)node);
191 if (n_ptr) {
192 tipc_node_lock(n_ptr);
193 l_ptr = n_ptr->active_links[0];
194 if (l_ptr)
195 max_item_buf = ((l_ptr->max_pkt - INT_H_SIZE) /
196 ITEM_SIZE) * ITEM_SIZE;
197 tipc_node_unlock(n_ptr);
198 }
199 read_unlock_bh(&tipc_net_lock);
200 if (!max_item_buf)
201 return;
184 202
185 read_lock_bh(&tipc_nametbl_lock); 203 read_lock_bh(&tipc_nametbl_lock);
186 max_item_buf = TIPC_MAX_USER_MSG_SIZE / ITEM_SIZE;
187 max_item_buf *= ITEM_SIZE;
188 rest = publ_cnt * ITEM_SIZE; 204 rest = publ_cnt * ITEM_SIZE;
189 205
190 list_for_each_entry(publ, &publ_root, local_list) { 206 list_for_each_entry(publ, &publ_root, local_list) {