Commit 8809b255 authored by Allan Stephens's avatar Allan Stephens Committed by Paul Gortmaker

tipc: improve the link deferred queue insertion algorithm

Re-code the algorithm for inserting an out-of-sequence message into
a unicast or broadcast link's deferred message queue.  It remains
functionally equivalent but should be easier to understand/maintain.
Signed-off-by: default avatarAllan Stephens <allan.stephens@windriver.com>
Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
parent 3238a9be
...@@ -1853,17 +1853,16 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *b_ptr) ...@@ -1853,17 +1853,16 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *b_ptr)
} }
/* /*
* link_defer_buf(): Sort a received out-of-sequence packet * tipc_link_defer_pkt - Add out-of-sequence message to deferred reception queue
* into the deferred reception queue. *
* Returns the increase of the queue length,i.e. 0 or 1 * Returns increase in queue length (i.e. 0 or 1)
*/ */
u32 tipc_link_defer_pkt(struct sk_buff **head, u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
struct sk_buff **tail,
struct sk_buff *buf) struct sk_buff *buf)
{ {
struct sk_buff *prev = NULL; struct sk_buff *queue_buf;
struct sk_buff *crs = *head; struct sk_buff **prev;
u32 seq_no = buf_seqno(buf); u32 seq_no = buf_seqno(buf);
buf->next = NULL; buf->next = NULL;
...@@ -1881,31 +1880,30 @@ u32 tipc_link_defer_pkt(struct sk_buff **head, ...@@ -1881,31 +1880,30 @@ u32 tipc_link_defer_pkt(struct sk_buff **head,
return 1; return 1;
} }
/* Scan through queue and sort it in */ /* Locate insertion point in queue, then insert; discard if duplicate */
do { prev = head;
struct tipc_msg *msg = buf_msg(crs); queue_buf = *head;
for (;;) {
u32 curr_seqno = buf_seqno(queue_buf);
if (less(seq_no, msg_seqno(msg))) { if (seq_no == curr_seqno) {
buf->next = crs; buf_discard(buf);
if (prev) return 0;
prev->next = buf;
else
*head = buf;
return 1;
} }
if (seq_no == msg_seqno(msg))
if (less(seq_no, curr_seqno))
break; break;
prev = crs;
crs = crs->next;
} while (crs);
/* Message is a duplicate of an existing message */ prev = &queue_buf->next;
queue_buf = queue_buf->next;
}
buf_discard(buf); buf->next = queue_buf;
return 0; *prev = buf;
return 1;
} }
/** /*
* link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet * link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment