0
\$\begingroup\$

https://www.microchip.com/forums/tt.aspx?forumid=173

Two KSZ8851SNL on STM32, working like a hub

I have two KSZ8851SNL connected to an STM32H7 board.

In a certain operating mode, I would like to make a 'transparent' connection (on link level) between the two interfaces, so the board with the two interfaces acts like a simple hub.

So if I receive a packet on interface 1, I forward it to interface 2, and the other way around.

This works, if I connect two devices that talk to each other (talking modbus-TCP slave and master).

It works partially when I connect a PC (windows 10) and a HMI device.

I can use ftp and see the disk contents on the device in a windows file explorer.

Then I can drag and drop files, but only if they are small, like up to 2kB, sometimes up to 7kB. Then the connection just times out on bigger files. Using WireShark, I can see there are retransmissions, when using the board in between and the transfer takes much more time.

One problem with this KSZ8851 chip is that I need to flush the queue after I received and read data, otherwise it stops working, it's state machine locks up.

But if I need to flush the receive buffer, it may flush new received data, which may be the culprit here.

Basically, I'm trying to make a 'transparent' connection like this:

while (1)
{
    pRXLength = ksz8851_Receive(&KSZ8851_interface_0, pRXData, MAX_FRAMELEN);
    // Pass the packet if packet is > size of headers: ETH(14) + IP(20) + TCP(20)
    if (pRXLength > MB_HDR_OFFSET)
    {
        // Flush receive buffer to keep the KSZ8851 statemachine alive
        ksz8851snl_reset_rx(&KSZ8851_interface_0);
        // Forward the packet to the other interface
        ksz8851_Send(&KSZ8851_interface_1, pRXData, pRXLength);
    }

    pRXLength = ksz8851_Receive(&KSZ8851_interface_1, pRXData, MAX_FRAMELEN);
    // Pass the packet if packet is > size of headers: ETH(14) + IP(20) + TCP(20)
    if (pRXLength > MB_HDR_OFFSET)
    {
        // Flush receive buffer to keep the KSZ8851 statemachine alive
        ksz8851snl_reset_rx(&KSZ8851_interface_1);
        // Forward the packet to the other interface
        ksz8851_Send(&KSZ8851_interface_0, pRXData, pRXLength);
    }
}

Could this in theory work?

My code is here:

https://github.com/bkht/KSZ8851SNL_no_LwIP

I notice the connection becomes slow and unreliable with the board in between the devices. This can have many reasons, even signal reflections on the board, although the tracks to the KSZ8851SNL network interfaces are very short. The power is also well filtered.

Two WireShark captures (with and without the STM32 board in between) when copying a small file with FTP:

Using a direct connection, without the board, it takes not much time and there are not many packets involved and only a few retransmissions:

 70 3.797695 192.168.25.148 192.168.25.237 FTP 60 Request: noop
 71 3.797704 192.168.25.148 192.168.25.237 TCP 60 [TCP Retransmission] 51126 → 21 [PSH, ACK] Seq=1 Ack=1 Win=1022 Len=6
 72 3.800789 192.168.25.237 192.168.25.148 FTP 84 Response: 200 NOOP command successful.
 73 3.800844 192.168.25.148 192.168.25.237 TCP 54 51126 → 21 [ACK] Seq=7 Ack=31 Win=1022 Len=0
 74 3.800846 192.168.25.148 192.168.25.237 TCP 54 [TCP Dup ACK 73#1] 51126 → 21 [ACK] Seq=7 Ack=31 Win=1022 Len=0
 75 3.800912 192.168.25.148 192.168.25.237 FTP 61 Request: CWD /
 76 3.800915 192.168.25.148 192.168.25.237 TCP 61 [TCP Retransmission] 51126 → 21 [PSH, ACK] Seq=7 Ack=31 Win=1022 Len=7
 77 3.805507 192.168.25.237 192.168.25.148 TCP 60 21 → 51126 [ACK] Seq=31 Ack=14 Win=33501 Len=0
 78 3.814234 192.168.25.237 192.168.25.148 FTP 83 Response: 250 CWD command successful.
 79 3.814285 192.168.25.148 192.168.25.237 TCP 54 51126 → 21 [ACK] Seq=14 Ack=60 Win=1022 Len=0
 80 3.814288 192.168.25.148 192.168.25.237 TCP 54 [TCP Dup ACK 79#1] 51126 → 21 [ACK] Seq=14 Ack=60 Win=1022 Len=0
 81 3.814402 192.168.25.148 192.168.25.237 FTP 59 Request: PWD
 82 3.814406 192.168.25.148 192.168.25.237 TCP 59 [TCP Retransmission] 51126 → 21 [PSH, ACK] Seq=14 Ack=60 Win=1022 Len=5
 83 3.825492 192.168.25.237 192.168.25.148 FTP 63 Response: 257 "/"
 84 3.825551 192.168.25.148 192.168.25.237 TCP 54 51126 → 21 [ACK] Seq=19 Ack=69 Win=1022 Len=0
 85 3.825554 192.168.25.148 192.168.25.237 TCP 54 [TCP Dup ACK 84#1] 51126 → 21 [ACK] Seq=19 Ack=69 Win=1022 Len=0
 86 3.825642 192.168.25.148 192.168.25.237 FTP 61 Request: CWD /
 87 3.825644 192.168.25.148 192.168.25.237 TCP 61 [TCP Retransmission] 51126 → 21 [PSH, ACK] Seq=19 Ack=69 Win=1022 Len=7
 88 3.830270 192.168.25.237 192.168.25.148 TCP 60 21 → 51126 [ACK] Seq=69 Ack=26 Win=33489 Len=0
 89 3.839588 192.168.25.237 192.168.25.148 FTP 83 Response: 250 CWD command successful.
 90 3.839640 192.168.25.148 192.168.25.237 TCP 54 51126 → 21 [ACK] Seq=26 Ack=98 Win=1022 Len=0
 91 3.839643 192.168.25.148 192.168.25.237 TCP 54 [TCP Dup ACK 90#1] 51126 → 21 [ACK] Seq=26 Ack=98 Win=1022 Len=0

Using the board with the two network interfaces, it takes much longer and there are many packets involved and many retransmissions:

193 11.069002 192.168.25.148 192.168.25.237 TCP 60 [TCP Retransmission] 51022 → 21 [PSH, ACK] Seq=1 Ack=1 Win=1022 Len=6
194 11.069069 192.168.25.148 192.168.25.237 TCP 54 51022 → 21 [FIN, ACK] Seq=7 Ack=1 Win=1022 Len=0
195 11.069071 192.168.25.148 192.168.25.237 TCP 54 [TCP Out-Of-Order] 51022 → 21 [FIN, ACK] Seq=7 Ack=1 Win=1022 Len=0
196 11.069386 192.168.25.148 192.168.25.237 TCP 66 51030 → 21 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=256 SACK_PERM=1
197 11.069389 192.168.25.148 192.168.25.237 TCP 66 [TCP Out-Of-Order] 51030 → 21 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=256 SACK_PERM=1
198 11.074372 192.168.25.237 192.168.25.148 TCP 72 21 → 51030 [SYN, ACK] Seq=0 Ack=1 Win=33580 Len=0 MSS=1460 WS=1 SACK_PERM=1
199 11.074488 192.168.25.148 192.168.25.237 TCP 54 51030 → 21 [ACK] Seq=1 Ack=1 Win=262144 Len=0
200 11.074502 192.168.25.148 192.168.25.237 TCP 54 [TCP Dup ACK 199#1] 51030 → 21 [ACK] Seq=1 Ack=1 Win=262144 Len=0
201 11.079234 192.168.25.237 192.168.25.148 FTP 100 Response: 220 Welcome to IDAL FTP server. READY.
202 11.079512 192.168.25.148 192.168.25.237 TCP 54 51030 → 21 [ACK] Seq=1 Ack=41 Win=261888 Len=0
203 11.079515 192.168.25.148 192.168.25.237 TCP 54 [TCP Dup ACK 202#1] 51030 → 21 [ACK] Seq=1 Ack=41 Win=261888 Len=0
204 11.080027 192.168.25.148 192.168.25.237 FTP 65 Request: USER exor
205 11.080030 192.168.25.148 192.168.25.237 TCP 65 [TCP Retransmission] 51030 → 21 [PSH, ACK] Seq=1 Ack=41 Win=261888 Len=11
207 11.092121 192.168.25.237 192.168.25.148 FTP 96 Response: 331 User name ok, need password.
208 11.092184 192.168.25.148 192.168.25.237 TCP 54 51030 → 21 [ACK] Seq=12 Ack=75 Win=261888 Len=0
209 11.092187 192.168.25.148 192.168.25.237 TCP 54 [TCP Dup ACK 208#1] 51030 → 21 [ACK] Seq=12 Ack=75 Win=261888 Len=0
210 11.092368 192.168.25.148 192.168.25.237 FTP 65 Request: PASS exor
211 11.092372 192.168.25.148 192.168.25.237 TCP 65 [TCP Retransmission] 51030 → 21 [PSH, ACK] Seq=12 Ack=75 Win=261888 Len=11
...
216 11.105868 192.168.25.148 192.168.25.237 TCP 68 [TCP Retransmission] 51030 → 21 [PSH, ACK] Seq=23 Ack=109 Win=261888 Len=14
222 11.405750 192.168.25.148 192.168.25.237 TCP 68 [TCP Retransmission] 51030 → 21 [PSH, ACK] Seq=23 Ack=109 Win=261888 Len=14
223 11.405764 192.168.25.148 192.168.25.237 TCP 68 [TCP Retransmission] 51030 → 21 [PSH, ACK] Seq=23 Ack=109 Win=261888 Len=14
224 11.414376 192.168.25.237 192.168.25.148 FTP 112 Response: 502 Unrecognized or unsupported command: "OPTS".
...
233 11.426814 192.168.25.148 192.168.25.237 TCP 61 [TCP Retransmission] 51030 → 21 [PSH, ACK] Seq=42 Ack=168 Win=261888 Len=7
...
238 11.440732 192.168.25.148 192.168.25.237 TCP 59 [TCP Retransmission] 51030 → 21 [PSH, ACK] Seq=49 Ack=197 Win=261888 Len=5
...
241 11.452219 192.168.25.148 192.168.25.237 TCP 54 [TCP Dup ACK 240#1] 51030 → 21 [ACK] Seq=54 Ack=206 Win=261888 Len=0
...
243 11.452606 192.168.25.148 192.168.25.237 TCP 61 [TCP Retransmission] 51030 → 21 [PSH, ACK] Seq=54 Ack=206 Win=261888 Len=7
...
299 13.769271 192.168.25.148 192.168.25.237 TCP 60 [TCP Retransmission] 51022 → 21 [FIN, PSH, ACK] Seq=1 Ack=1 Win=1022 Len=6
...
301 13.771940 192.168.25.237 192.168.25.148 TCP 68 21 → 51022 [RST] Seq=1 Win=0 Len=0
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.