git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
net
/
sctp
/
inqueue.c
diff --git
a/net/sctp/inqueue.c
b/net/sctp/inqueue.c
index
cedf435
..
cf0c767
100644
(file)
--- a/
net/sctp/inqueue.c
+++ b/
net/sctp/inqueue.c
@@
-50,7
+50,7
@@
/* Initialize an SCTP inqueue. */
void sctp_inq_init(struct sctp_inq *queue)
{
/* Initialize an SCTP inqueue. */
void sctp_inq_init(struct sctp_inq *queue)
{
-
skb_queue_head_init(&queue->in
);
+
INIT_LIST_HEAD(&queue->in_chunk_list
);
queue->in_progress = NULL;
/* Create a task for delivering data. */
queue->in_progress = NULL;
/* Create a task for delivering data. */
@@
-62,17
+62,21
@@
void sctp_inq_init(struct sctp_inq *queue)
/* Release the memory associated with an SCTP inqueue. */
void sctp_inq_free(struct sctp_inq *queue)
{
/* Release the memory associated with an SCTP inqueue. */
void sctp_inq_free(struct sctp_inq *queue)
{
- struct sctp_chunk *chunk;
+ struct sctp_chunk *chunk
, *tmp
;
/* Empty the queue. */
/* Empty the queue. */
- while ((chunk = (struct sctp_chunk *) skb_dequeue(&queue->in)) != NULL)
+ list_for_each_entry_safe(chunk, tmp, &queue->in_chunk_list, list) {
+ list_del_init(&chunk->list);
sctp_chunk_free(chunk);
sctp_chunk_free(chunk);
+ }
/* If there is a packet which is currently being worked on,
* free it as well.
*/
/* If there is a packet which is currently being worked on,
* free it as well.
*/
- if (queue->in_progress)
+ if (queue->in_progress)
{
sctp_chunk_free(queue->in_progress);
sctp_chunk_free(queue->in_progress);
+ queue->in_progress = NULL;
+ }
if (queue->malloced) {
/* Dump the master memory segment. */
if (queue->malloced) {
/* Dump the master memory segment. */
@@
-92,7
+96,7
@@
void sctp_inq_push(struct sctp_inq *q, struct sctp_chunk *packet)
* Eventually, we should clean up inqueue to not rely
* on the BH related data structures.
*/
* Eventually, we should clean up inqueue to not rely
* on the BH related data structures.
*/
-
skb_queue_tail(&(q->in), (struct sk_buff *) packe
t);
+
list_add_tail(&packet->list, &q->in_chunk_lis
t);
q->immediate.func(q->immediate.data);
}
q->immediate.func(q->immediate.data);
}
@@
-131,16
+135,21
@@
struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
/* Do we need to take the next packet out of the queue to process? */
if (!chunk) {
/* Do we need to take the next packet out of the queue to process? */
if (!chunk) {
+ struct list_head *entry;
+
/* Is the queue empty? */
/* Is the queue empty? */
- if (
skb_queue_empty(&queue->in
))
+ if (
list_empty(&queue->in_chunk_list
))
return NULL;
return NULL;
+ entry = queue->in_chunk_list.next;
chunk = queue->in_progress =
chunk = queue->in_progress =
- (struct sctp_chunk *) skb_dequeue(&queue->in);
+ list_entry(entry, struct sctp_chunk, list);
+ list_del_init(entry);
/* This is the first chunk in the packet. */
chunk->singleton = 1;
ch = (sctp_chunkhdr_t *) chunk->skb->data;
/* This is the first chunk in the packet. */
chunk->singleton = 1;
ch = (sctp_chunkhdr_t *) chunk->skb->data;
+ chunk->data_accepted = 0;
}
chunk->chunk_hdr = ch;
}
chunk->chunk_hdr = ch;