713 |
struct pbuf * |
struct pbuf * |
714 |
pbuf_unref(struct pbuf *f) |
pbuf_unref(struct pbuf *f) |
715 |
{ |
{ |
716 |
struct pbuf *p, *prev, *q, *top; |
struct pbuf *p, *prev, *top; |
717 |
DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_unref: %p\n", (void*)f)); |
DEBUGF(PBUF_DEBUG | DBG_TRACE, ("pbuf_unref: %p\n", (void*)f)); |
718 |
|
|
719 |
prev = 0; |
prev = NULL; |
720 |
p = f; |
p = f; |
721 |
top = f; |
top = f; |
722 |
do |
do |
724 |
/* pbuf is of type PBUF_REF? */ |
/* pbuf is of type PBUF_REF? */ |
725 |
if (p->flags == PBUF_FLAG_REF) |
if (p->flags == PBUF_FLAG_REF) |
726 |
{ |
{ |
727 |
|
struct pbuf *q; |
728 |
|
q = NULL; |
729 |
/* allocate a pbuf (w/ payload) fully in RAM */ |
/* allocate a pbuf (w/ payload) fully in RAM */ |
730 |
/* PBUF_POOL buffers are faster if we can use them */ |
/* PBUF_POOL buffers are faster if we can use them */ |
731 |
if (p->len <= PBUF_POOL_BUFSIZE) |
if (p->len <= PBUF_POOL_BUFSIZE) { |
732 |
q = pbuf_alloc(PBUF_RAW, p->len, PBUF_POOL); |
q = pbuf_alloc(PBUF_RAW, p->len, PBUF_POOL); |
733 |
else |
if (q == NULL) DEBUGF(PBUF_DEBUG | DBG_TRACE, ("pbuf_unref: Could not allocate PBUF_RAW\n")); |
734 |
|
} |
735 |
|
/* no (large enough) PBUF_POOL was available? retry with PBUF_RAM */ |
736 |
|
if (q == NULL) { |
737 |
q = pbuf_alloc(PBUF_RAW, p->len, PBUF_RAM); |
q = pbuf_alloc(PBUF_RAW, p->len, PBUF_RAM); |
738 |
if (q != 0) |
if (q == NULL) DEBUGF(PBUF_DEBUG | DBG_TRACE, ("pbuf_unref: Could not allocate PBUF_POOL\n")); |
739 |
|
} |
740 |
|
if (q != NULL) |
741 |
{ |
{ |
742 |
/* copy pbuf struct */ |
/* copy pbuf struct */ |
743 |
q->next = p->next; |
q->next = p->next; |
744 |
if (prev) |
if (prev != NULL) |
745 |
/* Break chain and insert new pbuf instead */ |
/* Break chain and insert new pbuf instead */ |
746 |
prev->next = q; |
prev->next = q; |
747 |
else |
else |
748 |
top = q; |
top = q; |
749 |
p->next = NULL; |
p->next = NULL; |
750 |
|
/* copy pbuf payload */ |
751 |
memcpy(q->payload, p->payload, p->len); |
memcpy(q->payload, p->payload, p->len); |
752 |
q->tot_len = p->tot_len; |
q->tot_len = p->tot_len; |
753 |
q->len = p->len; |
q->len = p->len; |