[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lwip-users] Sending data more than 1472 bytes using UDP

From: Mohammad Tavakoli
Subject: Re: [lwip-users] Sending data more than 1472 bytes using UDP
Date: Wed, 7 Oct 2020 12:29:54 +0330

I am grateful for you Jon Bean and Alister Fisher. With using a pbuf chain and employing tips in the link provided by Alister I achieved to transfer data about 72 Mbps speed. Now I am curious to know why the speed is far from 100 Mbps (the expected speed).

On Wed, Oct 7, 2020 at 1:35 AM Alister Fisher <alister@advateklights.com> wrote:

The code you’ve sent are high software layers. Perhaps you need to check the lower software layers can send pbuf chains. If you’re using ST’s HAL and lwIP’s ethernetif.c, check out what I did for the STM32H7 at https://community.st.com/s/question/0D50X0000C6eNNSSQ2/bug-fixes-stm32h7-ethernet. The STM32F4 ethernet peripheral and driver would be different.





Alister Fisher
Senior Software Developer

Advatek Lighting

16/52 Corporate Blvd, Bayswater, VIC, 3153, AUSTRALIA
T: +61  3 8400 4566 
alister@advateklights.com  www.advateklights.com

From: lwip-users <lwip-users-bounces+alister=advateklights.com@nongnu.org> On Behalf Of Mohammad Tavakoli
Sent: Tuesday, 6 October 2020 11:24 pm
To: Mailing list for lwIP users <lwip-users@nongnu.org>
Subject: Re: [lwip-users] Sending data more than 1472 bytes using UDP


I reckon that maybe it is useful to send my code:

uint32_t  aa[4001];

struct pbuf* GK_pbuf;

err_t GK_err;

int main(){

  for(i = 0; i <= 4000; ++i){
      aa[i] = (i % 30) + 0x30; 
GK_pbuf = pbuf_alloc(PBUF_TRANSPORT, 1600, PBUF_RAM);

  while (1)




and in  udp_echoserver_init.c file:


void udp_echoserver_init(void)

  ip4addr_aton("", &serverIP);  
   struct udp_pcb *upcb;
   err_t err;
   upcb = udp_new();
   if (upcb)
      err = udp_bind(upcb, &serverIP , 7);
      if(err == ERR_OK)
        udp_recv(upcb, udp_echoserver_receive_callback, NULL);



void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
  udp_connect(upcb, addr, port);
  ip4addr_aton("", &remoteIP);
  for(iii = 0; iii <= 9; ++iii){
        GH_err = pbuf_take(GK_pbuf, aa + (iii * 1472), 1472);
        Gn_err = udp_sendto(upcb, GK_pbuf, &remoteIP, 7);

        // Gn_err = udp_send(upcb, GK_pbuf);
        HAL_Delay(50); //50ms


On Tue, Oct 6, 2020 at 3:32 PM Mohammad Tavakoli <tavakoli.irsa@gmail.com> wrote:

Thank you for your answer. What do you mean by lwIP interrupt? where I can find it? I am also willing to know I should use udp_send() or udp_sendto() in that ISR.


On Tue, Oct 6, 2020 at 3:11 PM Jon Bean <jbean@beandigital.co.uk> wrote:

Hi Mohammad

I had to do something similar on a TI MCU. I chose to send multiple packets that were less than the MTU. Basically I called the transmit route from the LWIP interrupt. Each time the interrupt was called it would send a data packet that was not more than the MTU. I had some flags to know if I still needed to keep sending data or if I can stop. This seemed to work OK for my application.



On 06/10/2020 12:32, Mohammad Tavakoli wrote:

I made a TCP server on STM32F407 using lwIP version 2.1.2 and it worked fine. Now for some reasons I need to run a UDP server on the MCU. I tried and it worked fine for data size below 1472 bytes. Yet the desired data length is around 16KB to 20KB.
1. I searched and found that IP_FRAG should  be  defined 1 to allow send data over MTU size. It is enabled by default. I read from an email [1] that IP_FRAG_MAX_MTU should be also changed to a proper value. However I cannot realize where it is!
2. Another approach employed by me is to send chopped data whose size are below 1472 bytes in a for loop but the for loop only executes first time and the MCU goes stop status. How I must send data in a for loop?



lwip-users mailing list


Virus-free. www.avast.com

lwip-users mailing list

lwip-users mailing list

reply via email to

[Prev in Thread] Current Thread [Next in Thread]