summaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/link.c29
-rw-r--r--net/tipc/msg.c5
2 files changed, 19 insertions, 15 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 6cc75ffd9e2c..999eab592de8 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -160,6 +160,7 @@ struct tipc_link {
160 struct { 160 struct {
161 u16 len; 161 u16 len;
162 u16 limit; 162 u16 limit;
163 struct sk_buff *target_bskb;
163 } backlog[5]; 164 } backlog[5];
164 u16 snd_nxt; 165 u16 snd_nxt;
165 u16 window; 166 u16 window;
@@ -880,6 +881,7 @@ static void link_prepare_wakeup(struct tipc_link *l)
880void tipc_link_reset(struct tipc_link *l) 881void tipc_link_reset(struct tipc_link *l)
881{ 882{
882 struct sk_buff_head list; 883 struct sk_buff_head list;
884 u32 imp;
883 885
884 __skb_queue_head_init(&list); 886 __skb_queue_head_init(&list);
885 887
@@ -901,11 +903,10 @@ void tipc_link_reset(struct tipc_link *l)
901 __skb_queue_purge(&l->deferdq); 903 __skb_queue_purge(&l->deferdq);
902 __skb_queue_purge(&l->backlogq); 904 __skb_queue_purge(&l->backlogq);
903 __skb_queue_purge(&l->failover_deferdq); 905 __skb_queue_purge(&l->failover_deferdq);
904 l->backlog[TIPC_LOW_IMPORTANCE].len = 0; 906 for (imp = 0; imp <= TIPC_SYSTEM_IMPORTANCE; imp++) {
905 l->backlog[TIPC_MEDIUM_IMPORTANCE].len = 0; 907 l->backlog[imp].len = 0;
906 l->backlog[TIPC_HIGH_IMPORTANCE].len = 0; 908 l->backlog[imp].target_bskb = NULL;
907 l->backlog[TIPC_CRITICAL_IMPORTANCE].len = 0; 909 }
908 l->backlog[TIPC_SYSTEM_IMPORTANCE].len = 0;
909 kfree_skb(l->reasm_buf); 910 kfree_skb(l->reasm_buf);
910 kfree_skb(l->reasm_tnlmsg); 911 kfree_skb(l->reasm_tnlmsg);
911 kfree_skb(l->failover_reasm_skb); 912 kfree_skb(l->failover_reasm_skb);
@@ -947,7 +948,7 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
947 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; 948 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1;
948 struct sk_buff_head *transmq = &l->transmq; 949 struct sk_buff_head *transmq = &l->transmq;
949 struct sk_buff_head *backlogq = &l->backlogq; 950 struct sk_buff_head *backlogq = &l->backlogq;
950 struct sk_buff *skb, *_skb, *bskb; 951 struct sk_buff *skb, *_skb, **tskb;
951 int pkt_cnt = skb_queue_len(list); 952 int pkt_cnt = skb_queue_len(list);
952 int rc = 0; 953 int rc = 0;
953 954
@@ -999,19 +1000,21 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
999 seqno++; 1000 seqno++;
1000 continue; 1001 continue;
1001 } 1002 }
1002 if (tipc_msg_bundle(skb_peek_tail(backlogq), hdr, mtu)) { 1003 tskb = &l->backlog[imp].target_bskb;
1004 if (tipc_msg_bundle(*tskb, hdr, mtu)) {
1003 kfree_skb(__skb_dequeue(list)); 1005 kfree_skb(__skb_dequeue(list));
1004 l->stats.sent_bundled++; 1006 l->stats.sent_bundled++;
1005 continue; 1007 continue;
1006 } 1008 }
1007 if (tipc_msg_make_bundle(&bskb, hdr, mtu, l->addr)) { 1009 if (tipc_msg_make_bundle(tskb, hdr, mtu, l->addr)) {
1008 kfree_skb(__skb_dequeue(list)); 1010 kfree_skb(__skb_dequeue(list));
1009 __skb_queue_tail(backlogq, bskb); 1011 __skb_queue_tail(backlogq, *tskb);
1010 l->backlog[msg_importance(buf_msg(bskb))].len++; 1012 l->backlog[imp].len++;
1011 l->stats.sent_bundled++; 1013 l->stats.sent_bundled++;
1012 l->stats.sent_bundles++; 1014 l->stats.sent_bundles++;
1013 continue; 1015 continue;
1014 } 1016 }
1017 l->backlog[imp].target_bskb = NULL;
1015 l->backlog[imp].len += skb_queue_len(list); 1018 l->backlog[imp].len += skb_queue_len(list);
1016 skb_queue_splice_tail_init(list, backlogq); 1019 skb_queue_splice_tail_init(list, backlogq);
1017 } 1020 }
@@ -1027,6 +1030,7 @@ static void tipc_link_advance_backlog(struct tipc_link *l,
1027 u16 seqno = l->snd_nxt; 1030 u16 seqno = l->snd_nxt;
1028 u16 ack = l->rcv_nxt - 1; 1031 u16 ack = l->rcv_nxt - 1;
1029 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; 1032 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1;
1033 u32 imp;
1030 1034
1031 while (skb_queue_len(&l->transmq) < l->window) { 1035 while (skb_queue_len(&l->transmq) < l->window) {
1032 skb = skb_peek(&l->backlogq); 1036 skb = skb_peek(&l->backlogq);
@@ -1037,7 +1041,10 @@ static void tipc_link_advance_backlog(struct tipc_link *l,
1037 break; 1041 break;
1038 __skb_dequeue(&l->backlogq); 1042 __skb_dequeue(&l->backlogq);
1039 hdr = buf_msg(skb); 1043 hdr = buf_msg(skb);
1040 l->backlog[msg_importance(hdr)].len--; 1044 imp = msg_importance(hdr);
1045 l->backlog[imp].len--;
1046 if (unlikely(skb == l->backlog[imp].target_bskb))
1047 l->backlog[imp].target_bskb = NULL;
1041 __skb_queue_tail(&l->transmq, skb); 1048 __skb_queue_tail(&l->transmq, skb);
1042 /* next retransmit attempt */ 1049 /* next retransmit attempt */
1043 if (link_is_bc_sndlink(l)) 1050 if (link_is_bc_sndlink(l))
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index e6d49cdc61b4..922d262e153f 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -543,10 +543,7 @@ bool tipc_msg_make_bundle(struct sk_buff **skb, struct tipc_msg *msg,
543 bmsg = buf_msg(_skb); 543 bmsg = buf_msg(_skb);
544 tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0, 544 tipc_msg_init(msg_prevnode(msg), bmsg, MSG_BUNDLER, 0,
545 INT_H_SIZE, dnode); 545 INT_H_SIZE, dnode);
546 if (msg_isdata(msg)) 546 msg_set_importance(bmsg, msg_importance(msg));
547 msg_set_importance(bmsg, TIPC_CRITICAL_IMPORTANCE);
548 else
549 msg_set_importance(bmsg, TIPC_SYSTEM_IMPORTANCE);
550 msg_set_seqno(bmsg, msg_seqno(msg)); 547 msg_set_seqno(bmsg, msg_seqno(msg));
551 msg_set_ack(bmsg, msg_ack(msg)); 548 msg_set_ack(bmsg, msg_ack(msg));
552 msg_set_bcast_ack(bmsg, msg_bcast_ack(msg)); 549 msg_set_bcast_ack(bmsg, msg_bcast_ack(msg));