|
@@ -637,6 +637,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf, struct tipc_bearer *unused1,
|
|
|
struct tipc_media_addr *unused2)
|
|
|
{
|
|
|
int bp_index;
|
|
|
+ struct tipc_msg *msg = buf_msg(buf);
|
|
|
|
|
|
/* Prepare broadcast link message for reliable transmission,
|
|
|
* if first time trying to send it;
|
|
@@ -644,10 +645,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf, struct tipc_bearer *unused1,
|
|
|
* since they are sent in an unreliable manner and don't need it
|
|
|
*/
|
|
|
if (likely(!msg_non_seq(buf_msg(buf)))) {
|
|
|
- struct tipc_msg *msg;
|
|
|
-
|
|
|
bcbuf_set_acks(buf, bclink->bcast_nodes.count);
|
|
|
- msg = buf_msg(buf);
|
|
|
msg_set_non_seq(msg, 1);
|
|
|
msg_set_mc_netid(msg, tipc_net_id);
|
|
|
bcl->stats.sent_info++;
|
|
@@ -664,12 +662,14 @@ static int tipc_bcbearer_send(struct sk_buff *buf, struct tipc_bearer *unused1,
|
|
|
for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) {
|
|
|
struct tipc_bearer *p = bcbearer->bpairs[bp_index].primary;
|
|
|
struct tipc_bearer *s = bcbearer->bpairs[bp_index].secondary;
|
|
|
- struct tipc_bearer *b = p;
|
|
|
+ struct tipc_bearer *bp[2] = {p, s};
|
|
|
+ struct tipc_bearer *b = bp[msg_link_selector(msg)];
|
|
|
struct sk_buff *tbuf;
|
|
|
|
|
|
if (!p)
|
|
|
break; /* No more bearers to try */
|
|
|
-
|
|
|
+ if (!b)
|
|
|
+ b = p;
|
|
|
tipc_nmap_diff(&bcbearer->remains, &b->nodes,
|
|
|
&bcbearer->remains_new);
|
|
|
if (bcbearer->remains_new.count == bcbearer->remains.count)
|
|
@@ -686,13 +686,6 @@ static int tipc_bcbearer_send(struct sk_buff *buf, struct tipc_bearer *unused1,
|
|
|
tipc_bearer_send(b->identity, tbuf, &b->bcast_addr);
|
|
|
kfree_skb(tbuf); /* Bearer keeps a clone */
|
|
|
}
|
|
|
-
|
|
|
- /* Swap bearers for next packet */
|
|
|
- if (s) {
|
|
|
- bcbearer->bpairs[bp_index].primary = s;
|
|
|
- bcbearer->bpairs[bp_index].secondary = p;
|
|
|
- }
|
|
|
-
|
|
|
if (bcbearer->remains_new.count == 0)
|
|
|
break; /* All targets reached */
|
|
|
|