diff options
author | 2015-10-15 23:55:33 -0700 | |
---|---|---|
committer | 2015-10-15 23:55:33 -0700 | |
commit | ae23051820461bdc960b76d766e7c1e92dee2ee1 (patch) | |
tree | 8f79b62d957d1b0d209cb3a3aa3f2abe163d226a /net/tipc/msg.c | |
parent | mlx4: corretly check failed allocation (diff) | |
parent | tipc: update node FSM when peer RESET message is received (diff) | |
download | linux-dev-ae23051820461bdc960b76d766e7c1e92dee2ee1.tar.xz linux-dev-ae23051820461bdc960b76d766e7c1e92dee2ee1.zip |
Merge branch 'tipc-link-improvements'
Jon Maloy says:
====================
tipc: some link level code improvements
Extensive testing has revealed some weaknesses and non-optimal solutions
in the link level code.
This commit series addresses those issues.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r-- | net/tipc/msg.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index c5ac436235e0..454f5ec275c8 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c @@ -590,3 +590,34 @@ error: kfree_skb(head); return NULL; } + +/* tipc_skb_queue_sorted(); sort pkt into list according to sequence number + * @list: list to be appended to + * @seqno: sequence number of buffer to add + * @skb: buffer to add + */ +void __tipc_skb_queue_sorted(struct sk_buff_head *list, u16 seqno, + struct sk_buff *skb) +{ + struct sk_buff *_skb, *tmp; + + if (skb_queue_empty(list) || less(seqno, buf_seqno(skb_peek(list)))) { + __skb_queue_head(list, skb); + return; + } + + if (more(seqno, buf_seqno(skb_peek_tail(list)))) { + __skb_queue_tail(list, skb); + return; + } + + skb_queue_walk_safe(list, _skb, tmp) { + if (more(seqno, buf_seqno(_skb))) + continue; + if (seqno == buf_seqno(_skb)) + break; + __skb_queue_before(list, _skb, skb); + return; + } + kfree_skb(skb); +} |