Skip to content

UDP --bidir fails when Cygwin is server (works when Cygwin is client) #1992

@vikranthdatta

Description

@vikranthdatta

Summary

When running iperf3 in UDP bidirectional mode (--bidir) with a Cygwin-built iperf3 as the server, the server fails to create the reverse UDP stream, causing the test to fail immediately. The same Cygwin binary works correctly as a client.

Server (Cygwin/Windows) - FAILS:

iperf 3.19.1
CYGWIN_NT-10.0-22631 3.6.4-1.x86_64 / 3.6.5-1.x86_64
Windows 10/11 x86_64
Source: https://iperf.fr/iperf-download.php#windows

Client (Linux):

iperf 3.19.1
Linux 6.17.4+ aarch64

Steps to Reproduce

On Cygwin/Windows (server):
bash:
iperf3 -s -V -d

On Linux (client):
bash:
iperf3 -c -u -b 9M -t 10 --bidir

Expected Behavior

Server creates two UDP streams (one for each direction) and completes the bidirectional test.

Actual Behavior

Server creates only one stream, then immediately transitions to IPERF_DONE state. Client fails with:

iperf3: error - unable to read from stream socket: Resource temporarily unavailable

Debug Output

Cygwin Server (-V -d):

iperf 3.19.1
CYGWIN_NT-10.0-22631 3.6.4-1.x86_64

Server listening on 5201 (test #1)

State change: State set to 9-PARAM_EXCHANGE
get_parameters:
{
"udp": true,
"omit": 0,
"time": 10,
"parallel": 1,
"bidirectional": true,
"len": 1448,
"bandwidth": 9000000,
"client_version": "3.19.1"
}
State change: State set to 10-CREATE_STREAMS
Accepted connection from 165.26.78.71, port 48374
Cookie: xmsg262jb2uxg2ipjmuymtbqe6qpngqeicmt
Target Bitrate: 9000000
SNDBUF is 65536, expecting 0
RCVBUF is 65536, expecting 0
Setting application pacing to 1125000
[ 5] local 165.26.78.67 port 5201 connected to 165.26.78.71 port 35471
Reading new State from the Client - current state is 10-CREATE_STREAMS
State change: server received and changed State to 16-IPERF_DONE ← BUG: Only 1 stream created
All threads stopped

Linux Client:

Connecting to host 165.26.78.67, port 5201
[ 5] local 165.26.78.71 port 35471 connected to 165.26.78.67 port 5201
iperf3: error - unable to read from stream socket: Resource temporarily unavailable

Same Binary Works as Client

When roles are swapped (Linux=server, Cygwin=client), the same Cygwin binary works perfectly:

Linux Server:

iperf 3.19.1
Linux T7RX-DV 6.17.4+ aarch64

Server listening on 5201 (test #1)

[ 5] local 165.26.78.71 port 5201 connected to 165.26.78.67 port 54250
[ 6] local 165.26.78.71 port 5201 connected to 165.26.78.67 port 54251 ← Both streams created
Starting Test: protocol: UDP, 1 streams, 1460 byte blocks...
[ ID][Role] Interval Transfer Bitrate Jitter Lost/Total
[ 5][RX-S] 0.00-10.02 sec 10.7 MBytes 8.99 Mbits/sec 0.147 ms 0/7710 (0%)
[ 6][TX-S] 0.00-10.02 sec 10.7 MBytes 9.00 Mbits/sec 0/7720 (0%)

Cygwin Client:

Connecting to host 165.26.78.71, port 5201
[ 5] local 165.26.78.67 port 54250 connected to 165.26.78.71 port 5201
[ 7] local 165.26.78.67 port 54251 connected to 165.26.78.71 port 5201
...
[ 5][TX-C] 0.00-10.02 sec 10.7 MBytes 8.99 Mbits/sec 0/7710 (0%) sender
[ 7][RX-C] 0.00-10.02 sec 10.7 MBytes 9.00 Mbits/sec 0/7719 (0%) receiver
iperf Done.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions