The problem isn’t with the LwIP code, but with the Ethernet hardware driver 
(hdkif.c: hdkif_output).  The driver ensures that packets are always at least 
60 bytes long.  The implementation I have (from TI for the Hercules Device – 
RM46L852) has this code:

  /* adjust the packet length if less than minimum required */
  if(p->tot_len < MIN_PKT_LEN) {
     p->tot_len = MIN_PKT_LEN;
     p->len = MIN_PKT_LEN;
  }

This works as long as buffers are not chained.  When the buffers are chained, 
the packet is permanently destroyed so re-transmits will always fail.  The fix 
is to change the above code to:

  /* adjust the packet length if less than minimum required */
  if(p->tot_len < MIN_PKT_LEN) {
   struct pbuf *temp_p;
   int diff_len = MIN_PKT_LEN - p->tot_len;
   for (temp_p = p;  temp_p->next != NULL;  temp_p = temp_p->next)
    temp_p->tot_len += diff_len;
   temp_p->tot_len += diff_len;
   temp_p->len += diff_len;
  }

I realize this isn’t an LwIP problem, but I bet a lot of people have this 
problem waiting to happen as soon as a short chained packet is sent.  

-Jeremy
_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users

Reply via email to