6363#include <sys/cpuset.h>
6464#endif /* HAVE_CPUSET_SETAFFINITY */
6565
66- #if defined(__CYGWIN__ ) || defined( _WIN32 ) || defined( _WIN64 ) || defined( __WINDOWS__ )
66+ #if defined(WINDOWS_ANY )
6767#define CPU_SETSIZE __CPU_SETSIZE
68- #endif /* __CYGWIN__, _WIN32, _WIN64, __WINDOWS__ */
68+ #endif /* WINDOWS_ANY */
6969
7070#if defined(HAVE_SETPROCESSAFFINITYMASK )
7171#include <Windows.h>
@@ -1131,12 +1131,30 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
11311131 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 ) {
11321132 switch (flag ) {
11331133 case 'p' :
1134- portno = atoi (optarg );
1135- if (portno < 1 || portno > 65535 ) {
1136- i_errno = IEBADPORT ;
1137- return -1 ;
1134+ slash = optarg ;
1135+ #if defined(WINDOWS_ANY )
1136+ slash = strchr (optarg , '/' );
1137+ if (slash ) {
1138+ * slash = '\0' ;
1139+ ++ slash ;
1140+ if (* slash != '\0' ) {
1141+ test -> num_server_ports = atoi (slash );
1142+ if (test -> num_server_ports < 1 || test -> num_server_ports > MAX_STREAMS ) {
1143+ i_errno = IENUMPORTS ;
1144+ return -1 ;
1145+ }
1146+ server_flag = 1 ;
1147+ }
11381148 }
1139- test -> server_port = portno ;
1149+ #endif /* WINDOWS_ANY */
1150+ if (!slash || strlen (optarg ) > 0 ) {
1151+ portno = atoi (optarg );
1152+ if (portno < 1 || portno > 65535 ) {
1153+ i_errno = IEBADPORT ;
1154+ return -1 ;
1155+ }
1156+ test -> server_port = portno ;
1157+ }
11401158 break ;
11411159 case 'f' :
11421160 if (!optarg ) {
@@ -1289,7 +1307,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
12891307 break ;
12901308 case 'P' :
12911309 test -> num_streams = atoi (optarg );
1292- if (test -> num_streams > MAX_STREAMS ) {
1310+ if (test -> num_streams > MAX_STREAMS || test -> num_streams < 1 ) {
12931311 i_errno = IENUMSTREAMS ;
12941312 return -1 ;
12951313 }
@@ -2071,6 +2089,17 @@ iperf_exchange_parameters(struct iperf_test *test)
20712089 if (get_parameters (test ) < 0 )
20722090 return -1 ;
20732091
2092+ // Check spcific conditions required for UDP under Windows as parallel streams
2093+ // using the same port numebr is not supported.
2094+ #if defined(WINDOWS_ANY )
2095+ if (test -> protocol -> id == Pudp ) {
2096+ if (test -> num_server_ports < test -> num_streams * (test -> bidirectional ? 2 : 1 )) {
2097+ i_errno = IEPORTNUM ;
2098+ return -1 ;
2099+ }
2100+ }
2101+ #endif /* WINDOWS_ANY */
2102+
20742103#if defined(HAVE_SSL )
20752104 if (test_is_authorized (test ) < 0 ){
20762105 if (iperf_set_send_state (test , SERVER_ERROR ) != 0 )
@@ -2086,7 +2115,7 @@ iperf_exchange_parameters(struct iperf_test *test)
20862115#endif //HAVE_SSL
20872116
20882117 if ((s = test -> protocol -> listen (test )) < 0 ) {
2089- if (iperf_set_send_state (test , SERVER_ERROR ) != 0 )
2118+ if (iperf_set_send_state (test , SERVER_ERROR ) != 0 )
20902119 return -1 ;
20912120 err = htonl (i_errno );
20922121 if (Nwrite (test -> ctrl_sck , (char * ) & err , sizeof (err ), Ptcp ) < 0 ) {
@@ -2809,6 +2838,8 @@ iperf_defaults(struct iperf_test *testp)
28092838 testp -> congestion_used = NULL ;
28102839 testp -> remote_congestion_used = NULL ;
28112840 testp -> server_port = PORT ;
2841+ testp -> num_server_ports = 1 ;
2842+ testp -> server_udp_streams_accepted = 0 ;
28122843 testp -> ctrl_sck = -1 ;
28132844 testp -> listener = -1 ;
28142845 testp -> prot_listener = -1 ;
@@ -3083,6 +3114,7 @@ iperf_reset_test(struct iperf_test *test)
30833114 test -> mode = RECEIVER ;
30843115 test -> sender_has_retransmits = 0 ;
30853116 set_protocol (test , Ptcp );
3117+ test -> server_udp_streams_accepted = 0 ;
30863118 test -> omit = OMIT ;
30873119 test -> duration = DURATION ;
30883120 test -> server_affinity = -1 ;
0 commit comments