Simon Goldschmidt wrote:

> Mason wrote:
> 
>> I send 58,400,000 bytes from the PC to the STB.
>> This takes 14.25 seconds, i.e. an average of 33 Mbit/s
>>
>> I was expecting to reach 80+ Mbit/s, so I captured the conversation
>> with Wireshark, and I noticed that the sender is being throttled
>> because the receiver (the STB running lwip) is not sending ACKs
>> fast enough.
> 
> From reading the wireshark capture, it seems that the receiver simply
> is not fast enough. It correctly sends an ACK for every 2nd data
> packet - no retransmissions involved mean no data dropped. And no
> data dropped normally means no configuration error in lwIP. It's just
> processing 2 data packets while in the same time the sender sends
> three packets.
> 
> Where does your expectation of 80+ Mbit/s come from?

I tested with UDP traffic.

I have the PC blasting 40,000 UDP frames at line speed, and the STB
is supposed to reply to each datagram with a bogus "ACK" frame. The
STB does indeed manage to send 40,000 replies.

cf. STB_UDP_RX.pcap at http://dl.free.fr/cZYXFg1Yf

40,000 frames x 1514 bytes in 4.9 seconds
= 8163 packets per second
= 98.9 Mbit/s
(= 100 Mbit/s if we take into account preamble, SoF, and IFG)

So the hardware + driver is indeed able to handle the load.

I must be doing something wrong in my driver when I pass
data to lwip.

> If the hardware
> is really fast enough, you seem to have a bottleneck somewhere in
> your code, supposedly either somewhere around your netif driver or in
> your OS threading? If your netif driver uses PBUF_POOL for rx
> packets, you might want to check that PBUF_POOL_BUFSIZE is large
> enough to hold a complete frame.

In the RX part, I copy the incoming frame :

    packet_descriptor *desc = wait_for_next_packet( );
    /*** PROCESS THE PACKET ***/
    struct pbuf *pbuf = pbuf_alloc(PBUF_RAW, desc->length, PBUF_RAM);
    memcpy(pbuf->payload, desc->buffer, desc->length);
    mynetif->input(pbuf, mynetif);

I've disabled TCPIP checksum verification with
#define CHECKSUM_CHECK_TCP 0

In the TX part, I copy the outgoing pbuf :

  packet_descriptor *desc = get_packet_descriptor( );
  assert(p->next == NULL);
  memcpy(desc->buffer, p->payload, p->len);
  desc->length = p->len;
  // add desc to list of frames to send

Do you spot any glaring error?

-- 
Regards.

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

Reply via email to