forked from Minki/linux
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: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
This commit is contained in:
parent
3238a9be4d
commit
8809b255a9
@ -1853,17 +1853,16 @@ cont:
|
||||
}
|
||||
|
||||
/*
|
||||
* link_defer_buf(): Sort a received out-of-sequence packet
|
||||
* into the deferred reception queue.
|
||||
* Returns the increase of the queue length,i.e. 0 or 1
|
||||
* tipc_link_defer_pkt - Add out-of-sequence message to deferred reception queue
|
||||
*
|
||||
* Returns increase in queue length (i.e. 0 or 1)
|
||||
*/
|
||||
|
||||
u32 tipc_link_defer_pkt(struct sk_buff **head,
|
||||
struct sk_buff **tail,
|
||||
u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
|
||||
struct sk_buff *buf)
|
||||
{
|
||||
struct sk_buff *prev = NULL;
|
||||
struct sk_buff *crs = *head;
|
||||
struct sk_buff *queue_buf;
|
||||
struct sk_buff **prev;
|
||||
u32 seq_no = buf_seqno(buf);
|
||||
|
||||
buf->next = NULL;
|
||||
@ -1881,31 +1880,30 @@ u32 tipc_link_defer_pkt(struct sk_buff **head,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Scan through queue and sort it in */
|
||||
do {
|
||||
struct tipc_msg *msg = buf_msg(crs);
|
||||
|
||||
if (less(seq_no, msg_seqno(msg))) {
|
||||
buf->next = crs;
|
||||
if (prev)
|
||||
prev->next = buf;
|
||||
else
|
||||
*head = buf;
|
||||
return 1;
|
||||
}
|
||||
if (seq_no == msg_seqno(msg))
|
||||
break;
|
||||
prev = crs;
|
||||
crs = crs->next;
|
||||
} while (crs);
|
||||
|
||||
/* Message is a duplicate of an existing message */
|
||||
/* Locate insertion point in queue, then insert; discard if duplicate */
|
||||
prev = head;
|
||||
queue_buf = *head;
|
||||
for (;;) {
|
||||
u32 curr_seqno = buf_seqno(queue_buf);
|
||||
|
||||
if (seq_no == curr_seqno) {
|
||||
buf_discard(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
if (less(seq_no, curr_seqno))
|
||||
break;
|
||||
|
||||
prev = &queue_buf->next;
|
||||
queue_buf = queue_buf->next;
|
||||
}
|
||||
|
||||
buf->next = queue_buf;
|
||||
*prev = buf;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet
|
||||
*/
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user