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) {