Skip to content

Commit

Permalink
tipc: improve the link deferred queue insertion algorithm
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Allan Stephens authored and Paul Gortmaker committed Feb 6, 2012
1 parent 3238a9b commit 8809b25
Showing 1 changed file with 23 additions and 25 deletions.
48 changes: 23 additions & 25 deletions net/tipc/link.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
* 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;
Expand All @@ -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);
/* Locate insertion point in queue, then insert; discard if duplicate */
prev = head;
queue_buf = *head;
for (;;) {
u32 curr_seqno = buf_seqno(queue_buf);

if (less(seq_no, msg_seqno(msg))) {
buf->next = crs;
if (prev)
prev->next = buf;
else
*head = buf;
return 1;
if (seq_no == curr_seqno) {
buf_discard(buf);
return 0;
}
if (seq_no == msg_seqno(msg))

if (less(seq_no, curr_seqno))
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);
return 0;
buf->next = queue_buf;
*prev = buf;
return 1;
}

/**
/*
* link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet
*/

Expand Down

0 comments on commit 8809b25

Please sign in to comment.