return res;
 }
 
+/*
+ * tipc_link_send_names - send name table entries to new neighbor
+ *
+ * Send routine for bulk delivery of name table messages when contact
+ * with a new neighbor occurs. No link congestion checking is performed
+ * because name table messages *must* be delivered. The messages must be
+ * small enough not to require fragmentation.
+ * Called without any locks held.
+ */
+
+void tipc_link_send_names(struct list_head *message_list, u32 dest)
+{
+       struct tipc_node *n_ptr;
+       struct link *l_ptr;
+       struct sk_buff *buf;
+       struct sk_buff *temp_buf;
+
+       if (list_empty(message_list))
+               return;
+
+       read_lock_bh(&tipc_net_lock);
+       n_ptr = tipc_node_find(dest);
+       if (n_ptr) {
+               tipc_node_lock(n_ptr);
+               l_ptr = n_ptr->active_links[0];
+               if (l_ptr) {
+                       /* convert circular list to linear list */
+                       ((struct sk_buff *)message_list->prev)->next = NULL;
+                       link_add_chain_to_outqueue(l_ptr,
+                               (struct sk_buff *)message_list->next, 0);
+                       tipc_link_push_queue(l_ptr);
+                       INIT_LIST_HEAD(message_list);
+               }
+               tipc_node_unlock(n_ptr);
+       }
+       read_unlock_bh(&tipc_net_lock);
+
+       /* discard the messages if they couldn't be sent */
+
+       list_for_each_safe(buf, temp_buf, ((struct sk_buff *)message_list)) {
+               list_del((struct list_head *)buf);
+               buf_discard(buf);
+       }
+}
+
 /*
  * link_send_buf_fast: Entry for data messages where the
  * destination link is known and the header is complete,
 
 struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space);
 void tipc_link_reset(struct link *l_ptr);
 int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector);
+void tipc_link_send_names(struct list_head *message_list, u32 dest);
 int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf);
 u32 tipc_link_get_max_pkt(u32 dest, u32 selector);
 int tipc_link_send_sections_fast(struct tipc_port *sender,
 
        struct publication *publ;
        struct distr_item *item = NULL;
        struct sk_buff *buf = NULL;
+       struct list_head message_list;
        u32 node = (u32)nodearg;
        u32 left = 0;
        u32 rest;
        if (!max_item_buf)
                return;
 
+       /* create list of publication messages, then send them as a unit */
+
+       INIT_LIST_HEAD(&message_list);
+
        read_lock_bh(&tipc_nametbl_lock);
        rest = publ_cnt * ITEM_SIZE;
 
                item++;
                left -= ITEM_SIZE;
                if (!left) {
-                       msg_set_link_selector(buf_msg(buf), node);
-                       tipc_link_send(buf, node, node);
+                       list_add_tail((struct list_head *)buf, &message_list);
                        buf = NULL;
                }
        }
 exit:
        read_unlock_bh(&tipc_nametbl_lock);
+
+       tipc_link_send_names(&message_list, (u32)node);
 }
 
 /**