tipc: Prevent fragmented messages during initial name table exchange
authorAllan Stephens <allan.stephens@windriver.com>
Tue, 31 May 2011 15:05:02 +0000 (11:05 -0400)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Sun, 18 Sep 2011 02:55:08 +0000 (22:55 -0400)
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>
net/tipc/name_distr.c

index cd356e50433238f1a12aa8db2320e326daef3714..21bc0281ec8998051395795c45238eb257481ab5 100644 (file)
@@ -175,16 +175,32 @@ void tipc_named_withdraw(struct publication *publ)
 
 void tipc_named_node_up(unsigned long node)
 {
+       struct tipc_node *n_ptr;
+       struct link *l_ptr;
        struct publication *publ;
        struct distr_item *item = NULL;
        struct sk_buff *buf = NULL;
        u32 left = 0;
        u32 rest;
-       u32 max_item_buf;
+       u32 max_item_buf = 0;
+
+       /* compute maximum amount of publication data to send per message */
+
+       read_lock_bh(&tipc_net_lock);
+       n_ptr = tipc_node_find((u32)node);
+       if (n_ptr) {
+               tipc_node_lock(n_ptr);
+               l_ptr = n_ptr->active_links[0];
+               if (l_ptr)
+                       max_item_buf = ((l_ptr->max_pkt - INT_H_SIZE) /
+                               ITEM_SIZE) * ITEM_SIZE;
+               tipc_node_unlock(n_ptr);
+       }
+       read_unlock_bh(&tipc_net_lock);
+       if (!max_item_buf)
+               return;
 
        read_lock_bh(&tipc_nametbl_lock);
-       max_item_buf = TIPC_MAX_USER_MSG_SIZE / ITEM_SIZE;
-       max_item_buf *= ITEM_SIZE;
        rest = publ_cnt * ITEM_SIZE;
 
        list_for_each_entry(publ, &publ_root, local_list) {