aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.h
diff options
context:
space:
mode:
authorTuong Lien <tuong.t.lien@dektech.com.au>2019-04-04 00:09:52 -0400
committerDavid S. Miller <davem@davemloft.net>2019-04-04 21:29:25 -0400
commit382f598fb66b14a8451f2794abf70ea7b5826c96 (patch)
tree5d25199c0053b40e74a797c16c2d17dfe29d4479 /net/tipc/msg.h
parent9195948fbf3406f75b1f133ddb57304169c44341 (diff)
tipc: reduce duplicate packets for unicast traffic
For unicast transmission, the current NACK sending althorithm is over- active that forces the sending side to retransmit a packet that is not really lost but just arrived at the receiving side with some delay, or even retransmit same packets that have already been retransmitted before. As a result, many duplicates are observed also under normal condition, ie. without packet loss. One example case is: node1 transmits 1 2 3 4 10 5 6 7 8 9, when node2 receives packet #10, it puts into the deferdq. When the packet #5 comes it sends NACK with gap [6 - 9]. However, shortly after that, when packet #6 arrives, it pulls out packet #10 from the deferfq, but it is still out of order, so it makes another NACK with gap [7 - 9] and so on ... Finally, node1 has to retransmit the packets 5 6 7 8 9 a number of times, but in fact all the packets are not lost at all, so duplicates! This commit reduces duplicates by changing the condition to send NACK, also restricting the retransmissions on individual packets via a timer of about 1ms. However, it also needs to say that too tricky condition for NACKs or too long timeout value for retransmissions will result in performance reducing! The criterias in this commit are found to be effective for both the requirements to reduce duplicates but not affect performance. The tipc_link_rcv() is also improved to only dequeue skb from the link deferdq if it is expected (ie. its seqno <= rcv_nxt). Acked-by: Ying Xue <ying.xue@windriver.com> Acked-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: Tuong Lien <tuong.t.lien@dektech.com.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/msg.h')
-rw-r--r--net/tipc/msg.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/net/tipc/msg.h b/net/tipc/msg.h
index ec5c511a9c9c..8de02ad6e352 100644
--- a/net/tipc/msg.h
+++ b/net/tipc/msg.h
@@ -1151,4 +1151,25 @@ static inline void tipc_skb_queue_splice_tail_init(struct sk_buff_head *list,
1151 tipc_skb_queue_splice_tail(&tmp, head); 1151 tipc_skb_queue_splice_tail(&tmp, head);
1152} 1152}
1153 1153
1154/* __tipc_skb_dequeue() - dequeue the head skb according to expected seqno
1155 * @list: list to be dequeued from
1156 * @seqno: seqno of the expected msg
1157 *
1158 * returns skb dequeued from the list if its seqno is less than or equal to
1159 * the expected one, otherwise the skb is still hold
1160 *
1161 * Note: must be used with appropriate locks held only
1162 */
1163static inline struct sk_buff *__tipc_skb_dequeue(struct sk_buff_head *list,
1164 u16 seqno)
1165{
1166 struct sk_buff *skb = skb_peek(list);
1167
1168 if (skb && less_eq(buf_seqno(skb), seqno)) {
1169 __skb_unlink(skb, list);
1170 return skb;
1171 }
1172 return NULL;
1173}
1174
1154#endif 1175#endif