|
@@ -985,6 +985,51 @@ int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector)
|
|
|
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,
|