@@ -1033,6 +1033,21 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
10331033 while ((flag = getopt_long (argc , argv , "p:f:i:D1VJvsc:ub:t:n:k:l:P:Rw:B:M:N46S:L:ZO:F:A:T:C:dI:hX:" , longopts , NULL )) != -1 ) {
10341034 switch (flag ) {
10351035 case 'p' :
1036+ slash = strchr (optarg , '/' );
1037+ if (slash ) {
1038+ * slash = '\0' ;
1039+ ++ slash ;
1040+ if (* slash != '\0' ) {
1041+ test -> num_of_server_ports = atoi (slash );
1042+ if (test -> num_of_server_ports < 1 || test -> num_of_server_ports > MAX_STREAMS ) {
1043+ i_errno = IENUMPORTS ;
1044+ return -1 ;
1045+ }
1046+ if (test -> num_of_server_ports > 1 ) {
1047+ server_flag = 1 ;
1048+ }
1049+ }
1050+ }
10361051 portno = atoi (optarg );
10371052 if (portno < 1 || portno > 65535 ) {
10381053 i_errno = IEBADPORT ;
@@ -1898,6 +1913,26 @@ iperf_exchange_parameters(struct iperf_test *test)
18981913 if (get_parameters (test ) < 0 )
18991914 return -1 ;
19001915
1916+ // Check spcific conditions required for UDP under Cygwin as it does not support parallel stream using same port
1917+ if (test -> protocol -> id == Pudp ) {
1918+ // Ensure UDP ports pool size if large enough for the required number of streams
1919+ if (test -> num_of_server_ports > 1 ) {
1920+ if (test -> num_of_server_ports < test -> num_streams ) {
1921+ i_errno = IEPORTNUM ;
1922+ return -1 ;
1923+ }
1924+ }
1925+ #if defined(__CYGWIN__ )
1926+ else {
1927+ // Parallel UDP streams under Cygwin must use different port number per stream
1928+ if (test -> num_streams > 1 ) {
1929+ i_errno = IECYGWINPORTSUDP ;
1930+ return -1 ;
1931+ }
1932+ }
1933+ #endif /* __CYGWIN__ */
1934+ }
1935+
19011936#if defined(HAVE_SSL )
19021937 if (test_is_authorized (test ) < 0 ){
19031938 if (iperf_set_send_state (test , SERVER_ERROR ) != 0 )
@@ -1913,7 +1948,7 @@ iperf_exchange_parameters(struct iperf_test *test)
19131948#endif //HAVE_SSL
19141949
19151950 if ((s = test -> protocol -> listen (test )) < 0 ) {
1916- if (iperf_set_send_state (test , SERVER_ERROR ) != 0 )
1951+ if (iperf_set_send_state (test , SERVER_ERROR ) != 0 )
19171952 return -1 ;
19181953 err = htonl (i_errno );
19191954 if (Nwrite (test -> ctrl_sck , (char * ) & err , sizeof (err ), Ptcp ) < 0 ) {
@@ -2631,6 +2666,8 @@ iperf_defaults(struct iperf_test *testp)
26312666 testp -> congestion_used = NULL ;
26322667 testp -> remote_congestion_used = NULL ;
26332668 testp -> server_port = PORT ;
2669+ testp -> num_of_server_ports = 0 ;
2670+ testp -> server_udp_streams_accepted = 0 ;
26342671 testp -> ctrl_sck = -1 ;
26352672 testp -> prot_listener = -1 ;
26362673 testp -> other_side_has_retransmits = 0 ;
@@ -2904,6 +2941,7 @@ iperf_reset_test(struct iperf_test *test)
29042941 test -> mode = RECEIVER ;
29052942 test -> sender_has_retransmits = 0 ;
29062943 set_protocol (test , Ptcp );
2944+ test -> server_udp_streams_accepted = 0 ;
29072945 test -> omit = OMIT ;
29082946 test -> duration = DURATION ;
29092947 test -> server_affinity = -1 ;
0 commit comments