@@ -112,8 +112,10 @@ iperf_server_worker_run(void *s) {
112112int
113113iperf_server_listen (struct iperf_test * test )
114114{
115+ int proto = (test -> udp_ctrl_sck ) ? Pudp : Ptcp ;
116+
115117 retry :
116- if ((test -> listener = netannounce (test -> settings -> domain , Ptcp , test -> bind_address , test -> bind_dev , test -> server_port )) < 0 ) {
118+ if ((test -> listener = netannounce (test -> settings -> domain , proto , test -> bind_address , test -> bind_dev , test -> server_port )) < 0 ) {
117119 if (errno == EAFNOSUPPORT && (test -> settings -> domain == AF_INET6 || test -> settings -> domain == AF_UNSPEC )) {
118120 /* If we get "Address family not supported by protocol", that
119121 ** probably means we were compiled with IPv6 but the running
@@ -157,32 +159,50 @@ iperf_accept(struct iperf_test *test)
157159 signed char rbuf = ACCESS_DENIED ;
158160 socklen_t len ;
159161 struct sockaddr_storage addr ;
162+ int rc ;
160163
161- len = sizeof (addr );
162- if ((s = accept (test -> listener , (struct sockaddr * ) & addr , & len )) < 0 ) {
163- i_errno = IEACCEPT ;
164- return ret ;
164+ if (test -> udp_ctrl_sck ) { // UDP Control Socket
165+ s = test -> listener ;
166+ }
167+ else { // TCP Control Socket
168+ len = sizeof (addr );
169+ if ((s = accept (test -> listener , (struct sockaddr * ) & addr , & len )) < 0 ) {
170+ i_errno = IEACCEPT ;
171+ return ret ;
172+ }
173+ }
174+
175+ /* UDP listener socket should be accepted to allow communication (including for sending Deny) */
176+ if (test -> udp_ctrl_sck ) { // UDP Control Socket
177+ if (test -> debug_level >= DEBUG_LEVEL_INFO ) {
178+ printf ("Accepting new Connection Request over UDP socket %d\n" , s );
179+ }
180+ if ((rc = iperf_udp_accept_socket (test , s )) < 0 ) {
181+ return rc ;
182+ }
165183 }
166184
167185 if (test -> ctrl_sck == -1 ) {
168186 /* Server free, accept new client */
169187 test -> ctrl_sck = s ;
170- // set TCP_NODELAY for lower latency on control messages
171- int flag = 1 ;
172- if (setsockopt (test -> ctrl_sck , IPPROTO_TCP , TCP_NODELAY , (char * ) & flag , sizeof (int ))) {
173- i_errno = IESETNODELAY ;
174- goto error_handling ;
175- }
188+ if (!test -> udp_ctrl_sck ) { // TCP Control Socket
189+ // set TCP_NODELAY for lower latency on control messages
190+ int flag = 1 ;
191+ if (setsockopt (test -> ctrl_sck , IPPROTO_TCP , TCP_NODELAY , (char * ) & flag , sizeof (int ))) {
192+ i_errno = IESETNODELAY ;
193+ goto error_handling ;
194+ }
176195
177196#if defined(HAVE_TCP_USER_TIMEOUT )
178- int opt ;
179- if ((opt = test -> settings -> snd_timeout )) {
180- if (setsockopt (s , IPPROTO_TCP , TCP_USER_TIMEOUT , & opt , sizeof (opt )) < 0 ) {
181- i_errno = IESETUSERTIMEOUT ;
182- goto error_handling ;
197+ int opt ;
198+ if ((opt = test -> settings -> snd_timeout )) {
199+ if (setsockopt (s , IPPROTO_TCP , TCP_USER_TIMEOUT , & opt , sizeof (opt )) < 0 ) {
200+ i_errno = IESETUSERTIMEOUT ;
201+ goto error_handling ;
202+ }
183203 }
184- }
185204#endif /* HAVE_TCP_USER_TIMEOUT */
205+ }
186206
187207 if (Nread (test -> ctrl_sck , test -> cookie , COOKIE_SIZE , Ptcp ) != COOKIE_SIZE ) {
188208 /*
@@ -220,6 +240,24 @@ iperf_accept(struct iperf_test *test)
220240 if (test -> debug )
221241 printf ("successfully sent ACCESS_DENIED to an unsolicited connection request during active test\n" );
222242 }
243+
244+ // Create new UDP listener socket. Done before closing the previous listener socket to allow the
245+ // ACCESS_DENIED message to be sent out of the server before the socket is closed.
246+ if (test -> udp_ctrl_sck ) {
247+ FD_CLR (s , & test -> read_set );
248+ if (test -> debug_level >= DEBUG_LEVEL_INFO ) {
249+ printf ("Creating new UDP Listener socket\n" );
250+ }
251+ if ((test -> listener = iperf_udp_listen (test )) < 0 ) {
252+ return -1 ;
253+ }
254+ if (test -> debug_level >= DEBUG_LEVEL_INFO ) {
255+ printf ("Created new UDP Listener socket=%d\n" , test -> listener );
256+ }
257+ FD_SET (test -> listener , & test -> read_set );
258+ test -> max_fd = (test -> max_fd < test -> listener ) ? test -> listener : test -> max_fd ;
259+ }
260+
223261 close (s );
224262 }
225263 return 0 ;
@@ -839,9 +877,14 @@ iperf_run_server(struct iperf_test *test)
839877
840878 if (rec_streams_accepted == streams_to_rec && send_streams_accepted == streams_to_send ) {
841879 if (test -> protocol -> id != Ptcp ) {
842- FD_CLR (test -> prot_listener , & test -> read_set );
843- close (test -> prot_listener );
844- test -> prot_listener = -1 ;
880+ if (test -> udp_ctrl_sck ) {
881+ test -> listener = test -> prot_listener ;
882+ test -> prot_listener = -1 ;
883+ } else {
884+ FD_CLR (test -> prot_listener , & test -> read_set );
885+ close (test -> prot_listener );
886+ test -> prot_listener = -1 ;
887+ }
845888 } else {
846889 if (test -> no_delay || test -> settings -> mss || test -> settings -> socket_bufsize ) {
847890 FD_CLR (test -> listener , & test -> read_set );
0 commit comments