Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 266119
b: refs/heads/master
c: 9aa88c2
h: refs/heads/master
i:
  266117: b2a4463
  266115: e421575
  266111: a76b342
v: v3
  • Loading branch information
Allan Stephens authored and Paul Gortmaker committed Sep 18, 2011
1 parent a1205e6 commit d4f5d2e
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1c553bb52eb4c58333a843c0a5888d2329909f62
refs/heads/master: 9aa88c2a509e11e6efc466c88b386e0e01bef731
45 changes: 45 additions & 0 deletions trunk/net/tipc/link.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions trunk/net/tipc/link.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_s
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,
Expand Down
10 changes: 8 additions & 2 deletions trunk/net/tipc/name_distr.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ void tipc_named_node_up(unsigned long nodearg)
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;
Expand All @@ -201,6 +202,10 @@ void tipc_named_node_up(unsigned long nodearg)
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;

Expand All @@ -219,13 +224,14 @@ void tipc_named_node_up(unsigned long nodearg)
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);
}

/**
Expand Down

0 comments on commit d4f5d2e

Please sign in to comment.