I am a function to send data packets. Each time a packet is receive, I
create a buffer using `pbuf_alloc`. I then send the packet using
`upd_sendto`. Finally, I free the buffer with `pbuf_free`.

For some reason, `pbuf_free` is not freeing the buffers. (I get a buffer
overflow after `n` packets, where `n` is the pool size.)

How can I have `pbuf_free` actually free my buffers? How is the buffer
overflow avoided?

Below is my implementation:

static err_t IAP_tftp_send_data_packet(struct udp_pcb *upcb, struct
ip_addr *to, int to_port, int block)
{

  err_t err;

  struct pbuf *pkt_buf;

  char packet[TFTP_DATA_PKT_LEN_MAX];

  int bytesRead;

  int bytesToSend;

  /* Specify that we are sending data. */

  IAP_tftp_set_opcode(packet, TFTP_DATA);

  /* Specify the block number that we are sending. */

  IAP_tftp_set_block(packet, block);

  bytesRead = IAP_tftp_set_data(packet, block);

  if(bytesRead != 0) {

    bytesToSend = TFTP_DATA_PKT_LEN_MAX - (512 - bytesRead + 1);

  } else {

    bytesToSend = TFTP_DATA_PKT_LEN_MAX - 512;

  }

  pkt_buf = pbuf_alloc(PBUF_TRANSPORT, bytesToSend, PBUF_POOL);

  if (!pkt_buf)

  {

    print("(TFTP) Buffer overflow!\r\n");

  }

  /* Copy the file data onto pkt_buf. */

  memcpy(pkt_buf->payload, packet, bytesToSend);

  err = udp_sendto(upcb, pkt_buf, to, to_port);

  /* free the buffer pbuf */

  printf("%d\n\r", pbuf_free(pkt_buf));

  return err;
}
_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to