120 #if LWIP_TCP && TCP_QUEUE_OOSEQ
123 #if LWIP_CHECKSUM_ON_COPY
129 #define SIZEOF_STRUCT_PBUF LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf))
132 #define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE)
134 #if !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ
135 #define PBUF_POOL_IS_EMPTY()
139 #ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL
141 #define PBUF_POOL_FREE_OOSEQ_QUEUE_CALL() do { \
142 if (tcpip_callback_with_block(pbuf_free_ooseq_callback, NULL, 0) != ERR_OK) { \
143 SYS_ARCH_PROTECT(old_level); \
144 pbuf_free_ooseq_pending = 0; \
145 SYS_ARCH_UNPROTECT(old_level); \
150 volatile u8_t pbuf_free_ooseq_pending;
151 #define PBUF_POOL_IS_EMPTY() pbuf_pool_is_empty()
165 pbuf_free_ooseq(
void)
170 for (pcb = tcp_active_pcbs;
NULL != pcb; pcb = pcb->next) {
171 if (
NULL != pcb->ooseq) {
174 tcp_segs_free(pcb->ooseq);
186 pbuf_free_ooseq_callback(
void *arg)
195 pbuf_pool_is_empty(
void)
197 #ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL
203 queued = pbuf_free_ooseq_pending;
204 pbuf_free_ooseq_pending = 1;
209 PBUF_POOL_FREE_OOSEQ_QUEUE_CALL();
250 struct pbuf *p, *q, *r;
296 LWIP_ASSERT(
"pbuf_alloc: pbuf p->payload properly aligned",
302 LWIP_ASSERT(
"check p->payload + p->len does not overflow pbuf",
303 ((
u8_t*)p->payload + p->len <=
305 LWIP_ASSERT(
"PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT",
315 rem_len = length - p->
len;
317 while (rem_len > 0) {
332 LWIP_ASSERT(
"rem_len < max_u16_t", rem_len < 0xffff);
337 LWIP_ASSERT(
"pbuf_alloc: pbuf q->payload properly aligned",
339 LWIP_ASSERT(
"check p->payload + p->len does not overflow pbuf",
340 ((
u8_t*)p->payload + p->len <=
370 p->len = p->tot_len = length;
374 LWIP_ASSERT(
"pbuf_alloc: pbuf->payload properly aligned",
385 (
"pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n",
391 p->len = p->tot_len = length;
407 #if LWIP_SUPPORT_CUSTOM_PBUF
426 void *payload_mem,
u16_t payload_mem_len)
453 LWIP_ASSERT(
"pbuf_alloced_custom: bad pbuf layer", 0);
463 if (payload_mem !=
NULL) {
466 p->pbuf.payload =
NULL;
469 p->pbuf.len = p->pbuf.tot_len = length;
519 while (rem_len > q->
len) {
569 pbuf_header_impl(
struct pbuf *p,
s16_t header_size_increment,
u8_t force)
573 u16_t increment_magnitude;
576 if ((header_size_increment == 0) || (p ==
NULL)) {
580 if (header_size_increment < 0) {
581 increment_magnitude = (
u16_t)-header_size_increment;
583 LWIP_ERROR(
"increment_magnitude <= p->len", (increment_magnitude <= p->
len),
return 1;);
585 increment_magnitude = (
u16_t)header_size_increment;
590 LWIP_ASSERT(
"p->type == PBUF_RAM || p->type == PBUF_POOL",
593 LWIP_ASSERT(
"p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF",
609 (
"pbuf_header: failed as %p < %p (not enough space for new header size)\n",
619 if ((header_size_increment < 0) && (increment_magnitude <= p->
len)) {
622 }
else if ((header_size_increment > 0) && force) {
635 p->
len += header_size_increment;
636 p->
tot_len += header_size_increment;
667 return pbuf_header_impl(p, header_size_increment, 0);
677 return pbuf_header_impl(p, header_size_increment, 1);
725 (
"pbuf_free(p == NULL) was called.\n"));
758 #if LWIP_SUPPORT_CUSTOM_PBUF
761 struct pbuf_custom *pc = (
struct pbuf_custom*)p;
762 LWIP_ASSERT(
"pc->custom_free_function != NULL", pc->custom_free_function !=
NULL);
763 pc->custom_free_function(p);
845 LWIP_ERROR(
"(h != NULL) && (t != NULL) (programmer violates API)",
846 ((h !=
NULL) && (t !=
NULL)),
return;);
921 (
"pbuf_dechain: deallocated %p (as it is no longer referenced)\n", (
void *)q));
927 return ((tail_gone > 0) ?
NULL : q);
951 u16_t offset_to=0, offset_from=0,
len;
954 (
const void*)p_to, (
const void*)p_from));
957 LWIP_ERROR(
"pbuf_copy: target not big enough to hold source", ((p_to !=
NULL) &&
958 (p_from !=
NULL) && (p_to->tot_len >= p_from->tot_len)),
return ERR_ARG;);
964 if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {
966 len = p_from->len - offset_from;
969 len = p_to->len - offset_to;
971 MEMCPY((
u8_t*)p_to->payload + offset_to, (
u8_t*)p_from->payload + offset_from,
len);
975 LWIP_ASSERT(
"offset_from <= p_from->len", offset_from <= p_from->
len);
976 if (offset_from >= p_from->len) {
979 p_from = p_from->next;
981 if (offset_to == p_to->len) {
988 if ((p_from !=
NULL) && (p_from->len == p_from->tot_len)) {
990 LWIP_ERROR(
"pbuf_copy() does not allow packet queues!",
993 if ((p_to !=
NULL) && (p_to->len == p_to->tot_len)) {
995 LWIP_ERROR(
"pbuf_copy() does not allow packet queues!",
1018 const struct pbuf *p;
1021 u16_t copied_total = 0;
1024 LWIP_ERROR(
"pbuf_copy_partial: invalid dataptr", (dataptr !=
NULL),
return 0;);
1034 if ((offset != 0) && (offset >= p->
len)) {
1039 buf_copy_len = p->
len - offset;
1040 if (buf_copy_len >
len) {
1044 MEMCPY(&((
char*)dataptr)[left], &((
char*)p->
payload)[offset], buf_copy_len);
1045 copied_total += buf_copy_len;
1046 left += buf_copy_len;
1047 len -= buf_copy_len;
1051 return copied_total;
1054 #if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE
1067 void pbuf_split_64k(
struct pbuf *p,
struct pbuf **rest)
1076 while ((r !=
NULL) && ((
u16_t)(tot_len_front + r->
len) > tot_len_front)) {
1077 tot_len_front += r->
len;
1087 for (i = p; i !=
NULL; i = i->
next) {
1105 static const struct pbuf*
1106 pbuf_skip_const(
const struct pbuf* in,
u16_t in_offset,
u16_t* out_offset)
1108 u16_t offset_left = in_offset;
1109 const struct pbuf* q = in;
1112 while ((q !=
NULL) && (q->
len <= offset_left)) {
1113 offset_left -= q->
len;
1116 if (out_offset !=
NULL) {
1117 *out_offset = offset_left;
1134 const struct pbuf* out = pbuf_skip_const(in, in_offset, out_offset);
1155 u16_t copied_total = 0;
1166 for (p =
buf; total_copy_len != 0; p = p->
next) {
1168 buf_copy_len = total_copy_len;
1169 if (buf_copy_len > p->
len) {
1171 buf_copy_len = p->
len;
1174 MEMCPY(p->
payload, &((
const char*)dataptr)[copied_total], buf_copy_len);
1175 total_copy_len -= buf_copy_len;
1176 copied_total += buf_copy_len;
1178 LWIP_ASSERT(
"did not copy all data", total_copy_len == 0 && copied_total ==
len);
1196 u16_t target_offset;
1202 const u8_t* src_ptr = (
const u8_t*)dataptr;
1206 remaining_len -= first_copy_len;
1207 src_ptr += first_copy_len;
1208 if (remaining_len > 0) {
1249 #if LWIP_CHECKSUM_ON_COPY
1263 pbuf_fill_chksum(
struct pbuf *p,
u16_t start_offset,
const void *dataptr,
1274 if ((start_offset >= p->
len) || (start_offset +
len > p->
len)) {
1278 dst_ptr = ((
char*)p->
payload) + start_offset;
1279 copy_chksum = LWIP_CHKSUM_COPY(dst_ptr, dataptr,
len);
1280 if ((start_offset & 1) != 0) {
1321 const struct pbuf* q = pbuf_skip_const(p, offset, &q_idx);
1324 if ((q !=
NULL) && (q->
len > q_idx)) {
1346 if ((q !=
NULL) && (q->
len > q_idx)) {
1365 u16_t start = offset;
1366 const struct pbuf* q = p;
1370 if(p->
tot_len < (offset + n)) {
1375 while ((q !=
NULL) && (q->
len <= start)) {
1381 for (i = 0; i < n; i++) {
1409 if (p->
tot_len >= mem_len + start_offset) {
1410 for (i = start_offset; i <= max; i++) {
1435 if ((substr ==
NULL) || (substr[0] == 0) || (p->
tot_len == 0xFFFF)) {
1438 substr_len =
strlen(substr);
1439 if (substr_len >= 0xFFFF) {