102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef lint
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar	nettest_id[]="\
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)nettest_bsd.c (c) Copyright 1993-2004 Hewlett-Packard Co. Version 2.4.3";
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* lint */
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	nettest_bsd.c						*/
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      the BSD sockets parsing routine...                      */
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*       ...with the addition of Windows NT, this is now also   */
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*          a Winsock test... sigh :)                           */
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      scan_sockets_args()                                     */
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	the actual test routines...				*/
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_tcp_stream()	perform a tcp stream test	*/
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_tcp_stream()					*/
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      send_tcp_maerts()       perform a tcp stream test       */
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      recv_tcp_maerts()       in the other direction          */
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_tcp_rr()		perform a tcp request/response	*/
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_tcp_rr()						*/
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      send_tcp_conn_rr()      an RR test including connect    */
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      recv_tcp_conn_rr()                                      */
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      send_tcp_cc()           a connect/disconnect test with  */
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      recv_tcp_cc()           no RR                           */
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_udp_stream()	perform a udp stream test	*/
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_udp_stream()					*/
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_udp_rr()		perform a udp request/response	*/
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_udp_rr()						*/
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	loc_cpu_rate()		determine the local cpu maxrate */
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	rem_cpu_rate()		find the remote cpu maxrate	*/
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_CONFIG_H
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <config.h>
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_SYS_TYPES_H
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/types.h>
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_SYS_STAT_H
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/stat.h>
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if STDC_HEADERS
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stdlib.h>
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stddef.h>
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDLIB_H
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <stdlib.h>
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_STRING_H
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if !STDC_HEADERS && HAVE_MEMORY_H
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <memory.h>
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <string.h>
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_STRINGS_H
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <strings.h>
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_INTTYPES_H
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <inttypes.h>
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDINT_H
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <stdint.h>
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_UNISTD_H
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <unistd.h>
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <fcntl.h>
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <signal.h>
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if TIME_WITH_SYS_TIME
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/time.h>
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <time.h>
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_SYS_TIME_H
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <sys/time.h>
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# else
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <time.h>
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef NOSTDLIBH
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <malloc.h>
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* NOSTDLIBH */
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if !defined(__VMS)
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/ipc.h>
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* !defined(__VMS) */
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/socket.h>
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/in.h>
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/tcp.h>
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <arpa/inet.h>
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netdb.h>
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* WIN32 */
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <process.h>
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define netperf_socklen_t socklen_t
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <winsock2.h>
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* while it is unlikely that anyone running Windows 2000 or NT 4 is
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   going to be trying to compile this, if they are they will want to
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   define DONT_IPV6 in the sources file */
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef DONT_IPV6
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <ws2tcpip.h>
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <windows.h>
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define sleep(x) Sleep((x)*1000)
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define __func__ __FUNCTION__
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* We don't want to use bare constants in the shutdown() call.  In the
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   extremely unlikely event that SHUT_WR isn't defined, we will define
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   it to the value we used to be passing to shutdown() anyway.  raj
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   2007-02-08 */
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if !defined(SHUT_WR)
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define SHUT_WR 1
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include "missing/getaddrinfo.h"
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "nettest_bsd.h"
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_HISTOGRAM) || defined(WANT_DEMO)
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "hist.h"
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* make first_burst_size unconditional so we can use it easily enough
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   when calculating transaction latency for the TCP_RR test. raj
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   2007-06-08 */
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint first_burst_size=0;
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(HAVE_SENDFILE) && (defined(__linux) || defined(__sun__))
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/sendfile.h>
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* HAVE_SENDFILE && (__linux || __sun__) */
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* these variables are specific to the BSD sockets tests, but can
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * be used elsewhere if needed.  They are externed through nettest_bsd.h
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rss_size_req = -1,	/* requested remote socket send buffer size */
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rsr_size_req = -1,	/* requested remote socket recv buffer size */
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rss_size,		/* remote socket send buffer size	*/
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rsr_size,		/* remote socket recv buffer size	*/
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = -1,	/* requested local socket send buffer size */
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = -1,	/* requested local socket recv buffer size */
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size,		/* local  socket send buffer size 	*/
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size,		/* local  socket recv buffer size 	*/
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  req_size = 1,		/* request size                   	*/
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rsp_size = 1,		/* response size			*/
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_size,		/* how big are individual sends		*/
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_size;		/* how big are individual receives	*/
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  int confidence_iteration;
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  char  local_cpu_method;
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  char  remote_cpu_method;
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* these will control the width of port numbers we try to use in the */
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* TCP_CRR and/or TCP_TRR tests. raj 3/95 */
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int client_port_min = 5000;
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int client_port_max = 65535;
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* different options for the sockets				*/
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay,		/* don't/do use NODELAY	locally		*/
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_nodelay,		/* don't/do use NODELAY remotely	*/
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef TCP_CORK
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_tcpcork=0,        /* don't/do use TCP_CORK locally        */
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_tcpcork=0,        /* don't/do use TCP_CORK remotely       */
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_CORK */
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid,		/* avoid send copies locally		*/
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid,		/* avoid recv copies locally		*/
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_sndavoid,		/* avoid send copies remotely		*/
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_rcvavoid, 	/* avoid recv_copies remotely		*/
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_connected = 0,  /* local socket type, connected/non-connected */
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  remote_connected = 0; /* remote socket type, connected/non-connected */
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_GETHRTIME
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t time_one;
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t time_two;
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif HAVE_GET_HRT
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "hrt.h"
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrt_t time_one;
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrt_t time_two;
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined(WIN32)
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER time_one;
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER time_two;
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval time_one;
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval time_two;
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* HAVE_GETHRTIME */
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic HIST time_hist;
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint interval_count;
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WANT_SPIN
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsigset_t signal_set;
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define INTERVALS_INIT() \
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (interval_burst) { \
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the \
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         interval timer. we used to use it for demo mode, but we deal \
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 with that with a variant on watching the clock rather than \
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 waiting for a timer. raj 2006-02-06 */ \
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate); \
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } \
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst; \
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */ \
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) { \
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, \
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "%s: unable to get sigmask errno %d\n", \
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      __func__, \
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno); \
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where); \
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1); \
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define INTERVALS_WAIT() \
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter \
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 to decide to sleep for a little bit */ \
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) { \
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* call sigsuspend and wait for the interval timer to get us \
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   out */ \
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug > 1) { \
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"about to suspend\n"); \
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where); \
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} \
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sigsuspend(&signal_set) == EFAULT) { \
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where, \
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "%s: fault with sigsuspend.\n", \
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                  __func__); \
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where); \
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1); \
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} \
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	interval_count = interval_burst; \
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* first out timestamp */
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_GETHRTIME
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t intvl_one;
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t intvl_two;
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t *intvl_one_ptr = &intvl_one;
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t *intvl_two_ptr = &intvl_two;
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t *temp_intvl_ptr = &intvl_one;
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined(WIN32)
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER intvl_one;
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER intvl_two;
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER *intvl_one_ptr = &intvl_one;
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER *intvl_two_ptr = &intvl_two;
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER *temp_intvl_ptr = &intvl_one;
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval intvl_one;
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval intvl_two;
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval *intvl_one_ptr = &intvl_one;
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval *intvl_two_ptr = &intvl_two;
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval *temp_intvl_ptr = &intvl_one;
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define INTERVALS_INIT() \
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (interval_burst) { \
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(intvl_one_ptr); \
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      } \
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      interval_count = interval_burst; \
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define INTERVALS_WAIT() \
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter \
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 to decide to sleep for a little bit */ \
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) { \
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* call sigsuspend and wait for the interval timer to get us \
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   out */ \
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug > 1) { \
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"about to spin suspend\n"); \
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where); \
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} \
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        HIST_timestamp(intvl_two_ptr); \
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        while(delta_micro(intvl_one_ptr,intvl_two_ptr) < interval_usecs) { \
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  HIST_timestamp(intvl_two_ptr); \
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} \
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_intvl_ptr = intvl_one_ptr; \
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	intvl_one_ptr = intvl_two_ptr; \
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	intvl_two_ptr = temp_intvl_ptr; \
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	interval_count = interval_burst; \
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_GETHRTIME
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t demo_one;
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t demo_two;
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t *demo_one_ptr = &demo_one;
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t *demo_two_ptr = &demo_two;
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic hrtime_t *temp_demo_ptr = &demo_one;
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined(WIN32)
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER demo_one;
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER demo_two;
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER *demo_one_ptr = &demo_one;
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER *demo_two_ptr = &demo_two;
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic LARGE_INTEGER *temp_demo_ptr = &demo_one;
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval demo_one;
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval demo_two;
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval *demo_one_ptr = &demo_one;
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval *demo_two_ptr = &demo_two;
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval *temp_demo_ptr = &demo_one;
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* for a _STREAM test, "a" should be lss_size and "b" should be
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   rsr_size. for a _MAERTS test, "a" should be lsr_size and "b" should
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   be rss_size. raj 2005-04-06 */
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DEMO_STREAM_SETUP(a,b) \
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((demo_mode) && (demo_units == 0)) { \
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* take our default value of demo_units to be the larger of \
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 twice the remote's SO_RCVBUF or twice our SO_SNDBUF */ \
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (a > b) { \
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	demo_units = 2*a; \
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      } \
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else { \
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	demo_units = 2*b; \
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      } \
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DEMO_STREAM_INTERVAL(units) \
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) { \
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	double actual_interval; \
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	units_this_tick += units; \
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (units_this_tick >= demo_units) { \
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* time to possibly update demo_units and maybe output an \
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     interim result */ \
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  HIST_timestamp(demo_two_ptr); \
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  actual_interval = delta_micro(demo_one_ptr,demo_two_ptr); \
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we always want to fine-tune demo_units here whether we \
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     emit an interim result or not.  if we are short, this \
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     will lengthen demo_units.  if we are long, this will \
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     shorten it */ \
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  demo_units = demo_units * (demo_interval / actual_interval); \
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if (actual_interval >= demo_interval) { \
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* time to emit an interim result */ \
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where, \
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    "Interim result: %7.2f %s/s over %.2f seconds\n", \
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    calc_thruput_interval(units_this_tick, \
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					  actual_interval/1000000.0), \
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    format_units(), \
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    actual_interval/1000000.0); \
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fflush(where); \
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    units_this_tick = 0.0; \
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* now get a new starting timestamp.  we could be clever \
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       and swap pointers - the math we do probably does not \
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       take all that long, but for now this will suffice */ \
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    temp_demo_ptr = demo_one_ptr; \
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    demo_one_ptr = demo_two_ptr; \
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    demo_two_ptr = temp_demo_ptr; \
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  } \
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} \
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DEMO_RR_SETUP(a) \
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((demo_mode) && (demo_units == 0)) { \
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* take whatever we are given */ \
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	demo_units = a; \
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DEMO_RR_INTERVAL(units) \
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) { \
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	double actual_interval; \
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	units_this_tick += units; \
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (units_this_tick >= demo_units) { \
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* time to possibly update demo_units and maybe output an \
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     interim result */ \
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  HIST_timestamp(demo_two_ptr); \
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  actual_interval = delta_micro(demo_one_ptr,demo_two_ptr); \
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we always want to fine-tune demo_units here whether we \
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     emit an interim result or not.  if we are short, this \
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     will lengthen demo_units.  if we are long, this will \
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     shorten it */ \
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  demo_units = demo_units * (demo_interval / actual_interval); \
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if (actual_interval >= demo_interval) { \
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* time to emit an interim result */ \
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where, \
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    "Interim result: %.2f %s/s over %.2f seconds\n", \
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    units_this_tick / (actual_interval/1000000.0), \
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    "Trans", \
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    actual_interval/1000000.0); \
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    units_this_tick = 0.0; \
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* now get a new starting timestamp.  we could be clever \
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       and swap pointers - the math we do probably does not \
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       take all that long, but for now this will suffice */ \
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    temp_demo_ptr = demo_one_ptr; \
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    demo_one_ptr = demo_two_ptr; \
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    demo_two_ptr = temp_demo_ptr; \
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  } \
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} \
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar sockets_usage[] = "\n\
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectUsage: netperf [global options] -- [test options] \n\
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectTCP/UDP BSD Sockets Test Options:\n\
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -b number         Send number requests at start of _RR tests\n\
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -C                Set TCP_CORK when available\n\
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -D [L][,R]        Set TCP_NODELAY locally and/or remotely (TCP_*)\n\
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -h                Display this text\n\
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -H name,fam       Use name (or IP) and family as target of data connection\n\
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -L name,fam       Use name (or IP) and family as source of data connection\n\
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -m bytes          Set the send size (TCP_STREAM, UDP_STREAM)\n\
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -M bytes          Set the recv size (TCP_STREAM, UDP_STREAM)\n\
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -n                Use the connected socket for UDP locally\n\
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -N                Use the connected socket for UDP remotely\n\
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -p min[,max]      Set the min/max port numbers for TCP_CRR, TCP_TRR\n\
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -P local[,remote] Set the local/remote port for the data socket\n\
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -r req,[rsp]      Set request/response sizes (TCP_RR, UDP_RR)\n\
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -s send[,recv]    Set local socket send/recv buffer sizes\n\
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -S send[,recv]    Set remote socket send/recv buffer sizes\n\
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -4                Use AF_INET (eg IPv4) on both ends of the data conn\n\
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -6                Use AF_INET6 (eg IPv6) on both ends of the data conn\n\
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectFor those options taking two parms, at least one must be specified;\n\
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectspecifying one value without a comma will set both parms to that\n\
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvalue, specifying a value with a leading comma will set just the second\n\
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectparm, a value with a trailing comma will set just the first. To set\n\
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecteach parm to unique values, specify both and separate them with a\n\
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcomma.\n";
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* these routines convert between the AF address space and the NF
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   address space since the numeric values of AF_mumble are not the
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   same across the platforms. raj 2005-02-08 */
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnf_to_af(int nf) {
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch(nf) {
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case NF_INET:
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return AF_INET;
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case NF_UNSPEC:
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return AF_UNSPEC;
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case NF_INET6:
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return AF_INET6;
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return AF_UNSPEC;
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return AF_UNSPEC;
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectaf_to_nf(int af) {
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch(af) {
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET:
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return NF_INET;
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_UNSPEC:
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return NF_UNSPEC;
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET6:
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return NF_INET6;
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return NF_UNSPEC;
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* This routine is intended to retrieve interesting aspects of tcp */
49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for the data connection. at first, it attempts to retrieve the */
49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* maximum segment size. later, it might be modified to retrieve */
50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* other information, but it must be information that can be */
50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* retrieved quickly as it is called during the timing of the test. */
50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for that reason, a second routine may be created that can be */
50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* called outside of the timing loop */
50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic
50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_tcp_info(SOCKET socket, int *mss)
50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef TCP_MAXSEG
51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t sock_opt_len;
51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_opt_len = sizeof(netperf_socklen_t);
51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockopt(socket,
51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 getprotobyname("tcp")->p_proto,
51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 TCP_MAXSEG,
51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (char *)mss,
51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 &sock_opt_len) == SOCKET_ERROR) {
51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: get_tcp_info: getsockopt TCP_MAXSEG: errno %d\n",
52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *mss = -1;
52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *mss = -1;
52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_MAXSEG */
52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* return a pointer to a completed addrinfo chain - prefer
53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   data_address to controlhost and utilize the specified address
53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   family */
53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct addrinfo *
53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcomplete_addrinfo(char *controlhost, char *data_address, char *port, int family, int type, int protocol, int flags)
53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo hints;
53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *res;
53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *temp_res;
54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CHANGED_SOCK_TYPE  0x1
54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CHANGED_PROTOCOL   0x2
54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CHANGED_SCTP       0x4
54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int    change_info = 0;
54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  static int change_warning_displayed = 0;
54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int count = 0;
54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int error = 0;
54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *hostname;
55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* take data-address over controlhost */
55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (data_address)
55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    hostname = data_address;
55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else
55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    hostname = controlhost;
55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
56002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "complete_addrinfo using hostname %s port %s family %s type %s prot %s flags 0x%x\n",
56102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    hostname,
56202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    port,
56302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    inet_ftos(family),
56402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    inet_ttos(type),
56502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    inet_ptos(protocol),
56602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    flags);
56702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
56802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
56902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  memset(&hints, 0, sizeof(hints));
57102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_family = family;
57202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_socktype = type;
57302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_protocol = protocol;
57402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_flags = flags|AI_CANONNAME;
57502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  count = 0;
57702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  do {
57802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    error = getaddrinfo((char *)hostname,
57902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        (char *)port,
58002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        &hints,
58102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        &res);
58202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    count += 1;
58302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (error == EAI_AGAIN) {
58402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
58502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"Sleeping on getaddrinfo EAI_AGAIN\n");
58602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
58702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
58802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sleep(1);
58902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
59002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* while you see this kludge first, it is actually the second, the
59102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       first being the one for Solaris below. The need for this kludge
59202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       came after implementing the Solaris broken getaddrinfo kludge -
59302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       now we see a kludge in Linux getaddrinfo where if it is given
59402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       SOCK_STREAM and IPPROTO_SCTP it barfs with a -7
59502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       EAI_SOCKTYPE. so, we check if the error was EAI_SOCKTYPE and if
59602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       we were asking for IPPROTO_SCTP and if so, kludge, again... raj
59702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2008-10-13 */
59802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_SCTP
59902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (EAI_SOCKTYPE == error
60002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef EAI_BADHINTS
60102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        || EAI_BADHINTS == error
60202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
60302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        ) {
60402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we ass-u-me this is the Linux getaddrinfo bug, clear the
60502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 hints.ai_protocol field, and set some state "remembering"
60602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that we did this so the code for the Solaris kludge can do
60702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 the fix-up for us.  also flip error over to EAI_AGAIN and
60802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 make sure we don't "count" this time around the loop. */
60902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      hints.ai_protocol = 0;
61002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      error = EAI_AGAIN;
61102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      count -= 1;
61202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      change_info |= CHANGED_SCTP;
61302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
61402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
61502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } while ((error == EAI_AGAIN) && (count <= 5));
61602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
61702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (error) {
61802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
61902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "complete_addrinfo: could not resolve '%s' port '%s' af %d",
62002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    hostname,
62102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    port,
62202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    family);
62302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
62402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "\n\tgetaddrinfo returned %d %s\n",
62502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    error,
62602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    gai_strerror(error));
62702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
62802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
62902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
63002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* there exists at least one platform - Solaris 10 - that does not
63202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     seem to completely honor the ai_protocol and/or ai_socktype one
63302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     sets in the hints parm to the getaddrinfo call.  so, we need to
63402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     walk the list of entries returned and if either of those do not
63502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     match what we asked for, we need to go ahead and set them
63602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     "correctly" this is based in part on some earlier SCTP-only code
63702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     from previous revisions.  raj 2006-10-09 */
63802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_res = res;
64002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (temp_res) {
64202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((type)  &&
64402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	(temp_res->ai_socktype != type)) {
64502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      change_info |= CHANGED_SOCK_TYPE;
64602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
64702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
64802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"WARNING! Changed bogus getaddrinfo socket type %d to %d\n",
64902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		temp_res->ai_socktype,
65002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		type);
65102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
65202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
65302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_res->ai_socktype = type;
65402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
65502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((protocol) &&
65702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	(temp_res->ai_protocol != protocol)) {
65802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      change_info |= CHANGED_PROTOCOL;
65902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
66002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
66102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"WARNING! Changed bogus getaddrinfo protocol %d to %d\n",
66202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		temp_res->ai_protocol,
66302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		protocol);
66402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
66502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
66602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_res->ai_protocol = protocol;
66702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
66802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_res = temp_res->ai_next;
66902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
67002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
67102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((change_info & CHANGED_SOCK_TYPE) &&
67202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      !(change_warning_displayed & CHANGED_SOCK_TYPE)) {
67302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    change_warning_displayed |= CHANGED_SOCK_TYPE;
67402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
67502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "WARNING! getaddrinfo returned a socket type which did not\n");
67602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
67702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "match the requested type.  Please contact your vendor for\n");
67802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
67902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "a fix to this bug in getaddrinfo()\n");
68002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
68102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
68202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* if we dropped the protocol hint, it would be for a protocol that
68402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     getaddrinfo() wasn't supporting yet, not for the bug that it took
68502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     our hint and still returned zero. raj 2006-10-16 */
68602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((change_info & CHANGED_PROTOCOL) &&
68702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      !(change_warning_displayed & CHANGED_PROTOCOL) &&
68802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (hints.ai_protocol != 0)) {
68902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    change_warning_displayed |= CHANGED_PROTOCOL;
69002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
69102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "WARNING! getaddrinfo returned a protocol other than the\n");
69202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
69302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "requested protocol.  Please contact your vendor for\n");
69402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
69502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "a fix to this bug in getaddrinfo()\n");
69602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
69702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
69802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((change_info & CHANGED_SCTP) &&
70002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      !(change_warning_displayed & CHANGED_SCTP)) {
70102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    change_warning_displayed |= CHANGED_SCTP;
70202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
70302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "WARNING! getaddrinfo on this platform does not accept IPPROTO_SCTP!\n");
70402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
70502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Please contact your vendor for a fix to this bug in getaddrinfo().\n");
70602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
70702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
70802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
70902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
71102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_addrinfo(where, res, hostname, port, family);
71202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
71302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(res);
71502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
71602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
71802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcomplete_addrinfos(struct addrinfo **remote,struct addrinfo **local, char remote_host[], int type, int protocol, int flags) {
71902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *remote = complete_addrinfo(remote_host,
72102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      remote_data_address,
72202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      remote_data_port,
72302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      remote_data_family,
72402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      type,
72502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      protocol,
72602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      flags);
72702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* OK, if the user has not specified a local data endpoint address
72902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     (test-specific -L), pick the local data endpoint address based on
73002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     the remote data family info (test-specific -H or -4 or -6
73102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     option).  if the user has not specified remote data addressing
73202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     info (test-specific -H, -4 -6) pick something based on the local
73302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     control connection address (ie the global -L option). */
73402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (NULL == local_data_address) {
73602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_data_address = malloc(HOSTNAMESIZE);
73702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (NULL == remote_data_address) {
73802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
73902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
74002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"local_data_address not set, using local_host_name of '%s'\n",
74102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_host_name);
74202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
74302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
74402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      strcpy(local_data_address,local_host_name);
74502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
74602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
74702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
74802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
74902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"local_data_address not set, using address family info\n");
75002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
75102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
75202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by default, use 0.0.0.0 - assume IPv4 */
75302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      strcpy(local_data_address,"0.0.0.0");
75402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
75502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((AF_INET6 == local_data_family) ||
75602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  ((AF_UNSPEC == local_data_family) &&
75702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   (AF_INET6 == remote_data_family)) ||
75802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  ((AF_UNSPEC == local_data_family) &&
75902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   (AF_INET6 == (*remote)->ai_family))) {
76002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strcpy(local_data_address,"::0");
76102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
76202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
76302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
76402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
76502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
76602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *local = complete_addrinfo("what to put here?",
76702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     local_data_address,
76802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     local_data_port,
76902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     local_data_family,
77002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     type,
77102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     protocol,
77202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     flags|AI_PASSIVE);
77302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
77502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
77702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectset_hostname_and_port(char *hostname, char *portstr, int family, int port)
77802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
77902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strcpy(hostname,"0.0.0.0");
78002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined AF_INET6
78102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (AF_INET6 == family) {
78202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(hostname,"::0");
78302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
78402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
78502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
78602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sprintf(portstr, "%u", port);
78702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
78802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
78902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
79002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic unsigned short
79102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_port_number(struct addrinfo *res)
79202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
79302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project switch(res->ai_family) {
79402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET: {
79502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sockaddr_in *foo = (struct sockaddr_in *)res->ai_addr;
79602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(ntohs(foo->sin_port));
79702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
79802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
79902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
80002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET6: {
80102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sockaddr_in6 *foo = (struct sockaddr_in6 *)res->ai_addr;
80202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(ntohs(foo->sin6_port));
80302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
80402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
80502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
80602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
80702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
80802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Unexpected Address Family of %u\n",res->ai_family);
80902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
81002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
81102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
81202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
81302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
81402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* this routine will set the port number of the sockaddr in the
81502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   addrinfo to the specified value, based on the address family */
81602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
81702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectset_port_number(struct addrinfo *res, unsigned short port)
81802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
81902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch(res->ai_family) {
82002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET: {
82102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sockaddr_in *foo = (struct sockaddr_in *)res->ai_addr;
82202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    foo->sin_port = htons(port);
82302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
82402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
82502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
82602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET6: {
82702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sockaddr_in6 *foo = (struct sockaddr_in6 *)res->ai_addr;
82802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    foo->sin6_port = htons(port);
82902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
83002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
83102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
83202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
83302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
83402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Unexpected Address Family of %u\n",res->ai_family);
83502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
83602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
83702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
83802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
83902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* This routine will create a data (listen) socket with the
84302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  apropriate options set and return it to the caller. this replaces
84402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  all the duplicate code in each of the test routines and should help
84502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  make things a little easier to understand. since this routine can be
84602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  called by either the netperf or netserver programs, all output
84702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  should be directed towards "where." family is generally AF_INET and
84802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  type will be either SOCK_STREAM or SOCK_DGRAM.  This routine will
84902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  also be used by the "SCTP" tests, hence the slightly strange-looking
85002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SCTP stuff in the classic bsd sockets test file... vlad/raj
85102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  2005-03-15 */
85202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSOCKET
85402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcreate_data_socket(struct addrinfo *res)
85502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
85602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET temp_socket;
85802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int one;
85902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int    on  = 1;
86002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*set up the data socket                        */
86302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_socket = socket(res->ai_family,
86402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       res->ai_socktype,
86502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       res->ai_protocol);
86602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (temp_socket == INVALID_SOCKET){
86802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
86902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_data_socket: socket: errno %d fam %s type %s prot %s errmsg %s\n",
87002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
87102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    inet_ftos(res->ai_family),
87202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    inet_ttos(res->ai_socktype),
87302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    inet_ptos(res->ai_protocol),
87402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    strerror(errno));
87502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
87602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
87702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
87802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
88002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"create_data_socket: socket %d obtained...\n",temp_socket);
88102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
88202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
88302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
88402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Modify the local socket size. The reason we alter the send buffer
88502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   size here rather than when the connection is made is to take care
88602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   of decreases in buffer size. Decreasing the window size after
88702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   connection establishment is a TCP no-no. Also, by setting the
88802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   buffer (window) size before the connection is established, we can
88902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   control the TCP MSS (segment size). The MSS is never (well, should
89002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   never be) more that 1/2 the minimum receive buffer size at each
89102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   half of the connection.  This is why we are altering the receive
89202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   buffer size on the sending size of a unidirectional transfer. If
89302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   the user has not requested that the socket buffers be altered, we
89402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   will try to find-out what their values are. If we cannot touch the
89502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   socket buffer in any way, we will set the values to -1 to indicate
89602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   that.  */
89702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the oogy nitty gritty stuff moved from here into the routine
89902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     being called below, per patches from davidm to workaround the bug
90002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     in Linux getsockopt().  raj 2004-06-15 */
90102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_sock_buffer (temp_socket, SEND_BUFFER, lss_size_req, &lss_size);
90202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_sock_buffer (temp_socket, RECV_BUFFER, lsr_size_req, &lsr_size);
90302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now, we may wish to enable the copy avoidance features on the */
90502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local system. of course, this may not be possible... */
90602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_RCV_COPYAVOID
90802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (loc_rcvavoid) {
90902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (setsockopt(temp_socket,
91002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   SOL_SOCKET,
91102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   SO_RCV_COPYAVOID,
91202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   (const char *)&loc_rcvavoid,
91302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   sizeof(int)) == SOCKET_ERROR) {
91402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
91502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: create_data_socket: Could not enable receive copy avoidance");
91602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
91702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 0;
91802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
91902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
92002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
92102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it wasn't compiled in... */
92202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = 0;
92302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* SO_RCV_COPYAVOID */
92402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
92502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_SND_COPYAVOID
92602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (loc_sndavoid) {
92702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (setsockopt(temp_socket,
92802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   SOL_SOCKET,
92902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   SO_SND_COPYAVOID,
93002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   (const char *)&loc_sndavoid,
93102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   sizeof(int)) == SOCKET_ERROR) {
93202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
93302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: create_data_socket: Could not enable send copy avoidance");
93402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
93502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 0;
93602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
93702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
93802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
93902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it was not compiled in... */
94002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = 0;
94102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
94202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
94302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will see about setting the TCP_NODELAY flag on the local */
94402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket. We will only do this for those systems that actually */
94502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* support the option. If it fails, note the fact, but keep going. */
94602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user tries to enable TCP_NODELAY on a UDP socket, this */
94702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will cause an error to be displayed */
94802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
94902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* well..... long ago and far away that would have happened, in
95002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     particular because we would always use IPPROTO_TCP here.
95102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     however, now we are using res->ai_protocol, which will be
95202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     IPPROT_UDP, and while HP-UX, and I suspect no-one else on the
95302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     planet has a UDP_mumble option that overlaps with TCP_NODELAY,
95402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     sure as knuth made little green programs, linux has a UDP_CORK
95502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     option that is defined as a value of 1, which is the same a
95602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     TCP_NODELAY under Linux.  So, when asking for -D and
95702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     "TCP_NODELAY" under Linux, we are actually setting UDP_CORK
95802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     instead of getting an error like every other OS on the
95902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     planet. joy and rupture. this stops a UDP_RR test cold sooo we
96002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     have to make sure that res->ai_protocol actually makes sense for
96102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     a _NODELAY setsockopt() or a UDP_RR test on Linux where someone
96202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     mistakenly sets -D will hang.  raj 2005-04-21 */
96302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(TCP_NODELAY) || defined(SCTP_NODELAY)
96502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((loc_nodelay) && (res->ai_protocol != IPPROTO_UDP)) {
96602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* strictly speaking, since the if defined above is an OR, we
96802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       should probably check against TCP_NODELAY being defined here.
96902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       however, the likelihood of SCTP_NODELAY being defined and
97002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       TCP_NODELAY _NOT_ being defined is, probably :), epsilon.  raj
97102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2005-03-15 */
97202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int option = TCP_NODELAY;
97402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I suspect that WANT_SCTP would suffice here since that is the
97602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       only time we would have called getaddrinfo with a hints asking
97702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       for SCTP, but just in case there is an SCTP implementation out
97802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       there _without_ SCTP_NODELAY... raj 2005-03-15 */
97902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_SCTP) && defined(SCTP_NODELAY)
98102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (IPPROTO_SCTP == res->ai_protocol) {
98202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      option = SCTP_NODELAY;
98302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
98402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
98502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    one = 1;
98702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(setsockopt(temp_socket,
98802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  res->ai_protocol,
98902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  option,
99002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (char *)&one,
99102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  sizeof(one)) == SOCKET_ERROR) {
99202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
99302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: create_data_socket: nodelay: errno %d\n",
99402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
99502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
99602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
99702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
99902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
100002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: create_data_socket: [TCP|SCTP]_NODELAY requested...\n");
100102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
100202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
100302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
100402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* TCP_NODELAY */
100502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = 0;
100702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_NODELAY */
100902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(TCP_CORK)
101102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_tcpcork != 0) {
101302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the user wishes for us to set TCP_CORK on the socket */
101402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int one = 1;
101502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (setsockopt(temp_socket,
101602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     getprotobyname("tcp")->p_proto,
101702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     TCP_CORK,
101802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     (char *)&one,
101902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     sizeof(one)) == SOCKET_ERROR) {
102002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("netperf: sendfile_tcp_stream: tcp_cork");
102102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
102202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
102302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
102402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"sendfile_tcp_stream: tcp_cork...\n");
102502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
102602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
102702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_CORK */
102902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since some of the UDP tests do not do anything to cause an
103102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     implicit bind() call, we need to be rather explicit about our
103202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     bind() call here. even if the address and/or the port are zero
103302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     (INADDR_ANY etc). raj 2004-07-20 */
103402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (setsockopt(temp_socket,
103602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 SOL_SOCKET,
103702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 SO_REUSEADDR,
103802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (const char *)&on,
103902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 sizeof(on)) < 0) {
104002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
104102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_data_socket: SO_REUSEADDR failed %d\n",
104202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
104302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
104402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
104502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
104602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (bind(temp_socket,
104702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   res->ai_addr,
104802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   res->ai_addrlen) < 0) {
104902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
105002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
105102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: create_data_socket: data socket bind failed errno %d\n",
105202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
105302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where," port: %d\n",get_port_number(res));
105402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
105502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
105602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
105702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(temp_socket);
106002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
106202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
106402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* This routine is for those BROKEN systems which do not correctly */
106702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* pass socket attributes through calls such as accept(). It should */
106802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* only be called for those broken systems. I *really* don't want to */
106902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* have this, but even broken systems must be measured. raj 11/95 */
107002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
107102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectkludge_socket_options(int temp_socket)
107202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
107302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
107402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_sock_buffer(temp_socket, SEND_BUFFER, lss_size_req, &lss_size);
107502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_sock_buffer(temp_socket, RECV_BUFFER, lsr_size_req, &lsr_size);
107602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
107702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now, we may wish to enable the copy avoidance features on the */
107802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local system. of course, this may not be possible... */
107902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* those calls were only valid for HP-UX, and I know that HP-UX is */
108002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* written correctly, and so we do not need to include those calls */
108102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* in this kludgy routine. raj 11/95 */
108202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
108302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
108402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will see about setting the TCP_NODELAY flag on the local */
108502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket. We will only do this for those systems that actually */
108602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* support the option. If it fails, note the fact, but keep going. */
108702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user tries to enable TCP_NODELAY on a UDP socket, this */
108802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will cause an error to be displayed */
108902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef TCP_NODELAY
109102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (loc_nodelay) {
109202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    one = 1;
109302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(setsockopt(temp_socket,
109402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  getprotobyname("tcp")->p_proto,
109502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  TCP_NODELAY,
109602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (char *)&one,
109702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  sizeof(one)) == SOCKET_ERROR) {
109802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: kludge_socket_options: nodelay: errno %d\n",
109902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
110002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
110102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
110202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
110302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
110402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
110502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: kludge_socket_options: TCP_NODELAY requested...\n");
110602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
110702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
110802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
110902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* TCP_NODELAY */
111002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = 0;
111202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_NODELAY */
111402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
111602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
111802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void *
112102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_address_address(struct addrinfo *info)
112202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
112302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in *sin;
112402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
112502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in6 *sin6;
112602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
112702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch(info->ai_family) {
112902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET:
113002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sin = (struct sockaddr_in *)info->ai_addr;
113102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(&(sin->sin_addr));
113202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
113302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
113402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET6:
113502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sin6 = (struct sockaddr_in6 *)info->ai_addr;
113602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(&(sin6->sin6_addr));
113702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
113802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
113902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
114002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(stderr,"we never expected to get here in get_address_address\n");
114102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(stderr);
114202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
114302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
114402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
114502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
114602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WIN32)
114702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* +*+ Why isn't this in the winsock headers yet? */
114802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectconst char *
114902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectinet_ntop(int af, const void *src, char *dst, size_t size);
115002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
115102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
115202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine is a generic test header printer for the topmost header */
115302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
115402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_top_test_header(char test_name[], struct addrinfo *source, struct addrinfo *destination)
115502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
115602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
115702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
115802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char address_buf[INET6_ADDRSTRLEN];
115902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
116002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char address_buf[16]; /* magic constant */
116102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
116202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
116302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to have some additional, interesting information in */
116402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the headers. we know some of it here, but not all, so we will */
116502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* only print the test title here and will print the results */
116602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* titles after the test is finished */
116758ecd3b7c76263900e38921360e334a416aec362Nick Kralevich  fprintf(where, "%s", test_name);
116802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  address_buf[0] = '\0';
116902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  inet_ntop(source->ai_family,get_address_address(source),address_buf,sizeof(address_buf));
117002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
117102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  " from %s (%s) port %u %s",
117202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  source->ai_canonname,
117302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  address_buf,
117402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  get_port_number(source),
117502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  inet_ftos(source->ai_family));
117602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  address_buf[0] = '\0';
117702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  inet_ntop(destination->ai_family,get_address_address(destination),address_buf,sizeof(address_buf));
117802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
117902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  " to %s (%s) port %u %s",
118002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  destination->ai_canonname,
118102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  address_buf,
118202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  get_port_number(destination),
118302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  inet_ftos(destination->ai_family));
118402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
118502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (iteration_max > 1) {
118602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
118702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    " : +/-%3.1f%% @ %2d%% conf. %s",
118802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    interval/0.02,
118902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    confidence_level,
119002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    result_confidence_only ? " on result only" : "");
119102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
119202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((loc_nodelay > 0) || (rem_nodelay > 0)) {
119302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : nodelay");
119402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
119502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((loc_sndavoid > 0) ||
119602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (loc_rcvavoid > 0) ||
119702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (rem_sndavoid > 0) ||
119802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (rem_rcvavoid > 0)) {
119902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : copy avoidance");
120002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
120102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (no_control) {
120302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : no control");
120402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
120502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
120702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where," : histogram");
120802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
120902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
121002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
121102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WANT_SPIN
121202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where," : interval");
121302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
121402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where," : spin interval");
121502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
121602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
121702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
121802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
121902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where," : dirty data");
122002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
122102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
122202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where," : demo");
122302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
122402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
122502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* a little hokey perhaps, but we really only want this to be
122602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     emitted for tests where it actually is used, which means a
122702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     "REQUEST/RESPONSE" test. raj 2005-11-10 */
122802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strstr(test_name,"REQUEST/RESPONSE")) {
122902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : first burst %d",first_burst_size);
123002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
123102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
123202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (cpu_binding_requested) {
123302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : cpu bind");
123402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
123502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,"\n");
123602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
123802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the TCP unidirectional data transfer test */
124102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* (a.k.a. stream) for the sockets interface. It receives its */
124202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* parameters via global variables from the shell and writes its */
124302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* output to the standard output. */
124402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
124702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_tcp_stream(char remote_host[])
124802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
124902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
125102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
125202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
125302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
125402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
125502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
125702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f %s\n";
125802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
126002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f   %7.2f   %s\n";
126102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
126302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
126402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
126502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
126602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
126702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
126902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c %s\n";
127002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
127202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f %s\n";
127302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
127502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Sends   %-8.8s Recvs\n\
127602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
127702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv             Send (avg)          Recv (avg)\n\
127802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
127902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt2 = "\n\
128102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
128202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
128302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
128402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
128502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
128802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
129002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-size greater than our send window. this will insure that we */
129102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
129202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
129302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
129402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
129502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
129702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int len;
129902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int nummessages = 0;
130002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET send_socket;
130102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_remaining;
130202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int tcp_mss = -1;  /* possibly uninitialized on printf far below */
130302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can send > 32 bits worth of bytes */
130502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) at some point, this should probably become a */
130602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 64bit integral type, but those are not entirely common yet */
130702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned long long local_bytes_sent = 0;
130902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent = 0.0;
131002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
131202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
131302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
131402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
131502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
131702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
131902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
132002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_request_struct	*tcp_stream_request;
132202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_response_struct	*tcp_stream_response;
132302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_results_struct	*tcp_stream_result;
132402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_request  =
132602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_request_struct *)netperf_request.content.test_specific_data;
132702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response =
132802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_response_struct *)netperf_response.content.test_specific_data;
132902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_result   =
133002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_results_struct *)netperf_response.content.test_specific_data;
133102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
133302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
133402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
133502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
133602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
133702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
133802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
133902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
134002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
134102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
134202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* complete_addrinfos will either succede or exit the process */
134302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
134402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
134502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
134602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
134702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
134802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
134902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
135102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP STREAM TEST",local_res,remote_res);
135202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
135302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
135502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
135602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
135702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
135902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
136002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
136102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
136202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
136302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
136402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
136602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
136702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
136902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
137002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages    =	0;
137202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent     =	0.0;
137302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 	0;
137402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
137602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
137702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
137902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_stream: tcp stream data socket");
138002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
138102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
138202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
138402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_tcp_stream: send_socket obtained...\n");
138502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
138602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have either retrieved the socket buffer sizes, */
138802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* or have tried to set them, so now, we may want to set the send */
138902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size based on that (because the user either did not use a -m */
139002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* option, or used one with an argument of 0). If the socket buffer */
139102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size is not available, we will set the send size to 4KB - no */
139202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular reason, just arbitrary... */
139302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_size == 0) {
139402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lss_size > 0) {
139502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = lss_size;
139602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
139702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
139802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = 4096;
139902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
140002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
140102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer ring with the requested alignment and offset. */
140302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* note also that we have allocated a quantity */
140402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of memory that is at least one send-size greater than our socket */
140502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffer size. We want to be sure that there are at least two */
140602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers allocated - this can be a bit of a problem when the */
140702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size is bigger than the socket size, so we must check... the */
140802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user may have wanted to explicitly set the "width" of our send */
140902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers, we should respect that wish... */
141002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) {
141102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_width = (lss_size/send_size) + 1;
141202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (send_width == 1) send_width++;
141302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
141402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
141602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* only allocate the send ring once. this is a networking test, */
141702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* not a memory allocation test. this way, we do not need a */
141802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* deallocate_buffer_ring() routine, and I don't feel like */
141902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* writing one anyway :) raj 11/94 */
142002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
142102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       send_size,
142202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
142302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
142402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
142502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
142602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
142702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
142802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
142902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
143002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
143102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. */
143202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
143302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
143402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
143502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
143602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
143702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
143802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Tell the remote end to do a listen. The server alters the
143902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket paramters on the other side at this point, hence the
144002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 reason for all the values being passed in the setup
144102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 message. If the user did not specify any of the parameters,
144202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 they will be passed as 0, which will indicate to the remote
144302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that no changes beyond the system's default should be
144402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 used. Alignment is the exception, it will default to 1, which
144502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will be no alignment alterations. */
144602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_request.content.request_type =	DO_TCP_STREAM;
144802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->send_buf_size	=	rss_size_req;
144902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->recv_buf_size	=	rsr_size_req;
145002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->receive_size	=	recv_size;
145102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->no_delay	=	rem_nodelay;
145202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->recv_alignment	=	remote_recv_align;
145302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->recv_offset	=	remote_recv_offset;
145402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->measure_cpu	=	remote_cpu_usage;
145502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->cpu_rate	=	remote_cpu_rate;
145602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (test_time) {
145702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	tcp_stream_request->test_length	=	test_time;
145802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
145902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
146002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	tcp_stream_request->test_length	=	test_bytes;
146102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
146202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->so_rcvavoid	=	rem_rcvavoid;
146302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->so_sndavoid	=	rem_sndavoid;
146402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
146502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->dirty_count     =       rem_dirty_count;
146602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->clean_count     =       rem_clean_count;
146702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
146802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->port            =    atoi(remote_data_port);
146902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
147002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 1) {
147102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
147202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: send_tcp_stream: requesting TCP stream test\n");
147302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
147402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_request();
147602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The response from the remote will contain all of the relevant
147802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         socket parameters for this test type. We will put them back
147902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         into the variables here so they can be displayed if desired.
148002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         The remote will have calibrated CPU if necessary, and will
148102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         have done all the needed set-up we will have calibrated the
148202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         cpu locally before sending the request, and will grab the
148302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         counter value right after the connect returns. The remote
148402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         will grab the counter right after the accept call. This saves
148502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         the hassle of extra messages being sent for the TCP
148602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         tests.  */
148702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
148802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
148902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
149102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
149202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote listen done.\n");
149302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size	      =	tcp_stream_response->recv_buf_size;
149402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size	      =	tcp_stream_response->send_buf_size;
149502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_nodelay     =	tcp_stream_response->no_delay;
149602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_usage=	tcp_stream_response->measure_cpu;
149702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_rate = tcp_stream_response->cpu_rate;
149802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we have to make sure that the server port number is in
150002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   network order */
150102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	set_port_number(remote_res,
150202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			(short)tcp_stream_response->data_port_number);
150302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_rcvavoid	= tcp_stream_response->so_rcvavoid;
150502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_sndavoid	= tcp_stream_response->so_sndavoid;
150602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
150702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
150802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
150902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
151002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
151102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
151202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
151302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
151402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
151502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
151602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
151702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
151802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
151902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
152002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_STREAM_SETUP(lss_size,rsr_size)
152102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
152202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
152402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
152502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
152602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET){
152702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_stream: data socket connect failed");
152802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
152902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
153002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either */
153202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the connect would have failed, or the previous response would */
153302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have indicated a problem. I failed to see the value of the */
153402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* extra  message after the accept on the remote. If it failed, */
153502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we'll see it here. If it didn't, we might as well start pumping */
153602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data. */
153702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a stream test, they can be */
153902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* either time or byte-count based. */
154002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
154102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
154202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
154302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
154402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = 0;
154502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in previous revisions, we had the same code repeated throught */
154602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* all the test suites. this was unnecessary, and meant more */
154702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* work for me when I wanted to switch to POSIX signals, so I */
154802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have abstracted this out into a routine in netlib.c. if you */
154902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* are experiencing signal problems, you might want to look */
155002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there. raj 11/94 */
155102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
155202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
155302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
155402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
155502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = test_bytes;
155602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
155702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
155802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
156002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
156102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
156202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
156402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we only start the interval timer if we are using the
156602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       timer-timed intervals rather than the sit and spin ones. raj
156702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2006-02-06 */
156802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_INTERVALS)
156902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
157002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
157102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before we start, initialize a few variables */
157302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
157502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
157602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(demo_one_ptr);
157702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
157802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
157902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
158202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
158302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
158402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
158502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. */
158602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (bytes_remaining > 0)) {
158802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
159002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      access_buffer(send_ring->buffer_ptr,
159102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_size,
159202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_dirty_count,
159302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_clean_count);
159402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
159502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
159702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
159802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp just before we go into send and then again just
159902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 after we come out raj 8/94 */
160002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* but lets only do this if there is going to be a histogram
160102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   displayed */
160202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
160302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
160402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
160502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((len=send(send_socket,
160702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   send_ring->buffer_ptr,
160802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   send_size,
160902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   0)) != send_size) {
161002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len >=0) || SOCKET_EINTR(len)) {
161102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* the test was interrupted, must be the end of test */
161202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
161302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
161402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("netperf: data send error");
161502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	printf("len was %d\n",len);
161602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
161702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
161802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
161902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_bytes_sent += send_size;
162002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
162202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
162302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp the exit from the send call and update the histogram */
162402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
162502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
162602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
162702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
162802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
163002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_STREAM_INTERVAL(send_size)
163102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
163202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_INTERVALS)
163402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
163502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
163602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
163802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...we may also want to wrap back to the "beginning" */
163902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* of the bufferspace, so we will mod the number of messages sent */
164002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by the send width, and use that to calculate the offset to add */
164102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to the base pointer. */
164202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
164302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
164402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (bytes_remaining) {
164502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bytes_remaining -= send_size;
164602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
164702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
164802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test is over. Flush the buffers to the remote end. We do a */
165002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* graceful release to insure that all data has been taken by the */
165102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote. */
165202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but first, if the verbosity is greater than 1, find-out what */
165402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the TCP maximum segment_size was (if possible) */
165502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
165602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_mss = -1;
165702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      get_tcp_info(send_socket,&tcp_mss);
165802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
165902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (shutdown(send_socket,SHUT_WR) == SOCKET_ERROR) {
166102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: cannot shutdown tcp stream socket");
166202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
166302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
166402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* hang a recv() off the socket to block until the remote has */
166602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* brought all the data up into the application. it will do a */
166702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* shutdown to cause a FIN to be sent our way. We will assume that */
166802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* any exit from the recv() call is good... raj 4/93 */
166902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv(send_socket, send_ring->buffer_ptr, send_size, 0);
167102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
167302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
167402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
167602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured and how */
167702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* long did we really */
167802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* run? */
167902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are finished with the socket, so close it to prevent hitting */
168102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the limit on maximum open files. */
168202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
168402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
168602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Get the statistics from the remote end. The remote will have
168702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 calculated service demand and all those interesting
168802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 things. If it wasn't supposed to care, it will return obvious
168902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 values. */
169002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
169202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
169302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
169402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote results obtained\n");
169502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
169602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
169702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
169802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
169902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
170002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
170102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
170202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
170302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
170502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
170602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We now calculate what our thruput was for the test. In the
170802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 future, we may want to include a calculation of the thruput
170902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 measured by the remote, but it should be the case that for a
171002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 TCP stream test, that the two numbers should be *very*
171102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 close... We calculate bytes_sent regardless of the way the
171202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 test length was controlled.  If it was time, we needed to,
171302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 and if it was by bytes, the user may have specified a number
171402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 of bytes that wasn't a multiple of the send_size, so we
171502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 really didn't send what he asked for ;-) */
171602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_sent	= ntohd(tcp_stream_result->bytes_received);
171802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
171902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
172002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_sent = (double)local_bytes_sent;
172102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
172202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
172302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= calc_thruput(bytes_sent);
172402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
172502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
172602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
172702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
172802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
172902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
173002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
173102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
173202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
173402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_sent,
173502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
173602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
173702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
173802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
173902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
174002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
174102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
174202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
174302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
174502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= tcp_stream_result->cpu_util;
174702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_sent,
174802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
174902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
175002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      tcp_stream_result->num_cpus);
175102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
175202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
175302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
175402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
175502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
175602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
175702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
175802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
175902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
176002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
176102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
176202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
176302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
176402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
176502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
176602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
176702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
176802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
176902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
177102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
177202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
177302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
177402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
177502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
177602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
177702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
178002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
178102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have finished making all the runs that we */
178302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be making. so, we should extract what the calcuated values */
178402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are for all the confidence stuff. we could make the values */
178502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* global, but that seemed a little messy, and it did not seem worth */
178602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the mucking with header files. so, we create a routine much */
178702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* like calcualte_confidence, which just returns the mean values. */
178802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 11/94 */
178902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
179002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
179102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
179202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
179302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
179402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
179502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
179602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
179702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
179802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
179902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
180002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
180102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
180202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
180302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
180402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
180502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
180702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
180802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
180902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
181002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
181102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
181202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
181302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
181402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
181502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(tcp_stream_result->cpu_method);
181602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
181702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
181802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
181902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
182002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
182102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
182202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
182302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
182402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
182502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
182602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
182702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
182802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
182902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
183002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
183102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method,
183202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
183302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
183402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
183502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
183602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
183702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
183802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
183902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		fprintf(where,
184002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
184102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
184202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
184302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
184402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
184502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
184702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
184802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,		        /* remote recvbuf size */
184902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
185002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
185102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
185202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		        /* what was the xfer rate */
185302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
185402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
185502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
185602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand,	/* remote service demand */
185702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
185802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
185902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
186002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
186102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
186202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
186302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
186402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
186502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
186602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
186702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
186802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
186902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
187002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
187102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
187202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
187302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
187402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
187502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
187602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		fprintf(where,tput_title,format_units());
187702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
187802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
187902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
188002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size, 		/* remote recvbuf size */
188102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size, 		/* local sendbuf size */
188202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
188302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
188402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,                  /* how fast did it go */
188502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
188602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
188702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
188802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
188902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
189002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
189202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
189302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
189402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
189502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
189602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
189802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
189902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
190002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
190102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
190202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
190302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this stuff needs to be worked-out in the presence of confidence */
190402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* intervals and multiple iterations of the test... raj 11/94 */
190502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
190602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
190702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
190802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
190902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
191002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
191102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
191202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
191302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
191402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
191502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
191602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
191702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
191802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)tcp_stream_result->recv_calls,
191902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_stream_result->recv_calls);
192002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
192102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt2,
192202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_mss);
192302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
192402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
192502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n\nHistogram of time spent in send() call.\n");
192602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
192702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
192802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
192902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
193002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
193202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the netperf-side TCP unidirectional data
193602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   transfer test (a.k.a. stream) for the sockets interface where the
193702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   data flow is from the netserver to the netperf.  It receives its
193802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   parameters via global variables from the shell and writes its
193902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output to the standard output. */
194002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
194302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_tcp_maerts(char remote_host[])
194402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
194502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
194702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
194802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
194902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
195002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
195102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
195302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f %s\n";
195402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
195602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f   %7.2f    %s \n";
195702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
195902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
196002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
196102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
196202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
196302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
196502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c %s\n";
196602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
196802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f %s\n";
196902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
197102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Recvs   %-8.8s Sends\n\
197202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
197302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Recv   Send             Recv (avg)          Send (avg)\n\
197402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
197502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt2 = "\n\
197702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
197802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
197902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
198002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
198102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
198402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
198602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* recv-size greater than our recv window. this will insure that we */
198702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
198802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
198902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
199002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
199102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
199202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
199302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
199402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int len;
199502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int nummessages = 0;
199602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET recv_socket;
199702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_remaining;
199802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int tcp_mss = -1;  /* possibly uninitialized on printf far below */
199902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can recv > 32 bits worth of bytes */
200102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) at some point, this should probably become a */
200202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 64bit integral type, but those are not entirely common yet */
200302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent = 0.0;
200402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned long long local_bytes_recvd = 0;
200502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
200702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
200802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
200902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
201002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
201202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
201402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
201502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_maerts_request_struct	*tcp_maerts_request;
201702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_maerts_response_struct	*tcp_maerts_response;
201802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_maerts_results_struct	*tcp_maerts_result;
201902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_request  =
202102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_maerts_request_struct *)netperf_request.content.test_specific_data;
202202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response =
202302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_maerts_response_struct *)netperf_response.content.test_specific_data;
202402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_result   =
202502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_maerts_results_struct *)netperf_response.content.test_specific_data;
202602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
202802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
202902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
203002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
203102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
203202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
203302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
203402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
203502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
203602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
203702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
203802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
203902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
204002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
204102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
204202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
204302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
204402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
204502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP MAERTS TEST",local_res,remote_res);
204602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
204702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
204802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = NULL;
204902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
205002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
205102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
205202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
205302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
205402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
205502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
205602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
205702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
205802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
205902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
206002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
206102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
206302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
206402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages    =	0;
206602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent     =	0.0;
206702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 	0;
206802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
207002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_socket = create_data_socket(local_res);
207102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_socket == INVALID_SOCKET){
207302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_maerts: tcp stream data socket");
207402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
207502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
207602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
207802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_tcp_maerts: recv_socket obtained...\n");
207902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
208002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have either retrieved the socket buffer sizes, */
208202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* or have tried to set them, so now, we may want to set the recv */
208302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size based on that (because the user either did not use a -m */
208402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* option, or used one with an argument of 0). If the socket buffer */
208502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size is not available, we will set the recv size to 4KB - no */
208602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular reason, just arbitrary... */
208702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_size == 0) {
208802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lsr_size > 0) {
208902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	recv_size = lsr_size;
209002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
209102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
209202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	recv_size = 4096;
209302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
209402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
209502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
209602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer ring with the requested alignment and offset. */
209702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* note also that we have allocated a quantity */
209802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of memory that is at least one recv-size greater than our socket */
209902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffer size. We want to be sure that there are at least two */
210002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers allocated - this can be a bit of a problem when the */
210102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* recv_size is bigger than the socket size, so we must check... the */
210202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user may have wanted to explicitly set the "width" of our recv */
210302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers, we should respect that wish... */
210402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) {
210502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_width = (lsr_size/recv_size) + 1;
210602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (recv_width == 1) recv_width++;
210702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
210802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
210902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
211002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* only allocate the recv ring once. this is a networking test, */
211102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* not a memory allocation test. this way, we do not need a */
211202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* deallocate_buffer_ring() routine, and I don't feel like */
211302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* writing one anyway :) raj 11/94 */
211402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
211502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       recv_size,
211602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
211702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
211802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
211902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
212102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
212202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
212302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
212402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
212502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. */
212602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
212802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
212902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
213002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
213202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Tell the remote end to do a listen. The server alters the
213302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket paramters on the other side at this point, hence the
213402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 reason for all the values being passed in the setup
213502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 message. If the user did not specify any of the parameters,
213602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 they will be passed as 0, which will indicate to the remote
213702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that no changes beyond the system's default should be
213802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 used. Alignment is the exception, it will default to 1, which
213902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will be no alignment alterations. */
214002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
214102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_request.content.request_type	=	DO_TCP_MAERTS;
214202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->send_buf_size	=	rss_size_req;
214302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->recv_buf_size	=	rsr_size_req;
214402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->send_size	=	send_size;
214502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->no_delay	=	rem_nodelay;
214602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->send_alignment	=	remote_send_align;
214702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->send_offset	=	remote_send_offset;
214802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->measure_cpu	=	remote_cpu_usage;
214902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->cpu_rate	=	remote_cpu_rate;
215002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (test_time) {
215102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	tcp_maerts_request->test_length	=	test_time;
215202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
215302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
215402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	tcp_maerts_request->test_length	=	test_bytes;
215502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
215602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->so_rcvavoid	=	rem_rcvavoid;
215702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->so_sndavoid	=	rem_sndavoid;
215802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
215902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->dirty_count       =       rem_dirty_count;
216002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->clean_count       =       rem_clean_count;
216102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
216202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->port            = atoi(remote_data_port);
216302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_maerts_request->ipfamily        = af_to_nf(remote_res->ai_family);
216402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 1) {
216502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
216602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: send_tcp_maerts: requesting TCP maerts test\n");
216702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
216802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
216902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_request();
217002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
217102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The response from the remote will contain all of the relevant
217202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket parameters for this test type. We will put them back
217302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 into the variables here so they can be displayed if desired.
217402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 The remote will have calibrated CPU if necessary, and will
217502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 have done all the needed set-up we will have calibrated the
217602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 cpu locally before sending the request, and will grab the
217702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 counter value right after the connect returns. The remote
217802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will grab the counter right after the accept call. This saves
217902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 the hassle of extra messages being sent for the TCP
218002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 tests.  */
218102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
218302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
218502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
218602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote listen done.\n");
218702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size	=	tcp_maerts_response->recv_buf_size;
218802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size	=	tcp_maerts_response->send_buf_size;
218902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_nodelay     =	tcp_maerts_response->no_delay;
219002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_usage=	tcp_maerts_response->measure_cpu;
219102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_rate = tcp_maerts_response->cpu_rate;
219202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size       = tcp_maerts_response->send_size;
219302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
219402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we have to make sure that the server port number is in
219502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 network order */
219602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res,
219702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      (short)tcp_maerts_response->data_port_number);
219802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid	= tcp_maerts_response->so_rcvavoid;
219902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid	= tcp_maerts_response->so_sndavoid;
220002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
220102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
220202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
220302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
220402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
220502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
220602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
220702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
220802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
221002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
221102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
221202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
221402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_STREAM_SETUP(lsr_size,rss_size)
221502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
221602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
221802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(recv_socket,
221902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
222002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET){
222102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_maerts: data socket connect failed");
222202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
222302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
222402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either */
222602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the connect would have failed, or the previous response would */
222702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have indicated a problem. I failed to see the value of the */
222802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* extra  message after the accept on the remote. If it failed, */
222902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we'll see it here. If it didn't, we might as well start pumping */
223002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data. */
223102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
223202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a maerts test, they can be */
223302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* either time or byte-count based. */
223402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
223502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
223602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
223702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
223802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = 0;
223902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in previous revisions, we had the same code repeated throught */
224002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* all the test suites. this was unnecessary, and meant more */
224102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* work for me when I wanted to switch to POSIX signals, so I */
224202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have abstracted this out into a routine in netlib.c. if you */
224302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* are experiencing signal problems, you might want to look */
224402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there. raj 11/94 */
224502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!no_control) {
224602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* this is a netperf to netserver test, netserver will close
224702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   to tell us the test is over, so use PAD_TIME to avoid
224802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   causing the netserver fits. */
224902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	start_timer(test_time + PAD_TIME);
225002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
225102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
225202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* this is a netperf to data source test, no PAD_TIME */
225302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	start_timer(test_time);
225402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
225502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
225602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
225702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to recv a number of bytes. we don't do that
225802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 in a TCP_MAERTS test. sorry. raj 2002-06-21 */
225902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("netperf: send_tcp_maerts: test must be timed\n");
226002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
226102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
226202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
226402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
226502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
226602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
226802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
227002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
227102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
227202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before we start, initialize a few variables */
227402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
227602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (demo_mode) {
227702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(demo_one_ptr);
227802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
227902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
228002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the test will continue until we either get a zero-byte recv()
228202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       on the socket or our failsafe timer expires. most of the time
228302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       we trust that we get a zero-byte recieve from the socket. raj
228402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2002-06-21 */
228502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
228702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
228802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before we go into recv and then again just
228902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 after we come out raj 8/94 */
229002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* but only if we are actually going to display a histogram. raj
229102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 2006-02-07 */
229202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
229302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
229402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
229502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) && (len=recv(recv_socket,
229702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    recv_ring->buffer_ptr,
229802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    recv_size,
229902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    0)) > 0 ) {
230002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
230202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
230302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp the exit from the recv call and update the histogram */
230402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
230502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
230602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
230702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
230802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
231002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      access_buffer(recv_ring->buffer_ptr,
231102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    recv_size,
231202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_dirty_count,
231302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_clean_count);
231402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
231502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
231702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_STREAM_INTERVAL(len);
231802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
231902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
232102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
232202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
232302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
232502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...we may also want to wrap back to the "beginning" */
232602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* of the bufferspace, so we will mod the number of messages sent */
232702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by the recv width, and use that to calculate the offset to add */
232802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to the base pointer. */
232902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
233002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
233102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (bytes_remaining) {
233202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bytes_remaining -= len;
233302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
233402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
233502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_bytes_recvd += len;
233602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
233702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
233802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
233902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure we timestamp just before we go into recv  */
234002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* raj 2004-06-15 */
234102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
234202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
234302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
234402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
234602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* an EINTR is to be expected when this is a no_control test */
234802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (((len < 0) || SOCKET_EINTR(len)) && (!no_control)) {
234902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_tcp_maerts: data recv error");
235002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("len was %d\n",len);
235102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
235202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
235302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if we get here, it must mean we had a recv return of 0 before
235502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the watchdog timer expired, or the watchdog timer expired and
235602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       this was a no_control test */
235702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test is over. Flush the buffers to the remote end. We do a
235902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       graceful release to tell the  remote we have all the data. */
236002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but first, if the verbosity is greater than 1, find-out what */
236202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the TCP maximum segment_size was (if possible) */
236302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
236402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_mss = -1;
236502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      get_tcp_info(recv_socket,&tcp_mss);
236602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
236702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (shutdown(recv_socket,SHUT_WR) == SOCKET_ERROR) {
236902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: cannot shutdown tcp maerts socket");
237002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
237102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
237202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    stop_timer();
237402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the local elapsed time for the
237602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       test, and will also store-away the necessaries for cpu
237702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       utilization */
237802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
238002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured and how */
238102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* long did we really */
238202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* run? */
238302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are finished with the socket, so close it to prevent hitting */
238502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the limit on maximum open files. */
238602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(recv_socket);
238802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
239002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Get the statistics from the remote end. The remote will have
239102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         calculated service demand and all those interesting
239202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         things. If it wasn't supposed to care, it will return obvious
239302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         values. */
239402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
239502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
239602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
239702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
239802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote results obtained\n");
239902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
240002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
240102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
240202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
240302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
240402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
240502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
240602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
240702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
240902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
241002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We now calculate what our thruput was for the test. In the
241202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 future, we may want to include a calculation of the thruput
241302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 measured by the remote, but it should be the case that for a
241402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 TCP maerts test, that the two numbers should be *very*
241502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 close... We calculate bytes_sent regardless of the way the
241602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 test length was controlled.  If it was time, we needed to,
241702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 and if it was by bytes, the user may have specified a number
241802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 of bytes that wasn't a multiple of the recv_size, so we
241902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 really didn't recv what he asked for ;-) */
242002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_sent	= ntohd(tcp_maerts_result->bytes_sent);
242202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
242302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
242402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_sent = (double)local_bytes_recvd;
242502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
242602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= calc_thruput(bytes_sent);
242902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
243102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
243202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
243302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
243402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
243502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
243602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
243702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
243902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_sent,
244002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
244102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
244202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
244302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
244402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
244502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
244602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
244702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
244802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
245002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= tcp_maerts_result->cpu_util;
245202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_sent,
245302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
245402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
245502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      tcp_maerts_result->num_cpus);
245602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
245702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
245802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
245902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
246002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
246102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
246202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
246302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
246402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
246502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
246602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
246702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
246802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
246902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
247002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
247202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
247302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
247402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
247602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
247702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
247802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
247902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
248002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
248102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
248202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
248302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
248402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
248502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
248602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
248702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have finished making all the runs that we */
248802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be making. so, we should extract what the calcuated values */
248902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are for all the confidence stuff. we could make the values */
249002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* global, but that seemed a little messy, and it did not seem worth */
249102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the mucking with header files. so, we create a routine much */
249202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* like calcualte_confidence, which just returns the mean values. */
249302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 11/94 */
249402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
249602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
249702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
249802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
249902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
250002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
250102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
250302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
250402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
250502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
250602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
250702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
250802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
250902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
251002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
251102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
251202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
251302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
251402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
251502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
251602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
251702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
251802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
251902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
252002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(tcp_maerts_result->cpu_method);
252102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
252202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
252302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
252402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
252502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
252602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
252702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
252802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
252902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
253002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
253102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
253202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
253302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
253402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
253502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
253602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method,
253702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
253802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
253902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
254002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
254102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
254202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
254302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
254402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
254502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
254602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
254702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
254802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
254902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
255002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
255202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
255302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,		        /* remote recvbuf size */
255402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
255502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the recvs */
255602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
255702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		        /* what was the xfer rate */
255802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
255902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
256002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
256102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand,	/* remote service demand */
256202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
256302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
256402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
256502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
256602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
256702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
256802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
256902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
257102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
257202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
257302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
257402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
257502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
257602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
257702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
257802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
257902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
258002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
258102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
258202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
258302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
258402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
258502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size, 		/* local recvbuf size */
258602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remot sendbuf size */
258702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the recvs */
258802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
258902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,                  /* how fast did it go */
259002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
259102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
259202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
259302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
259402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
259502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
259602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
259702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
259802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
259902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
260002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
260102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
260302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
260402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
260502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
260602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
260702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this stuff needs to be worked-out in the presence of confidence */
260902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* intervals and multiple iterations of the test... raj 11/94 */
261002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
261102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
261202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
261302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
261402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
261502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
261602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_recv_align,
261702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
261802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_recv_offset,
261902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
262002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
262102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
262202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
262302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)tcp_maerts_result->send_calls,
262402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_maerts_result->send_calls);
262502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
262602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt2,
262702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_mss);
262802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
262902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
263002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n\nHistogram of time spent in recv() call.\n");
263102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
263202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
263302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
263402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
263502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
263702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_ICSC_EXS
264102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/exs.h>
264302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the TCP unidirectional data transfer test */
264602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* (a.k.a. stream) for the sockets interface. It receives its */
264702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* parameters via global variables from the shell and writes its */
264802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* output to the standard output. */
264902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
265002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
265102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_exs_tcp_stream(char remote_host[])
265202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
265302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
265402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *tput_title = "\
265502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
265602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
265702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
265802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
265902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *tput_fmt_0 =
266102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        "%7.2f\n";
266202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *tput_fmt_1 =
266402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        "%6d %6d %6d    %-6.2f   %7.2f   \n";
266502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *cpu_title = "\
266702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
266802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
266902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
267002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
267102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
267202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *cpu_fmt_0 =
267302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        "%6.3f %c\n";
267402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
267502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *cpu_fmt_1 =
267602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f\n";
267702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
267802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *ksink_fmt = "\n\
267902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Sends   %-8.8s Recvs\n\
268002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
268102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv             Send (avg)          Recv (avg)\n\
268202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
268302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
268402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *ksink_fmt2 = "\n\
268502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
268602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
268702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
268802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
268902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    float         elapsed_time;
269202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* what we want is to have a buffer space that is at least one */
269402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send-size greater than our send window. this will insure that we */
269502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* are never trying to re-use a buffer that may still be in the hands */
269602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of the transport. This buffer will be malloc'd after we have found */
269702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the size of the local senc socket buffer. We will want to deal */
269802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* with alignment and offset concerns as well. */
269902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct ring_elt *send_ring;
270102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int len;
270302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unsigned int nummessages = 0;
270402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    SOCKET send_socket;
270502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int bytes_remaining;
270602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int tcp_mss = -1;  /* possibly uninitialized on printf far below */
270702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exs_mhandle_t exs_mhandle;
270902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exs_qhandle_t exs_qhandle;
271002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETPERF_EXS_PENDING  16
271102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int exs_aio_pending;
271202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int exs_aio_eagain;
271302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int exs_aio_dequeued;
271402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int exs_aio_dequeuecnt;
271502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int exs_evtcnt;
271602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETPERF_EXS_QSIZE    128
271702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exs_event_t exs_evtvec[NETPERF_EXS_QSIZE];
271802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* with links like fddi, one can send > 32 bits worth of bytes */
272002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* during a test... ;-) at some point, this should probably become a */
272102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* 64bit integral type, but those are not entirely common yet */
272202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
272302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    double   bytes_sent = 0.0;
272402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
272502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    float   local_cpu_utilization;
272602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    float   local_service_demand;
272702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    float   remote_cpu_utilization;
272802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    float   remote_service_demand;
272902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    double   thruput;
273102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct addrinfo *remote_res;
273302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct addrinfo *local_res;
273402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct   tcp_stream_request_struct   *tcp_stream_request;
273602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct   tcp_stream_response_struct   *tcp_stream_response;
273702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct   tcp_stream_results_struct   *tcp_stream_result;
273802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request  =
274002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (struct tcp_stream_request_struct *)netperf_request.content.test_specific_data;
274102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_response =
274202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (struct tcp_stream_response_struct *)netperf_response.content.test_specific_data;
274302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_result   =
274402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (struct tcp_stream_results_struct *)netperf_response.content.test_specific_data;
274502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
274602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_HISTOGRAM */
274702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
274802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
274902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since we are now disconnected from the code that established the */
275002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* control socket, and since we want to be able to use different */
275102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* protocols and such, we are passed the name of the remote host and */
275202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* must turn that into the test specific addressing information. */
275302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
275402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* complete_addrinfos will either succede or exit the process */
275502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    complete_addrinfos(&remote_res,
275602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       &local_res,
275702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       remote_host,
275802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       SOCK_STREAM,
275902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       IPPROTO_TCP,
276002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       0);
276102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
276202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ( print_headers ) {
276302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        print_top_test_header("EXS TCP STREAM TEST",local_res,remote_res);
276402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
276502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
276602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = NULL;
276702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration = 1;
276802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    init_stat();
276902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize EXS API and create event queue */
277102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (exs_init (EXS_VERSION) == -1) {
277202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        perror ("netperf: send_exs_tcp_stream: exs_init failed");
277302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit (1);
277402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
277502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((exs_qhandle = exs_qcreate (NETPERF_EXS_QSIZE)) == EXS_QHANDLE_INVALID) {
277702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        perror ("netperf: send_exs_tcp_stream: exs_qcreate failed");
277802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit (1);
277902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
278002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
278102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf (where, "send_exs_tcp_stream: qhandle=%d\n", exs_qhandle);
278202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
278302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
278402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we have a great-big while loop which controls the number of times */
278502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we run a particular test. this is for the calculation of a */
278602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* confidence interval (I really should have stayed awake during */
278702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* probstats :). If the user did not request confidence measurement */
278802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* (no confidence is the default) then we will only go though the */
278902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* loop once. the confidence stuff originates from the folks at IBM */
279002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
279102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
279202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           (confidence_iteration <= iteration_min)) {
279302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
279402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* initialize a few counters. we have to remember that we might be */
279502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* going through the loop more than once. */
279602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
279702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        nummessages    =   0;
279802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        bytes_sent     =   0.0;
279902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        times_up       =    0;
280002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
280102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /*set up the data socket                        */
280202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        send_socket = create_data_socket(local_res);
280302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
280402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (send_socket == INVALID_SOCKET){
280502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            perror("netperf: send_tcp_stream: tcp stream data socket");
280602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exit(1);
280702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
280802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
280902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (debug) {
281002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fprintf(where,"send_tcp_stream: send_socket obtained...\n");
281102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
281202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
281302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* at this point, we have either retrieved the socket buffer sizes, */
281402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* or have tried to set them, so now, we may want to set the send */
281502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* size based on that (because the user either did not use a -m */
281602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* option, or used one with an argument of 0). If the socket buffer */
281702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* size is not available, we will set the send size to 4KB - no */
281802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* particular reason, just arbitrary... */
281902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (send_size == 0) {
282002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (lss_size > 0) {
282102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                send_size = lss_size;
282202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
282302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            else {
282402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                send_size = 4096;
282502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
282602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
282702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
282802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* set-up the data buffer ring with the requested alignment and offset. */
282902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* note also that we have allocated a quantity */
283002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* of memory that is at least one send-size greater than our socket */
283102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* buffer size. We want to be sure that there are at least two */
283202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* buffers allocated - this can be a bit of a problem when the */
283302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* send_size is bigger than the socket size, so we must check... the */
283402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* user may have wanted to explicitly set the "width" of our send */
283502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* buffers, we should respect that wish... */
283602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (send_width == 0) {
283702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            send_width = (lss_size/send_size) + 1;
283802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (send_width == 1) send_width++;
283902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
284002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (send_ring == NULL) {
284202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* only allocate the send ring once. this is a networking test, */
284302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* not a memory allocation test. this way, we do not need a */
284402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* deallocate_buffer_ring() routine, and I don't feel like */
284502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* writing one anyway :) raj 11/94 */
284602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            send_ring = allocate_exs_buffer_ring(send_width,
284702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                 send_size,
284802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                 local_send_align,
284902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                 local_send_offset,
285002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                 &exs_mhandle);
285102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
285202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
285302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* If the user has requested cpu utilization measurements, we must */
285402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* calibrate the cpu(s). We will perform this task within the tests */
285502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* themselves. If the user has specified the cpu rate, then */
285602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* calibrate_local_cpu will return rather quickly as it will have */
285702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* nothing to do. If local_cpu_rate is zero, then we will go through */
285802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* all the "normal" calibration stuff and return the rate back. */
285902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (local_cpu_usage) {
286102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
286202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
286302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* Tell the remote end to do a listen. The server alters the socket */
286502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* paramters on the other side at this point, hence the reason for */
286602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* all the values being passed in the setup message. If the user did */
286702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* not specify any of the parameters, they will be passed as 0, which */
286802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* will indicate to the remote that no changes beyond the system's */
286902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* default should be used. Alignment is the exception, it will */
287002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* default to 1, which will be no alignment alterations. */
287102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
287202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        netperf_request.content.request_type =   DO_TCP_STREAM;
287302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->send_buf_size   =   rss_size_req;
287402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->recv_buf_size   =   rsr_size_req;
287502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->receive_size   =   recv_size;
287602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->no_delay   =   rem_nodelay;
287702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->recv_alignment   =   remote_recv_align;
287802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->recv_offset   =   remote_recv_offset;
287902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->measure_cpu   =   remote_cpu_usage;
288002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->cpu_rate   =   remote_cpu_rate;
288102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (test_time) {
288202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            tcp_stream_request->test_length   =   test_time;
288302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
288402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        else {
288502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            tcp_stream_request->test_length   =   test_bytes;
288602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
288702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->so_rcvavoid   =   rem_rcvavoid;
288802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->so_sndavoid   =   rem_sndavoid;
288902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
289002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->dirty_count     =       rem_dirty_count;
289102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->clean_count     =       rem_clean_count;
289202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
289302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->port            =    atoi(remote_data_port);
289402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tcp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
289502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (debug > 1) {
289602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fprintf(where,
289702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    "netperf: send_tcp_stream: requesting TCP stream test\n");
289802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
289902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
290002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        send_request();
290102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
290202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* The response from the remote will contain all of the relevant    */
290302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* socket parameters for this test type. We will put them back into */
290402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* the variables here so they can be displayed if desired.  The   */
290502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* remote will have calibrated CPU if necessary, and will have done   */
290602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* all the needed set-up we will have calibrated the cpu locally   */
290702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* before sending the request, and will grab the counter value right*/
290802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* after the connect returns. The remote will grab the counter right*/
290902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* after the accept call. This saves the hassle of extra messages   */
291002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* being sent for the TCP tests.               */
291102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
291202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        recv_response();
291302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
291402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (!netperf_response.content.serv_errno) {
291502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (debug)
291602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                fprintf(where,"remote listen done.\n");
291702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            rsr_size         =   tcp_stream_response->recv_buf_size;
291802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            rss_size         =   tcp_stream_response->send_buf_size;
291902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            rem_nodelay     =   tcp_stream_response->no_delay;
292002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            remote_cpu_usage=   tcp_stream_response->measure_cpu;
292102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            remote_cpu_rate = tcp_stream_response->cpu_rate;
292202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
292302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* we have to make sure that the server port number is in */
292402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* network order */
292502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            set_port_number(remote_res,(short)tcp_stream_response->data_port_number);
292602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
292702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            rem_rcvavoid   = tcp_stream_response->so_rcvavoid;
292802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            rem_sndavoid   = tcp_stream_response->so_sndavoid;
292902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
293002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        else {
293102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            Set_errno(netperf_response.content.serv_errno);
293202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fprintf(where,
293302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    "netperf: remote error %d",
293402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    netperf_response.content.serv_errno);
293502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            perror("");
293602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fflush(where);
293702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
293802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exit(1);
293902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
294002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
294102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_DEMO */
294202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        DEMO_STREAM_SETUP(lss_size,rsr_size)
294302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
294402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
294502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /*Connect up to the remote port on the data socket  */
294602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (connect(send_socket,
294702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        remote_res->ai_addr,
294802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        remote_res->ai_addrlen) == INVALID_SOCKET){
294902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                perror("netperf: send_tcp_stream: data socket connect failed");
295002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                exit(1);
295102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
295202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* Data Socket set-up is finished. If there were problems, either */
295402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* the connect would have failed, or the previous response would */
295502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* have indicated a problem. I failed to see the value of the */
295602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* extra  message after the accept on the remote. If it failed, */
295702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* we'll see it here. If it didn't, we might as well start pumping */
295802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* data. */
295902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* Set-up the test end conditions. For a stream test, they can be */
296102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* either time or byte-count based. */
296202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (test_time) {
296402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* The user wanted to end the test after a period of time. */
296502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            times_up = 0;
296602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            bytes_remaining = 0;
296702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* in previous revisions, we had the same code repeated throught */
296802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* all the test suites. this was unnecessary, and meant more */
296902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* work for me when I wanted to switch to POSIX signals, so I */
297002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* have abstracted this out into a routine in netlib.c. if you */
297102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* are experiencing signal problems, you might want to look */
297202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* there. raj 11/94 */
297302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            start_timer(test_time);
297402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
297502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        else {
297602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* The tester wanted to send a number of bytes. */
297702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            bytes_remaining = test_bytes;
297802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            times_up = 1;
297902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
298002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* The cpu_start routine will grab the current time and possibly */
298202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* value of the idle counter for later use in measuring cpu */
298302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* utilization and/or service demand and thruput. */
298402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        cpu_start(local_cpu_usage);
298602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_INTERVALS */
298802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	INTERVALS_INIT();
298902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
299002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* before we start, initialize a few variables */
299202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_DEMO */
299402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (demo_mode) {
299502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            HIST_timestamp(demo_one_ptr);
299602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
299702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
299802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
300002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* We use an "OR" to control test execution. When the test is */
300102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* controlled by time, the byte count check will always return false. */
300202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* When the test is controlled by byte count, the time test will */
300302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* always return false. When the test is finished, the whole */
300402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* expression will go false and we will stop sending data. */
300502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
300602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exs_aio_pending = 0;
300702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exs_aio_eagain = 0;
300802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exs_aio_dequeuecnt = 0;
300902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        while ((!times_up) || (bytes_remaining > 0)) {
301102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
301302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  access_buffer(send_ring->buffer_ptr,
301402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_size,
301502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			loc_dirty_count,
301602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			loc_clean_count);
301702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
301802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_HISTOGRAM */
302002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* timestamp just before we go into send and then again just after */
302102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* we come out raj 8/94 */
302202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            HIST_timestamp(&time_one);
302302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
302402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* post up to NETPERF_EXS_PENDING I/Os  */
302702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            while ((exs_aio_pending < NETPERF_EXS_PENDING) &&
302802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                   (exs_send (send_socket, send_ring->buffer_ptr, send_size,
302902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                              0, exs_qhandle, (exs_ahandle_t)-1, exs_mhandle) == 0)) {
303002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                exs_aio_pending++;
303102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
303202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                /* now we want to move our pointer to the next
303302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   position in the data buffer...we may also want to
303402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   wrap back to the "beginning" of the bufferspace, so
303502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   we will mod the number of messages sent by the send
303602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   width, and use that to calculate the offset to add
303702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   to the base pointer. */
303802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
303902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                nummessages++;
304002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                send_ring = send_ring->next;
304102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                if (bytes_remaining) {
304202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    bytes_remaining -= send_size;
304302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                }
304402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
304502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* check exs_send result */
304702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (exs_aio_pending < NETPERF_EXS_PENDING) {
304802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project               /* standard flow control case */
304902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                if (errno == EAGAIN)
305002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    exs_aio_eagain++;
305102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                /* case of times_up */
305202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                else if (errno == EINTR)
305302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    break;
305402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                /* strange, let's stop */
305502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                else {
305602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    perror ("netperf: exs_send error");
305702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    exit (1);
305802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                }
305902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
306002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
306102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* dequeue events with "threshold" on 1/2 posted */
306202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exs_aio_dequeued =
306302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                exs_qdequeue (exs_qhandle, exs_evtvec,
306402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                              -(exs_aio_pending>>1), NULL);
306502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exs_aio_dequeuecnt++;
306602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
306702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* check exs_dequeue result */
306802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (exs_aio_dequeued < 0) {
306902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                /* case of times_up */
307002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                if (errno == EINTR)
307102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    break;
307202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                /* strange, let's stop */
307302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                else {
307402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    perror ("netperf: exs_send error");
307502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    exit (1);
307602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                }
307702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
307802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* update number of pending I/Os */
307902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            else {
308002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                exs_aio_pending -= exs_aio_dequeued;
308102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
308202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_HISTOGRAM */
308502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* timestamp the exit from the send call and update the histogram */
308602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            HIST_timestamp(&time_two);
308702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            HIST_add(time_hist,delta_micro(&time_one,&time_two));
308802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
308902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_DEMO */
309102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            DEMO_STREAM_INTERVAL(send_size);
309202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
309302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_INTERVALS */
309502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    INTERVALS_WAIT();
309602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
309702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
309902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* Collect the last completion events */
310102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exs_aio_dequeued =
310202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exs_qdequeue (exs_qhandle, exs_evtvec, -exs_aio_pending, NULL);
310302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exs_aio_dequeuecnt++;
310402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* check exs_dequeue result and update number of pending I/Os */
310502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (exs_aio_dequeued < 0) {
310602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            perror ("netperf: exs_send error");
310702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exit (1);
310802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
310902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exs_aio_pending -= exs_aio_dequeued;
311002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* Display some async I/O debug info */
311202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (debug) {
311302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fprintf (where, "send_exs_tcp_stream: "
311402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     "aio sent=%d eagain=%d dequeue=%d pending=%d\n",
311502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     nummessages, exs_aio_eagain, exs_aio_dequeuecnt, exs_aio_pending);
311602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
311702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* The test is over. Flush the buffers to the remote end. We do a */
311902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* graceful release to insure that all data has been taken by the */
312002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* remote. */
312102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* but first, if the verbosity is greater than 1, find-out what */
312302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* the TCP maximum segment_size was (if possible) */
312402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (verbosity > 1) {
312502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            tcp_mss = -1;
312602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            get_tcp_info(send_socket,&tcp_mss);
312702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
312802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (shutdown(send_socket,SHUT_WR) == SOCKET_ERROR) {
313002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            perror("netperf: cannot shutdown tcp stream socket");
313102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exit(1);
313202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
313302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* hang a recv() off the socket to block until the remote has */
313502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* brought all the data up into the application. it will do a */
313602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* shutdown to cause a FIN to be sent our way. We will assume that */
313702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* any exit from the recv() call is good... raj 4/93 */
313802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        recv(send_socket, send_ring->buffer_ptr, send_size, 0);
314002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* this call will always give us the elapsed time for the test, and */
314202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* will also store-away the necessaries for cpu utilization */
314302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        cpu_stop(local_cpu_usage,&elapsed_time);   /* was cpu being */
314502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* measured and how */
314602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* long did we really */
314702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* run? */
314802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* we are finished with the socket, so close it to prevent hitting */
315002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* the limit on maximum open files. */
315102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        close(send_socket);
315302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* Get the statistics from the remote end. The remote will have */
315502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* calculated service demand and all those interesting things. If it */
315602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* wasn't supposed to care, it will return obvious values. */
315702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        recv_response();
315902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (!netperf_response.content.serv_errno) {
316002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (debug)
316102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                fprintf(where,"remote results obtained\n");
316202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
316302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        else {
316402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            Set_errno(netperf_response.content.serv_errno);
316502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fprintf(where,
316602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    "netperf: remote error %d",
316702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    netperf_response.content.serv_errno);
316802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            perror("");
316902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fflush(where);
317002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exit(1);
317202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
317302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* We now calculate what our thruput was for the test. In the future, */
317502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* we may want to include a calculation of the thruput measured by */
317602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* the remote, but it should be the case that for a TCP stream test, */
317702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* that the two numbers should be *very* close... We calculate */
317802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* bytes_sent regardless of the way the test length was controlled. */
317902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* If it was time, we needed to, and if it was by bytes, the user may */
318002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* have specified a number of bytes that wasn't a multiple of the */
318102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* send_size, so we really didn't send what he asked for ;-) */
318202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        bytes_sent   = ntohd(tcp_stream_result->bytes_received);
318402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        thruput   = calc_thruput(bytes_sent);
318602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (local_cpu_usage || remote_cpu_usage) {
318802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* We must now do a little math for service demand and cpu */
318902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* utilization for the system(s) */
319002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* Of course, some of the information might be bogus because */
319102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* there was no idle counter in the kernel(s). We need to make */
319202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* a note of this for the user's benefit...*/
319302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (local_cpu_usage) {
319402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                local_cpu_utilization   = calc_cpu_util(0.0);
319602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                local_service_demand   = calc_service_demand(bytes_sent,
319702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                             0.0,
319802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                             0.0,
319902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                             0);
320002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
320102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            else {
320202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                local_cpu_utilization   = (float) -1.0;
320302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                local_service_demand   = (float) -1.0;
320402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
320502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            if (remote_cpu_usage) {
320702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                remote_cpu_utilization   = tcp_stream_result->cpu_util;
320902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                remote_service_demand   = calc_service_demand(bytes_sent,
321002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                              0.0,
321102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                              remote_cpu_utilization,
321202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                              tcp_stream_result->num_cpus);
321302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
321402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            else {
321502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                remote_cpu_utilization = (float) -1.0;
321602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                remote_service_demand  = (float) -1.0;
321702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
321802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
321902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        else {
322002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* we were not measuring cpu, for the confidence stuff, we */
322102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            /* should make it -1.0 */
322202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            local_cpu_utilization   = (float) -1.0;
322302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            local_service_demand   = (float) -1.0;
322402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            remote_cpu_utilization = (float) -1.0;
322502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            remote_service_demand  = (float) -1.0;
322602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
322702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* at this point, we want to calculate the confidence information. */
322902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* if debugging is on, calculate_confidence will print-out the */
323002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* parameters we pass it */
323102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        calculate_confidence(confidence_iteration,
323302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                             elapsed_time,
323402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                             thruput,
323502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                             local_cpu_utilization,
323602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                             remote_cpu_utilization,
323702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                             local_service_demand,
323802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                             remote_service_demand);
323902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        confidence_iteration++;
324202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
324302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have finished making all the runs that we */
324502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will be making. so, we should extract what the calcuated values */
324602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* are for all the confidence stuff. we could make the values */
324702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* global, but that seemed a little messy, and it did not seem worth */
324802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the mucking with header files. so, we create a routine much */
324902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* like calcualte_confidence, which just returns the mean values. */
325002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* raj 11/94 */
325102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    retrieve_confident_values(&elapsed_time,
325302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                              &thruput,
325402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                              &local_cpu_utilization,
325502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                              &remote_cpu_utilization,
325602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                              &local_service_demand,
325702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                              &remote_service_demand);
325802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
326002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
326102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
326202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
326302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
326402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
326502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
326602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
326702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
326802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (confidence < 0) {
326902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* we did not hit confidence, but were we asked to look for it? */
327002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (iteration_max > 1) {
327102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            display_confidence();
327202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
327302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
327402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
327602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        local_cpu_method = format_cpu_method(cpu_method);
327702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        remote_cpu_method = format_cpu_method(tcp_stream_result->cpu_method);
327802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        switch (verbosity) {
328002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            case 0:
328102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                if (local_cpu_usage) {
328202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    fprintf(where,
328302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            cpu_fmt_0,
328402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            local_service_demand,
328502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            local_cpu_method);
328602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                }
328702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                else {
328802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    fprintf(where,
328902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            cpu_fmt_0,
329002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            remote_service_demand,
329102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            remote_cpu_method);
329202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                }
329302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                break;
329402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            case 1:
329502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            case 2:
329602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                if (print_headers) {
329702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    fprintf(where,
329802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            cpu_title,
329902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            format_units(),
330002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            local_cpu_method,
330102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            remote_cpu_method);
330202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                }
330302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                fprintf(where,
330502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        cpu_fmt_1,      /* the format string */
330602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        rsr_size,              /* remote recvbuf size */
330702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        lss_size,              /* local sendbuf size */
330802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        send_size,      /* how large were the sends */
330902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        elapsed_time,      /* how long was the test */
331002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        thruput,               /* what was the xfer rate */
331102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        local_cpu_utilization,   /* local cpu */
331202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        remote_cpu_utilization,   /* remote cpu */
331302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        local_service_demand,   /* local service demand */
331402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        remote_service_demand);   /* remote service demand */
331502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                break;
331602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
331702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
331802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
331902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* The tester did not wish to measure service demand. */
332002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        switch (verbosity) {
332202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            case 0:
332302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                fprintf(where,
332402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        tput_fmt_0,
332502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        thruput);
332602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                break;
332702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            case 1:
332802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            case 2:
332902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                if (print_headers) {
333002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    fprintf(where,tput_title,format_units());
333102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                }
333202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                fprintf(where,
333302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        tput_fmt_1,      /* the format string */
333402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        rsr_size,       /* remote recvbuf size */
333502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        lss_size,       /* local sendbuf size */
333602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        send_size,      /* how large were the sends */
333702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        elapsed_time,       /* how long did it take */
333802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        thruput);/* how fast did it go */
333902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                break;
334002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
334102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
334202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it would be a good thing to include information about some of the */
334402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* other parameters that may have been set for this test, but at the */
334502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* moment, I do not wish to figure-out all the  formatting, so I will */
334602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* just put this comment here to help remind me that it is something */
334702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that should be done at a later time. */
334802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
335002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* The user wanted to know it all, so we will give it to him. */
335102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* This information will include as much as we can find about */
335202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* TCP statistics, the alignments of the sends and receives */
335302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* and all that sort of rot... */
335402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* this stuff needs to be worked-out in the presence of confidence */
335602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* intervals and multiple iterations of the test... raj 11/94 */
335702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
335902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                ksink_fmt,
336002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                "Bytes",
336102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                "Bytes",
336202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                "Bytes",
336302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                local_send_align,
336402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                remote_recv_align,
336502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                local_send_offset,
336602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                remote_recv_offset,
336702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                bytes_sent,
336802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                bytes_sent / (double)nummessages,
336902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                nummessages,
337002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                bytes_sent / (double)tcp_stream_result->recv_calls,
337102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                tcp_stream_result->recv_calls);
337202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
337302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                ksink_fmt2,
337402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                tcp_mss);
337502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
337602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if 0 /* def WANT_HISTOGRAM */
337702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"\n\nHistogram of time spent in send() call.\n");
337802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
337902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        HIST_report(time_hist);
338002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
338102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
338202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
338402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* HAVE_ICSC_EXS */
338602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(HAVE_SENDFILE)
339002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(QUICK_SENDPATH)
339202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
339402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * a temporary stub for the sendpath() system call
339502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * which is defined & implemented in the kernel
339602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * but which has no libc stub.
339702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */
339802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
339902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/scall_define.h>
340002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/uio.h>
340102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
340202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectssize_t
340302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsendpath(int s, char *path, off_t offset, size_t nbytes,
340402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 const struct iovec *hdtrl, int flags)
340502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
340602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return syscall(SYS_sendpath, s, path, offset, nbytes, hdtrl, flags);
340702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
340802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* QUICK_SENDPATH */
340902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
341002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the TCP unidirectional data transfer test
341102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   (a.k.a. stream) for the sockets interface using the sendfile()
341202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   system call - TCP_SENDFILE.  It receives its  parameters via global
341302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   variables from the shell and writes its  output to the standard
341402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output. Basically,  this is the same test as the send_tcp_stream()
341502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   logic and we even tell the remote to do a TCP_STREAM test since for
341602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   all it knows, nothig is different. */
341702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
341802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
341902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsendfile_tcp_stream(remote_host)
342002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     char	remote_host[];
342102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
342202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
342402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
342502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
342602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
342702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
342802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
343002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
343102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
343302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f   %7.2f   \n";
343402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
343602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
343702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
343802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
343902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
344002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
344202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
344302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
344402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f\n";
344502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
344702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Sends   %-8.8s Recvs\n\
344802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
344902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv             Send (avg)          Recv (avg)\n\
345002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
345102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *ksink_fmt2 = "\n\
345302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
345402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
345502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
345602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
345702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
345902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
346102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-size greater than our send window. this will insure that we */
346202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
346302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
346402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
346502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
346602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sendfile_ring_elt *send_ring;
346802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int len;
347002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int nummessages = 0;
347102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET send_socket;
347202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_remaining;
347302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int tcp_mss = -1;  /* possibly uninitialized on printf far below */
347402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
347502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can send > 32 bits worth of bytes */
347602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) at some point, this should probably become a */
347702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 64bit integral type, but those are not entirely common yet */
347802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent = 0.0;
347902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
348102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
348202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
348302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
348402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
348602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct  addrinfo *remote_res;
348802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct  addrinfo *local_res;
348902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in	server;
349002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(__linux) || defined(__sun__)
349202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  off_t     scratch_offset;   /* the linux sendfile() call will update
349302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 the offset variable, which is
349402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 something we do _not_ want to happen
349502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 to the value in the send_ring! so, we
349602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 have to use a scratch variable. */
349702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __linux  || defined(__sun__) */
349802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined (USE_OSX)
349902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   off_t    scratch_len;  /* Darwin 9.x need a value-result parameter  */
350002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
350102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined (__sun__)
350202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   size_t  scratch_len;	/* the sun sendfilev() needs a place to
350302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   tell us how many bytes were written,
350402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   even though it also returns the value */
350502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   sendfilevec_t sv;
350602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __sun__ */
350702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
350802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_request_struct	*tcp_stream_request;
350902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_response_struct	*tcp_stream_response;
351002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_results_struct	*tcp_stream_result;
351102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
351202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_request  =
351302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_request_struct *)netperf_request.content.test_specific_data;
351402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response =
351502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_response_struct *)netperf_response.content.test_specific_data;
351602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_result   =
351702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_results_struct *)netperf_response.content.test_specific_data;
351802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
351902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
352002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
352102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
352202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
352302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
352402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
352502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
352602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
352702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
352802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
352902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&server,
353102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(server));
353202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
353402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
353502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
353602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
353702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
353802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
353902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
354002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
354102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to have some additional, interesting information in */
354202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the headers. we know some of it here, but not all, so we will */
354302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* only print the test title here and will print the results */
354402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* titles after the test is finished */
354502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef QUICK_SENDPATH
354602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP SENDPATH TEST",local_res,remote_res);
354702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
354802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP SENDFILE TEST",local_res,remote_res);
354902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* QUICK_SENDPATH */
355002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
355102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
355202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
355302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
355402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
355502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
355602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
355702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
355802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
355902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
356002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
356102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
356302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
356402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
356602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
356702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages    =	0;
356902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent     =	0.0;
357002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 	0;
357102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set up the data socket */
357302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
357402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
357602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: sendfile_tcp_stream: tcp stream data socket");
357702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
357802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
357902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
358102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"sendfile_tcp_stream: send_socket obtained...\n");
358202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
358302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(TCP_CORK)
358502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* should this even be here?!? */
358602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_tcpcork != 0) {
358702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the user wishes for us to set TCP_CORK on the socket */
358802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int one = 1;
358902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (setsockopt(send_socket,
359002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     getprotobyname("tcp")->p_proto,
359102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     TCP_CORK,
359202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     (char *)&one,
359302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     sizeof(one)) == SOCKET_ERROR) {
359402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("netperf: sendfile_tcp_stream: tcp_cork");
359502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
359602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
359702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
359802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"sendfile_tcp_stream: tcp_cork...\n");
359902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
360002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
360102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
360202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_CORK */
360302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
360402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have either retrieved the socket buffer sizes, */
360502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* or have tried to set them, so now, we may want to set the send */
360602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size based on that (because the user either did not use a -m */
360702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* option, or used one with an argument of 0). If the socket buffer */
360802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size is not available, we will set the send size to 4KB - no */
360902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular reason, just arbitrary... */
361002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*check for file size/ min file size here?  create file here/ back out???*/
361202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_size == 0) {
361402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lss_size > 0) {
361502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = lss_size;
361602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
361702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
361802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = 4096;
361902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
362002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
362102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer ring with the requested alignment and
362302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       offset. note also that we have allocated a quantity  of memory
362402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       that is at least one send-size greater than our socket  buffer
362502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       size. We want to be sure that there are at least two  buffers
362602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       allocated - this can be a bit of a problem when the  send_size
362702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       is bigger than the socket size, so we must check... the  user
362802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       may have wanted to explicitly set the "width" of our send
362902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       buffers, we should respect that wish... */
363002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*sendring -> an offset index that will shift the starting point of the*/
363202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*section of the file sent throughout the file*/
363302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) {
363502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_width = (lss_size/send_size) + 1;
363602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (send_width == 1) send_width++;
363702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
363802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
364002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* only allocate the send ring once. this is a networking test,
364202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 not a memory allocation test. this way, we do not need a
364302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 deallocate_buffer_ring() routine, and I don't feel like
364402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 writing one anyway :) raj 11/94 */
364502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = alloc_sendfile_buf_ring(send_width,
364702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					  send_size,
364802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					  local_send_align,
364902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					  local_send_offset);
365002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
365102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
365202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must
365302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       calibrate the cpu(s). We will perform this task within the
365402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       tests  themselves. If the user has specified the cpu rate, then
365502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       calibrate_local_cpu will return rather quickly as it will have
365602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       nothing to do. If local_cpu_rate is zero, then we will go
365702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       through  all the "normal" calibration stuff and return the rate
365802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       back. */
365902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
366102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
366202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
366302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the
366502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       socket  paramters on the other side at this point, hence the
366602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       reason for  all the values being passed in the setup
366702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       message. If the user did  not specify any of the parameters,
366802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       they will be passed as 0, which  will indicate to the remote
366902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       that no changes beyond the system's  default should be
367002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       used. Alignment is the exception, it will  default to 1, which
367102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       will be no alignment alterations. */
367202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
367302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type =	DO_TCP_STREAM;
367402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->send_buf_size	=	rss_size_req;
367502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->recv_buf_size	=	rsr_size_req;
367602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->receive_size	=	recv_size;
367702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->no_delay	=	rem_nodelay;
367802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->recv_alignment	=	remote_recv_align;
367902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->recv_offset	=	remote_recv_offset;
368002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->measure_cpu	=	remote_cpu_usage;
368102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->cpu_rate	=	remote_cpu_rate;
368202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
368302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
368402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->test_length	=	test_time;
368502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
368602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
368702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_stream_request->test_length	=	test_bytes;
368802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
368902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->so_rcvavoid	=	rem_rcvavoid;
369102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->so_sndavoid	=	rem_sndavoid;
369202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
369402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->dirty_count       =       rem_dirty_count;
369502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->clean_count       =       rem_clean_count;
369602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
369702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->port     = atoi(remote_data_port);
369802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
369902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
370102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
370202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: send_tcp_stream: requesting TCP stream test\n");
370302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
370402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
370602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant
370802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       socket parameters for this test type. We will put them back
370902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       into the variables here so they can be displayed if desired.
371002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       The remote will have calibrated CPU if necessary, and will have
371102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       done all the needed set-up we will have calibrated the cpu
371202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       locally before sending the request, and will grab the counter
371302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       value right after the connect returns. The remote will grab the
371402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       counter right after the accept call. This saves the hassle of
371502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       extra messages being sent for the TCP tests.  */
371602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
371802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
372002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
372102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote listen done.\n");
372202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size	      =	tcp_stream_response->recv_buf_size;
372302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size	      =	tcp_stream_response->send_buf_size;
372402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay     =	tcp_stream_response->no_delay;
372502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage=	tcp_stream_response->measure_cpu;
372602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate = tcp_stream_response->cpu_rate;
372702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have to make sure that the server port number is in */
372902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* network order */
373002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res,(short)tcp_stream_response->data_port_number);
373102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid	= tcp_stream_response->so_rcvavoid;
373202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid	= tcp_stream_response->so_sndavoid;
373302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
373402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
373502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
373602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
373702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
373802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
373902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
374002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
374102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
374202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
374302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
374402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
374502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
374602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_STREAM_SETUP(lss_size,rsr_size)
374702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
374802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
374902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
375002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
375102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
375202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET){
375302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_stream: data socket connect failed");
375402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf(" port: %d\n",ntohs(server.sin_port));
375502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
375602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
375702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
375802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either
375902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the connect would have failed, or the previous response would
376002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       have indicated a problem. I failed to see the value of the
376102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       extra message after the accept on the remote. If it failed,
376202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       we'll see it here. If it didn't, we might as well start pumping
376302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       data. */
376402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
376502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a stream test, they can be */
376602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* either time or byte-count based. */
376702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
376802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
376902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
377002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
377102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = 0;
377202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
377302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in previous revisions, we had the same code repeated throught
377402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         all the test suites. this was unnecessary, and meant more
377502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         work for me when I wanted to switch to POSIX signals, so I
377602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         have abstracted this out into a routine in netlib.c. if you
377702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         are experiencing signal problems, you might want to look
377802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         there. raj 11/94 */
377902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
378002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
378102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
378202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
378302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
378402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = test_bytes;
378502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
378602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
378702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
378802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
378902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
379002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
379102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
379302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
379502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
379602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
379702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before we start, initialize a few variables */
380002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
380102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
380202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (demo_mode) {
380302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(demo_one_ptr);
380402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
380502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
380602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
380702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is
380802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       controlled by time, the byte count check will always return
380902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       false. When the test is controlled by byte count, the time test
381002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       will always return false. When the test is finished, the whole
381102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       expression will go false and we will stop sending data. */
381202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
381302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (bytes_remaining > 0)) {
381402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
381502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the sendfile_tcp_stream test does not support making the buffers
381602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 dirty. 08/2000 */
381702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
381802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
381902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
382002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp just before we go into sendfile() and then again
382102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         just after we come out raj 08/2000 */
382202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* but only if we are actually going to display a histogram */
382302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
382402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
382502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
382602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
382702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* you can look at netlib.h for a description of the fields we
382802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 are passing to sendfile(). 08/2000 */
382902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef QUICK_SENDPATH
383002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len=sendpath(send_socket,
383102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			fill_file,
383202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->offset,
383302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->length,
383402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->hdtrl,
383502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->flags)) != send_size)
383602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined(__linux)
383702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	scratch_offset = send_ring->offset;
383802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len=sendfile(send_socket,
383902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->fildes,
384002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			&scratch_offset,   /* modified after the call! */
384102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->length)) != send_size)
384202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined (__sun__)
384302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must call with SFV_NOWAIT and a large file size (>= 16MB) to
384402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 get zero-copy, as well as compiling with  -D_LARGEFILE_SOURCE
384502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  -D_FILE_OFFSET_BITS=64 */
384602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sv.sfv_fd = send_ring->fildes;
384702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sv.sfv_flag = SFV_NOWAIT;
384802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sv.sfv_off = send_ring->offset;
384902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sv.sfv_len =  send_ring->length;
385002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len = sendfilev(send_socket, &sv, 1, &scratch_len)) != send_size)
385102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined(__FreeBSD__)
385202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* so close to HP-UX and yet so far away... :) */
385302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((sendfile(send_ring->fildes,
385402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_socket,
385502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_ring->offset,
385602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_ring->length,
385702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      NULL,
385802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      (off_t *)&len,
385902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_ring->flags) != 0) ||
386002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (len != send_size))
386102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined(USE_OSX)
386202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    scratch_len = send_ring->length;
386302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((sendfile(send_ring->fildes,
386402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              send_socket,
386502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              send_ring->offset,
386602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (off_t *)&scratch_len,
386702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              NULL,
386802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              send_ring->flags) != 0) ||
386902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (scratch_len != send_size))
387002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* original sendile HP-UX */
387102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if ((len=sendfile(send_socket,
387202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    send_ring->fildes,
387302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    send_ring->offset,
387402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    send_ring->length,
387502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    send_ring->hdtrl,
387602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    send_ring->flags)) != send_size)
387702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* QUICK_SENDPATH */
387802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    {
387902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* the test was interrupted, must be the end of test. the
388002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 send_tcp_stream code has some WIN32 ifdefs that we do not
388102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 need here. */
388202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      if ((len >=0) || SOCKET_EINTR(len)) {
388302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		break;
388402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      }
388502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      perror("netperf: data send error: sendfile");
388602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fprintf(stderr,
388702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      "len was %d send_size was %d\n",
388802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      len,
388902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_size);
389002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fflush(stderr);
389102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      exit(1);
389202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
389302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
389402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /*	offset += len;*/
389502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
389602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
389702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
389802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp the exit from the send call and update the
389902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   histogram */
390002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
390202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
390302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
390402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
390502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
390702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_STREAM_INTERVAL(send_size);
390802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
390902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
391002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
391102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
391202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
391302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
391402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
391502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...we may also want to wrap back to the "beginning" */
391602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* of the bufferspace, so we will mod the number of messages sent */
391702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by the send width, and use that to calculate the offset to add */
391802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to the base pointer. */
391902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
392002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
392102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
392202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (bytes_remaining) {
392302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bytes_remaining -= send_size;
392402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
392502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
392602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
392702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test is over. Flush the buffers to the remote end. We do a
392802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       graceful release to insure that all data has been taken by the
392902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       remote. */
393002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
393102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but first, if the verbosity is greater than 1, find-out what */
393202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the TCP maximum segment_size was (if possible) */
393302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
393402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_mss = -1;
393502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      get_tcp_info(send_socket,&tcp_mss);
393602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
393702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
393802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (shutdown(send_socket,SHUT_WR) == SOCKET_ERROR) {
393902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: cannot shutdown tcp stream socket");
394002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
394102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
394202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
394302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* hang a recv() off the socket to block until the remote has */
394402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* brought all the data up into the application. it will do a */
394502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* shutdown to cause a FIN to be sent our way. We will assume that */
394602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* any exit from the recv() call is good... raj 4/93 */
394702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
394802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since we are using sendfile() instead of send, we have no
394902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       scratch buffer from the send_ring to use for the
395002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       receive. however, since we "know" that the recv should be
395102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       returning zero bytes (not that we are making the checks we
395202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       should) we can pass the address of the flags field. raj 08/2000
395302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    */
395402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
395502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv(send_socket,
395602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 &(send_ring->flags),
395702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 sizeof(send_ring->flags),
395802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 0);
395902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
396002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
396102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
396202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
396302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
396402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured and how */
396502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* long did we really */
396602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* run? */
396702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
396802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are finished with the socket, so close it to prevent hitting */
396902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the limit on maximum open files. */
397002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
397202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
397402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated service demand and all those interesting things. If it */
397502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wasn't supposed to care, it will return obvious values. */
397602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
397802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
398002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
398102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
398202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
398302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
398402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
398502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
398602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
398702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
398802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
398902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
399002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
399102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
399202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
399302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
399402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
399502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our thruput was for the test. In the future, */
399602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we may want to include a calculation of the thruput measured by */
399702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the remote, but it should be the case that for a TCP stream test, */
399802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that the two numbers should be *very* close... We calculate */
399902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* bytes_sent regardless of the way the test length was controlled. */
400002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If it was time, we needed to, and if it was by bytes, the user may */
400102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have specified a number of bytes that wasn't a multiple of the */
400202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size, so we really didn't send what he asked for ;-) */
400302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
400402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent	= ntohd(tcp_stream_result->bytes_received);
400502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
400602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= calc_thruput(bytes_sent);
400702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
400802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
400902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
401002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
401102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
401202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
401302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
401402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
401502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
401602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
401702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
401802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_sent,
401902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
402002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
402102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
402202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
402302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
402402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
402502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
402602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
402702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
402802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
402902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
403002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= tcp_stream_result->cpu_util;
403102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_sent,
403202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
403302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
403402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      tcp_stream_result->num_cpus);
403502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
403602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
403702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
403802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
403902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
404002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
404102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
404202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
404302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
404402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
404502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
404602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
404702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
404802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
404902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
405002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
405102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
405202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
405302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
405402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
405502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
405602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
405702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
405802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
405902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
406002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
406102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
406202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
406302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
406402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
406502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have finished making all the runs that we */
406602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be making. so, we should extract what the calcuated values */
406702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are for all the confidence stuff. we could make the values */
406802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* global, but that seemed a little messy, and it did not seem worth */
406902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the mucking with header files. so, we create a routine much */
407002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* like calcualte_confidence, which just returns the mean values. */
407102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 11/94 */
407202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
407302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
407402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
407502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
407602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
407702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
407802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
407902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
408002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
408102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
408202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
408302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
408402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
408502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
408602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
408702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
408802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
408902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
409002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
409102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
409202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
409302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
409402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
409502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
409602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
409702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
409802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(tcp_stream_result->cpu_method);
409902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
410002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
410102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
410202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
410302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
410402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
410502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
410602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
410702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
410802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
410902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
411002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
411102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
411202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
411302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
411402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
411502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
411602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
411702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
411802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
411902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
412002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
412102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
412202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
412302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
412402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
412502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
412602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
412702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
412802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
412902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
413002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
413102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,		        /* remote recvbuf size */
413202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
413302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
413402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
413502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		        /* what was the xfer rate */
413602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
413702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
413802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
413902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
414002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
414102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
414202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
414302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
414402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
414502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
414602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
414702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
414802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
414902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
415002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
415102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
415202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
415302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
415402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
415502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
415602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
415702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
415802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
415902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
416002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
416102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
416202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
416302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
416402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
416502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
416602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size, 		/* remote recvbuf size */
416702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size, 		/* local sendbuf size */
416802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
416902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
417002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);/* how fast did it go */
417102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
417202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
417302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
417402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
417502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
417602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
417702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
417802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
417902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
418002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
418102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
418202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
418302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
418402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
418502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
418602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
418702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
418802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this stuff needs to be worked-out in the presence of confidence */
418902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* intervals and multiple iterations of the test... raj 11/94 */
419002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
419102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
419202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
419302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
419402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
419502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
419602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
419702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
419802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
419902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
420002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
420102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
420202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
420302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)tcp_stream_result->recv_calls,
420402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_stream_result->recv_calls);
420502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
420602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
420702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt2,
420802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_mss);
420902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
421002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
421102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
421202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
421302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
421402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n\nHistogram of time spent in send() call.\n");
421502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
421602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
421702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
421802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
421902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
422002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
422102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* HAVE_SENDFILE */
422202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
422302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This is the server-side routine for the tcp stream test. It is */
422402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* implemented as one routine. I could break things-out somewhat, but */
422502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* didn't feel it was necessary. */
422602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
422702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
422802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_tcp_stream()
422902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
423002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
423102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage myaddr_in, peeraddr_in;
423202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET s_listen,s_data;
423302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t addrlen;
423402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
423502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	receive_calls;
423602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
423702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double   bytes_received;
423802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
423902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
424002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
424102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
424202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
424302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
424402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
424502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
424602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fd_set readfds;
424702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct timeval timeout;
424802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
424902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
425002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_request_struct	*tcp_stream_request;
425102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_response_struct	*tcp_stream_response;
425202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_stream_results_struct	*tcp_stream_results;
425302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
425402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
425502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  FD_ZERO(&readfds);
425602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_sec = 1;
425702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_usec = 0;
425802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
425902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
426002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_request	=
426102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_request_struct *)netperf_request.content.test_specific_data;
426202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response	=
426302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_response_struct *)netperf_response.content.test_specific_data;
426402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_results	=
426502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_stream_results_struct *)netperf_response.content.test_specific_data;
426602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
426702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
426802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_tcp_stream: entered...\n");
426902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
427002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
427102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
427202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
427302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
427402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
427502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
427602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
427702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
427802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
427902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
428002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
428102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
428202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
428302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
428402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
428502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
428602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_stream: setting the response type...\n");
428702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
428802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
428902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
429002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = TCP_STREAM_RESPONSE;
429102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
429202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
429302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_stream: the response type is set...\n");
429402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
429502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
429602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
429702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
429802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
429902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
430002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
430102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_stream: requested alignment of %d\n",
430202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_stream_request->recv_alignment);
430302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
430402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
430502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
430602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
430702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
430802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
430902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
431002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = tcp_stream_request->send_buf_size;
431102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = tcp_stream_request->recv_buf_size;
431202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay  = tcp_stream_request->no_delay;
431302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = tcp_stream_request->so_rcvavoid;
431402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = tcp_stream_request->so_sndavoid;
431502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
431602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
431702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
431802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(tcp_stream_request->ipfamily),
431902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_stream_request->port);
432002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
432102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
432202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
432302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
432402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(tcp_stream_request->ipfamily),
432502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
432602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
432702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
432802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
432902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
433002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
433102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
433202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
433302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
433402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
433502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
433602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
433702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
433802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test timer can fire during operations on the listening socket,
433902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     so to make the start_timer below work we have to move
434002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     it to close s_listen while we are blocked on accept. */
434102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket2 = s_listen;
434202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
434302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
434402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what sort of sizes did we end-up with? */
434502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_stream_request->receive_size == 0) {
434602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lsr_size > 0) {
434702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = lsr_size;
434802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
434902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
435002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = 4096;
435102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
435202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
435302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
435402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_size = tcp_stream_request->receive_size;
435502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
435602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
435702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to set-up our recv_ring in a manner analagous to what we */
435802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* do on the sending side. this is more for the sake of symmetry */
435902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* than for the needs of say copy avoidance, but it might also be */
436002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* more realistic - this way one could conceivably go with a */
436102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* double-buffering scheme when taking the data an putting it into */
436202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the filesystem or something like that. raj 7/94 */
436302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
436402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) {
436502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_width = (lsr_size/recv_size) + 1;
436602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 1) recv_width++;
436702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
436802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
436902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
437002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   recv_size,
437102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_stream_request->recv_alignment,
437202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_stream_request->recv_offset);
437302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
437402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
437502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_stream: receive alignment and offset set...\n");
437602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
437702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
437802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
437902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
438002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
438102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
438202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
438302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
438402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
438502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
438602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
438702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
438802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
438902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
439002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
439102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
439202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
439302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
439402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
439502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
439602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
439702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
439802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
439902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
440002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
440102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
440202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
440302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
440402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
440502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response->data_port_number =
440602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
440702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
440802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
440902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
441002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
441102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
441202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
441302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
441402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
441502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response->cpu_rate = (float)0.0; 	/* assume no cpu */
441602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_stream_request->measure_cpu) {
441702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_response->measure_cpu = 1;
441802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_response->cpu_rate =
441902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(tcp_stream_request->cpu_rate);
442002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
442102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
442202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_response->measure_cpu = 0;
442302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
442402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
442502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
442602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
442702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response->send_buf_size = lss_size;
442802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response->recv_buf_size = lsr_size;
442902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response->no_delay = loc_nodelay;
443002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response->so_rcvavoid = loc_rcvavoid;
443102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response->so_sndavoid = loc_sndavoid;
443202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_response->receive_size = recv_size;
443302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
443402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
443502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
443602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
443702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
443802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data=accept(s_listen,
443902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     (struct sockaddr *)&peeraddr_in,
444002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &addrlen)) == INVALID_SOCKET) {
444102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
444202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
444302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
444402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
444502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
444602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
444702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass */
444802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* attributes across an accept() call. Including this goes against */
444902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* my better judgement :( raj 11/95 */
445002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
445102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
445202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
445302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
445402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
445502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
445602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
445702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
445802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(tcp_stream_request->measure_cpu);
445902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
446002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
446102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
446202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
446302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* there used to be an #ifdef DIRTY call to access_buffer() here,
446402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     but we have switched from accessing the buffer before the recv()
446502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     call to accessing the buffer after the recv() call.  The
446602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     accessing before was, IIRC, related to having dirty data when
446702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     doing page-flipping copy avoidance. */
446802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
446902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_received = 0;
447002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  receive_calls  = 0;
447102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
447202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((len = recv(s_data, recv_ring->buffer_ptr, recv_size, 0)) != 0) {
447302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (len == SOCKET_ERROR )
447402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
447502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
447602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
447702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
447802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
447902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_received += len;
448002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    receive_calls++;
448102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
448202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
448302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we access the buffer after the recv() call now, rather than before */
448402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    access_buffer(recv_ring->buffer_ptr,
448502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  recv_size,
448602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  tcp_stream_request->dirty_count,
448702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  tcp_stream_request->clean_count);
448802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
448902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
449002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
449102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* move to the next buffer in the recv_ring */
449202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
449302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
449402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef PAUSE
449502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sleep(1);
449602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* PAUSE */
449702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
449802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
449902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	FD_SET(s_data,&readfds);
450002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	select(s_data+1,&readfds,NULL,NULL,&timeout);
450102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
450202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
450302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
450402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
450502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* perform a shutdown to signal the sender that */
450602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have received all the data sent. raj 4/93 */
450702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
450802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (shutdown(s_data,SHUT_WR) == SOCKET_ERROR) {
450902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
451002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
451102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
451202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
451302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
451402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(tcp_stream_request->measure_cpu,&elapsed_time);
451502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
451602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
451702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
451802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
451902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
452002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_stream: got %g bytes\n",
452102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
452202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
452302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_stream: got %d recvs\n",
452402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
452502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
452602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
452702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
452802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_results->bytes_received	= htond(bytes_received);
452902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_results->elapsed_time	= elapsed_time;
453002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_results->recv_calls	= receive_calls;
453102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
453202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_results->cpu_method = cpu_method;
453302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_stream_results->num_cpus   = lib_num_loc_cpus;
453402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
453502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_stream_request->measure_cpu) {
453602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_stream_results->cpu_util	= calc_cpu_util(0.0);
453702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
453802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
453902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
454002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
454102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_stream: test complete, sending results.\n");
454202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
454302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 bytes_received %g receive_calls %d\n",
454402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received,
454502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
454602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
454702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 len %d\n",
454802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    len);
454902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
455002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
455102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
455202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
455302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
455402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
455502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
455602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_listen);
455702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
455802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
455902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
456002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This is the server-side routine for the tcp maerts test. It is
456102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   implemented as one routine. I could break things-out somewhat, but
456202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   didn't feel it was necessary. */
456302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
456402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
456502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_tcp_maerts()
456602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
456702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
456802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage myaddr_in, peeraddr_in;
456902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
457002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  local_name[BUFSIZ];
457102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  port_buffer[PORTBUFSIZE];
457202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
457302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,s_data;
457402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
457502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
457602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	send_calls;
457702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
457802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double   bytes_sent = 0.0 ;
457902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
458002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
458102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
458202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_maerts_request_struct	*tcp_maerts_request;
458302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_maerts_response_struct	*tcp_maerts_response;
458402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_maerts_results_struct	*tcp_maerts_results;
458502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
458602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_request	=
458702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_maerts_request_struct *)netperf_request.content.test_specific_data;
458802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response	=
458902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_maerts_response_struct *)netperf_response.content.test_specific_data;
459002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_results	=
459102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_maerts_results_struct *)netperf_response.content.test_specific_data;
459202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
459302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
459402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_tcp_maerts: entered...\n");
459502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
459602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
459702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
459802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired
459902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     parameters and then let the initiator know that all is ready. If
460002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     socket size defaults are to be used, then the initiator will have
460102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     sent us 0's. If the socket sizes cannot be changed, then we will
460202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     send-back what they are. If that information cannot be
460302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     determined, then we send-back -1's for the sizes. If things go
460402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     wrong for any reason, we will drop back ten yards and punt. */
460502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
460602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It
460702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     would be best if the error that the remote reports to the user is
460802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     the actual error we encountered, rather than some bogus
460902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     unexpected response type message. */
461002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
461102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
461202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_maerts: setting the response type...\n");
461302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
461402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
461502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
461602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = TCP_MAERTS_RESPONSE;
461702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
461802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
461902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_maerts: the response type is set...\n");
462002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
462102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
462202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
462302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
462402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
462502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
462602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
462702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_maerts: requested alignment of %d\n",
462802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_maerts_request->send_alignment);
462902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
463002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
463102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
463202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
463302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
463402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
463502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_maerts: grabbing a socket...\n");
463602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
463702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
463802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
463902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
464002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
464102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
464202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
464302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = tcp_maerts_request->send_buf_size;
464402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = tcp_maerts_request->recv_buf_size;
464502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = tcp_maerts_request->no_delay;
464602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = tcp_maerts_request->so_rcvavoid;
464702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = tcp_maerts_request->so_sndavoid;
464802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
464902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
465002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
465102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(tcp_maerts_request->ipfamily),
465202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_maerts_request->port);
465302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
465402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
465502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
465602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
465702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(tcp_maerts_request->ipfamily),
465802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
465902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
466002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
466102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
466202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
466302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
466402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
466502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
466602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
466702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
466802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
466902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
467102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test timer can fire during operations on the listening socket,
467202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     so to make the start_timer below work we have to move
467302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     it to close s_listen while we are blocked on accept. */
467402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket2 = s_listen;
467502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
467602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what sort of sizes did we end-up with? */
467902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_maerts_request->send_size == 0) {
468002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lss_size > 0) {
468102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = lss_size;
468202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
468302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
468402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = 4096;
468502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
468602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
468702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
468802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_size = tcp_maerts_request->send_size;
468902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
469002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
469102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to set-up our recv_ring in a manner analagous to what we */
469202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* do on the recving side. this is more for the sake of symmetry */
469302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* than for the needs of say copy avoidance, but it might also be */
469402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* more realistic - this way one could conceivably go with a */
469502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* double-buffering scheme when taking the data an putting it into */
469602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the filesystem or something like that. raj 7/94 */
469702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
469802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) {
469902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_width = (lsr_size/send_size) + 1;
470002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 1) send_width++;
470102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
470202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
470302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
470402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   send_size,
470502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_maerts_request->send_alignment,
470602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_maerts_request->send_offset);
470702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
470802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
470902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_maerts: receive alignment and offset set...\n");
471002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
471102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
471202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
471302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
471402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
471502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
471602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
471702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
471802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
471902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
472002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
472102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
472202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
472302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
472402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
472502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
472602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
472702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
472802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
472902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
473002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
473102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
473202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
473302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
473402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
473502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
473602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
473702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
473802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
473902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response->data_port_number =
474002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
474102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
474202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
474302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
474402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
474502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
474602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
474702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
474802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
474902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response->cpu_rate = (float)0.0; 	/* assume no cpu */
475002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_maerts_request->measure_cpu) {
475102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_maerts_response->measure_cpu = 1;
475202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_maerts_response->cpu_rate =
475302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(tcp_maerts_request->cpu_rate);
475402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
475502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
475602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_maerts_response->measure_cpu = 0;
475702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
475802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
475902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
476002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
476102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response->send_buf_size = lss_size;
476202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response->recv_buf_size = lsr_size;
476302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response->no_delay = loc_nodelay;
476402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response->so_rcvavoid = loc_rcvavoid;
476502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response->so_sndavoid = loc_sndavoid;
476602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_response->send_size = send_size;
476702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
476802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
476902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
477002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
477102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
477202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we will start the timer before the accept() to be somewhat
477302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     analagous to the starting of the timer before the connect() call
477402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     in the TCP_STREAM test. raj 2002-06-21 */
477502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
477602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  start_timer(tcp_maerts_request->test_length);
477702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
477802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will
477902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     first grab the apropriate counters and then start grabbing. */
478002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
478102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(tcp_maerts_request->measure_cpu);
478202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
478302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
478402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data=accept(s_listen,
478502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     (struct sockaddr *)&peeraddr_in,
478602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &addrlen)) == INVALID_SOCKET) {
478702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
478802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
478902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
479002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
479102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
479202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
479302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
479402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass
479502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     attributes across an accept() call. Including this goes against
479602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     my better judgement :( raj 11/95 */
479702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
479802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
479902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
480002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
480102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
480202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
480302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
480402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
480502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_sent = 0.0;
480602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_calls  = 0;
480702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
480802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  len = 0;   /* nt-lint; len is not initialized (printf far below) if
480902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		times_up initially true.*/
481002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up = 0; /* must remember to initialize this little beauty */
481102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (!times_up) {
481202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
481302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
481402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to dirty some number of consecutive integers in the buffer */
481502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are about to send. we may also want to bring some number of */
481602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* them cleanly into the cache. The clean ones will follow any dirty */
481702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ones into the cache. */
481802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
481902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  access_buffer(send_ring->buffer_ptr,
482002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		send_size,
482102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		tcp_maerts_request->dirty_count,
482202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		tcp_maerts_request->clean_count);
482302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
482402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
482502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
482602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((len=send(s_data,
482702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 send_ring->buffer_ptr,
482802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 send_size,
482902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 0)) != send_size) {
483002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if ((len >=0) || SOCKET_EINTR(len)) {
483102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* the test was interrupted, must be the end of test */
483202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
483302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
483402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
483502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
483602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
483702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
483802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
483902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent += len;
484002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_calls++;
484102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
484202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* more to the next buffer in the send_ring */
484302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
484402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
484502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
484602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
484702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* perform a shutdown to signal the sender that */
484802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have received all the data sent. raj 4/93 */
484902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
485002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (shutdown(s_data,SHUT_WR) == SOCKET_ERROR) {
485102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
485202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
485302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
485402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
485502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
485602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* hang a recv() off the socket to block until the remote has
485702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     brought all the data up into the application. it will do a
485802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     shutdown to cause a FIN to be sent our way. We will assume that
485902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     any exit from the recv() call is good... raj 4/93 */
486002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
486102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv(s_data, send_ring->buffer_ptr, send_size, 0);
486202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
486302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
486402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(tcp_maerts_request->measure_cpu,&elapsed_time);
486502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
486602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
486702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
486802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
486902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
487002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_maerts: got %g bytes\n",
487102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent);
487202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
487302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_maerts: got %d sends\n",
487402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    send_calls);
487502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
487602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
487702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
487802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_results->bytes_sent	= htond(bytes_sent);
487902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_results->elapsed_time	= elapsed_time;
488002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_results->send_calls	= send_calls;
488102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
488202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_maerts_request->measure_cpu) {
488302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_maerts_results->cpu_util	= calc_cpu_util(0.0);
488402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
488502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
488602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
488702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
488802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_maerts: test complete, sending results.\n");
488902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
489002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 bytes_sent %g send_calls %d\n",
489102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
489202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    send_calls);
489302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
489402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 len %d\n",
489502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    len);
489602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
489702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
489802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
489902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_results->cpu_method = cpu_method;
490002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_maerts_results->num_cpus   = lib_num_loc_cpus;
490102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
490202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
490302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
490402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
490502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_listen);
490602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
490702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
490802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
490902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
491002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the sending (netperf) side of the TCP_RR */
491102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test. */
491202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
491302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
491402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_tcp_rr(char remote_host[])
491502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
491602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
491702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
491802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
491902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
492002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
492102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
492202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
492302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title_band = "\
492402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
492502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  \n\
492602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Throughput \n\
492702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    %s/sec   \n\n";
492802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
492902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
493002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f %s\n";
493102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
493202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
493302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   %s\n";
493402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
493502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
493602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
493702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
493802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
493902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
494002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
494102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
494202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
494302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title_tput = "\
494402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
494502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Tput     CPU    CPU    S.dem   S.dem\n\
494602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    %-8.8s local  remote local   remote\n\
494702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
494802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
494902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
495002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c %s\n";
495102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
495202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
495302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f  %-6.2f %-6.2f %-6.3f  %-6.3f %s\n";
495402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
495502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
495602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
495702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
495802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
495902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         RoundTrip  Trans    Throughput\n\
496002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Latency    Rate     %-8.8s/s\n\
496102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv    usec/Tran  per sec  Outbound   Inbound\n\
496202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d   %-6.3f   %-6.3f %-6.3f    %-6.3f\n";
496302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
496402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
496502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
496602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
496702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
496802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
496902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
497002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
497102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	send_socket;
497202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
497302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
497402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
497502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
497602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
497702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
497802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
497902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
498002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
498102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
498202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
498302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
498402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
498502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
498602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
498702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
498802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
498902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
499002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_request_struct	*tcp_rr_request;
499102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_response_struct	*tcp_rr_response;
499202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_results_struct	*tcp_rr_result;
499302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
499402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
499502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define REQUEST_CWND_INITIAL 2
499602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "in the beginning..." the WANT_FIRST_BURST stuff was like both
499702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     Unix and the state of New Jersey - both were simple an unspoiled.
499802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     then it was realized that some stacks are quite picky about
499902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     initial congestion windows and a non-trivial initial burst of
500002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     requests would not be individual segments even with TCP_NODELAY
500102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     set. so, we have to start tracking a poor-man's congestion window
500202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     up here in window space because we want to try to make something
500302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     happen that frankly, we cannot guarantee with the specification
500402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     of TCP.  ain't that grand?-)  raj 2006-01-30 */
500502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int requests_outstanding = 0;
500602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int request_cwnd = REQUEST_CWND_INITIAL;  /* we ass-u-me that having
500702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       three requests
500802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       outstanding at the
500902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       beginning of the test
501002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       is ok with TCP stacks
501102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       of interest. the first
501202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       two will come from our
501302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       first_burst loop, and
501402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       the third from our
501502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       regularly scheduled
501602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       send */
501702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
501802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
501902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_request =
502002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_request_struct *)netperf_request.content.test_specific_data;
502102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response=
502202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_response_struct *)netperf_response.content.test_specific_data;
502302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_result	=
502402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_results_struct *)netperf_response.content.test_specific_data;
502502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
502602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
502702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
502802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
502902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
503002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
503102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
503202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
503302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
503402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
503502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
503602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
503702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
503802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
503902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
504002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
504102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
504202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
504302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
504402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
504502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP REQUEST/RESPONSE TEST",local_res,remote_res);
504602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
504702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
504802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
504902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
505002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
505102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = NULL;
505202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
505302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
505402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
505502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
505602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
505702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
505802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
505902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
506002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
506102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
506202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
506302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
506402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
506502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
506602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
506702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
506802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages     = 0;
506902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd     = 0.0;
507002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up        = 0;
507102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    timed_out       = 0;
507202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
507302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
507402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
507502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we have to remember to reset the number of transactions
507602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       outstanding and the "congestion window for each new
507702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       iteration. raj 2006-01-31 */
507802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    requests_outstanding = 0;
507902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_cwnd = REQUEST_CWND_INITIAL;
508002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
508102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
508202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
508302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffers with the requested alignment and offset. */
508402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since this is a request/response test, default the send_width and */
508502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* recv_width to 1 and not two raj 7/94 */
508602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
508702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 1;
508802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) recv_width = 1;
508902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
509002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
509102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
509202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       req_size,
509302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
509402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
509502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
509602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
509702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
509802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
509902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       rsp_size,
510002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
510102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
510202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
510302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
510402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
510502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
510602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
510702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
510802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_rr: tcp stream data socket");
510902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
511002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
511102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
511202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
511302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_tcp_rr: send_socket obtained...\n");
511402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
511502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
511602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
511702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
511802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
511902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
512002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
512102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back.*/
512202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
512302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
512402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
512502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
512602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
512702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
512802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Tell the remote end to do a listen. The server alters the
512902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket paramters on the other side at this point, hence the
513002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 reason for all the values being passed in the setup
513102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 message. If the user did not specify any of the parameters,
513202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 they will be passed as 0, which will indicate to the remote
513302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that no changes beyond the system's default should be
513402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 used. Alignment is the exception, it will default to 8, which
513502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will be no alignment alterations. */
513602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
513702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_request.content.request_type	=	DO_TCP_RR;
513802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->recv_buf_size	=	rsr_size_req;
513902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->send_buf_size	=	rss_size_req;
514002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->recv_alignment    =	remote_recv_align;
514102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->recv_offset	=	remote_recv_offset;
514202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->send_alignment    =	remote_send_align;
514302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->send_offset	=	remote_send_offset;
514402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->request_size	=	req_size;
514502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->response_size	=	rsp_size;
514602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->no_delay	        =	rem_nodelay;
514702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->measure_cpu	=	remote_cpu_usage;
514802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->cpu_rate	        =	remote_cpu_rate;
514902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->so_rcvavoid	=	rem_rcvavoid;
515002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->so_sndavoid	=	rem_sndavoid;
515102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (test_time) {
515202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	tcp_rr_request->test_length	=	test_time;
515302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
515402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
515502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	tcp_rr_request->test_length	=	test_trans * -1;
515602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
515702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->port              =      atoi(remote_data_port);
515802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
515902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
516002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 1) {
516102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"netperf: send_tcp_rr: requesting TCP rr test\n");
516202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
516302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
516402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_request();
516502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
516602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The response from the remote will contain all of the relevant
516702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket parameters for this test type. We will put them back
516802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 into the variables here so they can be displayed if desired.
516902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 The remote will have calibrated CPU if necessary, and will
517002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 have done all the needed set-up we will have calibrated the
517102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 cpu locally before sending the request, and will grab the
517202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 counter value right after the connect returns. The remote
517302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will grab the counter right after the accept call. This saves
517402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 the hassle of extra messages being sent for the TCP
517502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 tests.  */
517602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
517702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
517802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
517902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
518002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
518102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote listen done.\n");
518202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size          = tcp_rr_response->recv_buf_size;
518302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size          = tcp_rr_response->send_buf_size;
518402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_nodelay       = tcp_rr_response->no_delay;
518502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_usage  = tcp_rr_response->measure_cpu;
518602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_rate   = tcp_rr_response->cpu_rate;
518702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure that port numbers are in network order */
518802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	set_port_number(remote_res,(short)tcp_rr_response->data_port_number);
518902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
519002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
519102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
519202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
519302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
519402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
519502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
519602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
519702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
519802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
519902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
520002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
520102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
520202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
520302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_RR_SETUP(1000)
520402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
520502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
520602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
520702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
520802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
520902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET){
521002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: data socket connect failed");
521102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
521202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
521302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
521402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
521502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either the */
521602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect would have failed, or the previous response would have */
521702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indicated a problem. I failed to see the value of the extra */
521802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* message after the accept on the remote. If it failed, we'll see it */
521902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here. If it didn't, we might as well start pumping data. */
522002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
522102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a request/response test, they */
522202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can be either time or transaction based. */
522302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
522402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
522502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
522602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
522702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = 0;
522802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
522902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
523002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
523102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
523202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = test_bytes;
523302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
523402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
523502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
523602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
523702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
523802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
523902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
524002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
524102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
524202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
524302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
524402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
524502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
524602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
524702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
524802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
524902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
525002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. I think I */
525102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* just arbitrarily decrement trans_remaining for the timed test, but */
525202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will not do that just yet... One other question is whether or not */
525302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the send buffer and the receive buffer should be the same buffer. */
525402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
525502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
525602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
525702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(demo_one_ptr);
525802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
525902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
526002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
526102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (trans_remaining > 0)) {
526202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send the request. we assume that if we use a blocking socket, */
526302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the request will be sent at one shot. */
526402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
526502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
526602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we can inject no more than request_cwnd, which will grow with
526702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 time, and no more than first_burst_size.  we don't use <= to
526802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 account for the "regularly scheduled" send call.  of course
526902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that makes it more a "max_outstanding_ than a
527002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 "first_burst_size" but for now we won't fix the names. also,
527102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 I suspect the extra check against < first_burst_size is
527202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 redundant since later I expect to make sure that request_cwnd
527302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 can never get larger than first_burst_size, but just at the
527402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 moment I'm feeling like a belt and suspenders kind of
527502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 programmer. raj 2006-01-30 */
527602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while ((first_burst_size > 0) &&
527702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     (requests_outstanding < request_cwnd) &&
527802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     (requests_outstanding < first_burst_size)) {
527902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
528002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
528102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "injecting, req_outstndng %d req_cwnd %d burst %d\n",
528202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  requests_outstanding,
528302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  request_cwnd,
528402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  first_burst_size);
528502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
528602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((len = send(send_socket,
528702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->buffer_ptr,
528802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			req_size,
528902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			0)) != req_size) {
529002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we should never hit the end of the test in the first burst */
529102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_tcp_rr: initial burst data send error");
529202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(-1);
529302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
529402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	requests_outstanding += 1;
529502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
529602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
529702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
529802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
529902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
530002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
530102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp just before our call to send, and then again just
530202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   after the receive raj 8/94 */
530302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* but only if we are actually going to display one. raj
530402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   2007-02-07 */
530502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
530602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
530702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
530802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
530902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
531002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len = send(send_socket,
531102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_ring->buffer_ptr,
531202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      req_size,
531302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      0)) != req_size) {
531402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (SOCKET_EINTR(len) || (errno == 0)) {
531502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we hit the end of a */
531602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* timed test. */
531702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
531802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
531902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
532002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("send_tcp_rr: data send error");
532102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
532202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
532302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
532402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
532502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
532602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      requests_outstanding += 1;
532702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
532802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
532902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* receive the response */
533002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_left = rsp_size;
533102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_message_ptr  = recv_ring->buffer_ptr;
533202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while(rsp_bytes_left > 0) {
533302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if((rsp_bytes_recvd=recv(send_socket,
533402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 temp_message_ptr,
533502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 rsp_bytes_left,
533602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 0)) == SOCKET_ERROR) {
533702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if ( SOCKET_EINTR(rsp_bytes_recvd) ) {
533802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    /* We hit the end of a timed test. */
533902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			timed_out = 1;
534002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			break;
534102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
534202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_tcp_rr: data recv error");
534302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
534402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
534502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_bytes_left -= rsp_bytes_recvd;
534602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += rsp_bytes_recvd;
534702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
534802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
534902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
535002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
535102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* so, since we've gotten a response back, update the
535202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 bookkeeping accordingly.  there is one less request
535302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 outstanding and we can put one more out there than before. */
535402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      requests_outstanding -= 1;
535502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (request_cwnd < first_burst_size) {
535602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_cwnd += 1;
535702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
535802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
535902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "incr req_cwnd to %d first_burst %d reqs_outstndng %d\n",
536002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  request_cwnd,
536102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  first_burst_size,
536202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  requests_outstanding);
536302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
536402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
536502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
536602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (timed_out) {
536702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we may have been in a nested while loop - we need */
536802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* another call to break. */
536902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
537002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
537102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
537202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
537302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
537402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
537502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
537602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
537702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
537802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
537902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
538002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_RR_INTERVAL(1);
538102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
538202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
538302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
538402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
538502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
538602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
538702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
538802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
538902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
539002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
539102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
539202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
539302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((nummessages % 100) == 0) {
539402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
539502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "Transaction %d completed\n",
539602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  nummessages);
539702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
539802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
539902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
540002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
540102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
540202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* At this point we used to call shutdown on the data socket to be
540302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       sure all the data was delivered, but this was not germane in a
540402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       request/response test, and it was causing the tests to "hang"
540502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       when they were being controlled by time. So, I have replaced
540602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       this shutdown call with a call to close that can be found later
540702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       in the procedure. */
540802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
540902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test,
541002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       and will also store-away the necessaries for cpu utilization */
541102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
541202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
541302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured? how long */
541402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* did we really run? */
541502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
541602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
541702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Get the statistics from the remote end. The remote will have
541802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 calculated CPU utilization. If it wasn't supposed to care, it
541902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will return obvious values. */
542002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
542102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
542202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
542302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
542402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote results obtained\n");
542502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
542602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
542702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
542802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"netperf: remote error %d",
542902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
543002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
543102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
543202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
543302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
543402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
543502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
543602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our "throughput" was for the test. */
543702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
543802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
543902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= nummessages/elapsed_time;
544002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
544102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
544202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu
544302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       utilization for the system(s) Of course, some of the
544402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       information might be bogus because there was no idle counter in
544502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the kernel(s). We need to make a note of this for the user's
544602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       benefit... */
544702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
544802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization = calc_cpu_util(0.0);
544902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 	/* since calc_service demand is doing ms/Kunit we will
545002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   multiply the number of transaction by 1024 to get "good"
545102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   numbers */
545202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand  = calc_service_demand((double) nummessages*1024,
545302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
545402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
545502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0);
545602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
545702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
545802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
545902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
546002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
546102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
546202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
546302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = tcp_rr_result->cpu_util;
546402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will
546502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   multiply the number of transaction by 1024 to get "good"
546602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   numbers */
546702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand = calc_service_demand((double) nummessages*1024,
546802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
546902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    remote_cpu_utilization,
547002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    tcp_rr_result->num_cpus);
547102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
547202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
547302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
547402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
547502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
547602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
547702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
547802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
547902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
548002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
548102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
548202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
548302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
548402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
548502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
548602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
548702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information.
548802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       if debugging is on, calculate_confidence will print-out the
548902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       parameters we pass it */
549002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
549102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
549202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
549302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
549402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
549502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
549602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
549702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
549802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
549902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
550002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
550102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
550202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are now done with the socket, so close it */
550302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
550402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
550502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
550602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
550702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
550802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
550902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
551002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
551102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
551202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
551302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
551402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user has
551502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     specified zero-level verbosity, we will just print the local
551602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     service demand, or the remote service demand. If the user has
551702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     requested verbosity level 1, he will get the basic "streamperf"
551802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     numbers. If the user has specified a verbosity of greater than 1,
551902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     we will display a veritable plethora of background information
552002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     from outside of this block as it it not cpu_measurement
552102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     specific...  */
552202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
552302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
552402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
552502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
552602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
552702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
552802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
552902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
553002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
553102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
553202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(tcp_rr_result->cpu_method);
553302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
553402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
553502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
553602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
553702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
553802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
553902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
554002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
554102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
554202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
554302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
554402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
554502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
554602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
554702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
554802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method,
554902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
555002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
555102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
555202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
555302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
555402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
555502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
555602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ('x' == libfmt) {
555702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
555802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  cpu_title,
555902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  local_cpu_method,
556002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  remote_cpu_method);
556102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
556202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else {
556302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
556402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  cpu_title_tput,
556502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  format_units(),
556602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  local_cpu_method,
556702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  remote_cpu_method);
556802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
556902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
557002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
557102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
557202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
557302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
557402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
557502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
557602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
557702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
557802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ('x' == libfmt) ? thruput :
557902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      calc_thruput_interval_omni(thruput * (req_size+rsp_size),
558002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					 1.0),
558102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
558202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
558302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
558402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand,	/* remote service demand */
558502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
558602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
558702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
558802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
558902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
559002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
559102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
559202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
559302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
559402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
559502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
559602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
559702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
559802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
559902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
560002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
560102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ('x' == libfmt) ? thruput :
560202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      calc_thruput_interval_omni(thruput * (req_size+rsp_size),
560302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					 1.0),
560402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
560502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
560602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
560702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
560802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
560902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
561002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
561102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		('x' == libfmt) ? tput_title : tput_title_band,
561202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units());
561302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
561402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
561502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
561602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
561702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
561802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
561902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
562002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
562102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
562202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* are we trans or do we need to convert to bytes then
562302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 bits? at this point, thruput is in our "confident"
562402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 transactions per second. we can convert to a
562502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 bidirectional bitrate by multiplying that by the sum
562602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 of the req_size and rsp_size.  we pass that to
562702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 calc_thruput_interval_omni with an elapsed time of
562802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 1.0 s to get it converted to [kmg]bits/s or
562902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 [KMG]Bytes/s */
563002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ('x' == libfmt) ?  thruput :
563102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      calc_thruput_interval_omni(thruput * (req_size+rsp_size),
563202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					 1.0),
563302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
563402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
563502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
563602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
563702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
563802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
563902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
564002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
564102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
564202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
564302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
564402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
564502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
564602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
564702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
564802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
564902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
565002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how to handle the verbose information in the presence of */
565102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence intervals is yet to be determined... raj 11/94 */
565202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
565302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
565402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
565502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
565602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
565702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
565802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* normally, you might think that if we were messing about with
565902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the value of libfmt we would need to put it back again, but
566002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       since this is basically the last thing we are going to do with
566102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       it, it does not matter.  so there :) raj 2007-06-08 */
566202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if the user was asking for transactions, then we report
566302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       megabits per sedcond for the unidirectional throughput,
566402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       otherwise we use the desired units. */
566502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ('x' == libfmt) {
566602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      libfmt = 'm';
566702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
566802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
566902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
567002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
567102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    format_units(),
567202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
567302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
567402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
567502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
567602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* if the user has enable burst mode, we have to remember
567702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       to account for that in the number of transactions
567802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       outstanding at any one time. otherwise we will
567902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       underreport the latency of individual
568002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       transactions. learned from saf by raj 2007-06-08  */
568102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (((double)1.0/thruput)*(double)1000000.0) *
568202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (double) (1+first_burst_size),
568302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    thruput,
568402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    calc_thruput_interval_omni(thruput * (double)req_size,1.0),
568502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    calc_thruput_interval_omni(thruput * (double)rsp_size,1.0));
568602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
568702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
568802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
568902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
569002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
569102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
569202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
569302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
569402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
569502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
569602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
569702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
569802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_udp_stream(char remote_host[])
569902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
570002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /**********************************************************************/
570102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*									*/
570202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*               	UDP Unidirectional Send Test                    */
570302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*									*/
570402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /**********************************************************************/
570502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
570602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define UDP_LENGTH_MAX 0XFFFF - 28
570702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
570802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
570902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket  Message  Elapsed      Messages                \n\
571002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize    Size     Time         Okay Errors   Throughput\n\
571102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes   bytes    secs            #      #   %s/sec\n\n";
571202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
571302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
571402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
571502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
571602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 = "\
571702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d  %6d   %-7.2f   %7d %6d    %7.2f\n\
571802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d           %-7.2f   %7d           %7.2f\n\n";
571902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
572002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
572102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
572202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket  Message  Elapsed      Messages                   CPU      Service\n\
572302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize    Size     Time         Okay Errors   Throughput   Util     Demand\n\
572402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes   bytes    secs            #      #   %s/sec %% %c%c     us/KB\n\n";
572502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
572602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
572702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.2f %c\n";
572802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
572902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 = "\
573002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d  %6d   %-7.2f   %7d %6d    %7.1f     %-6.2f   %-6.3f\n\
573102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d           %-7.2f   %7d           %7.1f     %-6.2f   %-6.3f\n\n";
573202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
573302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	messages_recvd;
573402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int 	messages_sent;
573502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	failed_sends;
573602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
573702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time,
573802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        local_cpu_utilization,
573902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        remote_cpu_utilization;
574002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
574102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	 local_service_demand, remote_service_demand;
574202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double local_thruput, remote_thruput;
574302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double bytes_sent;
574402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double bytes_recvd;
574502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
574602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
574702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
574802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
574902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET 	data_socket;
575002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
575102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int sum_messages_sent;
575202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int sum_messages_recvd;
575302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int sum_failed_sends;
575402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double sum_local_thruput;
575502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
575602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
575702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
575802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
575902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_stream_request_struct	*udp_stream_request;
576002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_stream_response_struct	*udp_stream_response;
576102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_stream_results_struct	*udp_stream_results;
576202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
576302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_request	=
576402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_stream_request_struct *)netperf_request.content.test_specific_data;
576502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response	=
576602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_stream_response_struct *)netperf_response.content.test_specific_data;
576702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_results	=
576802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_stream_results_struct *)netperf_response.content.test_specific_data;
576902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
577002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
577102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
577202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
577302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
577402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
577502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
577602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
577702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
577802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
577902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
578002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
578102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
578202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
578302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
578402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_DGRAM,
578502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_UDP,
578602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
578702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
578802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
578902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("UDP UNIDIRECTIONAL SEND TEST",local_res,remote_res);
579002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
579102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
579202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring            = NULL;
579302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
579402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
579502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_messages_sent    = 0;
579602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_messages_recvd   = 0;
579702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_failed_sends     = 0;
579802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_local_thruput    = 0.0;
579902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
580002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
580102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
580202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
580302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
580402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
580502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
580602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
580702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
580802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
580902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
581002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
581102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
581202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_sent  = 0;
581302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_recvd = 0;
581402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    failed_sends   = 0;
581502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 0;
581602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
581702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket			*/
581802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_socket = create_data_socket(local_res);
581902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
582002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (data_socket == INVALID_SOCKET){
582102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("udp_send: data socket");
582202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
582302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
582402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
582502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* now, we want to see if we need to set the send_size */
582602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_size == 0) {
582702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lss_size > 0) {
582802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = (lss_size < UDP_LENGTH_MAX ? lss_size : UDP_LENGTH_MAX);
582902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
583002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
583102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = 4096;
583202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
583302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
583402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
583502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
583602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer with the requested alignment and offset, */
583702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* most of the numbers here are just a hack to pick something nice */
583802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and big in an attempt to never try to send a buffer a second time */
583902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before it leaves the node...unless the user set the width */
584002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* explicitly. */
584102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 32;
584202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
584302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL ) {
584402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
584502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       send_size,
584602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
584702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
584802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
584902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
585002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
585102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if the user supplied a cpu rate, this call will complete rather */
585202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* quickly, otherwise, the cpu rate will be retured to us for */
585302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* possible display. The Library will keep it's own copy of this data */
585402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* for use elsewhere. We will only display it. (Does that make it */
585502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "opaque" to us?) */
585602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
585702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage)
585802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
585902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
586002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
586102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Tell the remote end to set up the data connection. The server
586202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         sends back the port number and alters the socket parameters
586302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         there.  Of course this is a datagram service so no connection
586402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         is actually set up, the server just sets up the socket and
586502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         binds it. */
586602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
586702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_request.content.request_type      = DO_UDP_STREAM;
586802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->recv_buf_size  = rsr_size_req;
586902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->message_size   = send_size;
587002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->recv_connected = remote_connected;
587102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->recv_alignment = remote_recv_align;
587202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->recv_offset    = remote_recv_offset;
587302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->measure_cpu    = remote_cpu_usage;
587402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->cpu_rate       = remote_cpu_rate;
587502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->test_length    = test_time;
587602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->so_rcvavoid    = rem_rcvavoid;
587702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->so_sndavoid    = rem_sndavoid;
587802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->port           = atoi(remote_data_port);
587902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
588002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
588102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_request();
588202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
588302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
588402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
588502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
588602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
588702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"send_udp_stream: remote data connection done.\n");
588802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
588902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
589002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
589102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("send_udp_stream: error on remote");
589202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
589302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
589402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
589502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Place the port number returned by the remote into the sockaddr */
589602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* structure so our sends can be sent to the correct place. Also get */
589702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* some of the returned socket buffer information for user display. */
589802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
589902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* make sure that port numbers are in the proper order */
590002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res,(short)udp_stream_response->data_port_number);
590102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
590202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size        = udp_stream_response->recv_buf_size;
590302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size        = udp_stream_response->send_buf_size;
590402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate = udp_stream_response->cpu_rate;
590502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
590602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
590702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
590802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_STREAM_SETUP(lss_size,rsr_size)
590902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
591002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
591102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We "connect" up to the remote post to allow is to use the send */
591202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* call instead of the sendto call. Presumeably, this is a little */
591302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* simpler, and a little more efficient. I think that it also means */
591402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that we can be informed of certain things, but am not sure */
591502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* yet...also, this is the way I would expect a client to behave */
591602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* when talking to a server */
591702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_connected) {
591802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       if (connect(data_socket,
591902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      		   remote_res->ai_addr,
592002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   remote_res->ai_addrlen) == INVALID_SOCKET){
592102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          perror("send_udp_stream: data socket connect failed");
592202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          exit(1);
592302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       } else if (debug) {
592402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          fprintf(where,"send_udp_stream: connected data socket.\n");
592502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          fflush(where);
592602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       }
592702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
592802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
592902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set up the timer to call us after test_time. one of these days, */
593002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it might be nice to figure-out a nice reliable way to have the */
593102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* test controlled by a byte count as well, but since UDP is not */
593202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* reliable, that could prove difficult. so, in the meantime, we */
593302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* only allow a UDP_STREAM test to be a timed test. */
593402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
593502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
593602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
593702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
593802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
593902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
594002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"Sorry, UDP_STREAM tests must be timed.\n");
594102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
594202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
594302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
594402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the start count for the idle counter and the start time */
594502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
594602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
594702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
594802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
594902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
595002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
595102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
595202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
595302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (demo_mode) {
595402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(demo_one_ptr);
595502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
595602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
595702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
595802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Send datagrams like there was no tomorrow. at somepoint it might */
595902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* be nice to set this up so that a quantity of bytes could be sent, */
596002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but we still need some sort of end of test trigger on the receive */
596102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* side. that could be a select with a one second timeout, but then */
596202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if there is a test where none of the data arrives for awile and */
596302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* then starts again, we would end the test too soon. something to */
596402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* think about... */
596502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while (!times_up) {
596602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
596702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
596802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to dirty some number of consecutive integers in the buffer */
596902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we are about to send. we may also want to bring some number of */
597002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* them cleanly into the cache. The clean ones will follow any dirty */
597102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* ones into the cache. */
597202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
597302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      access_buffer(send_ring->buffer_ptr,
597402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_size,
597502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_dirty_count,
597602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_clean_count);
597702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
597802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
597902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
598002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
598102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
598202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
598302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
598402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
598502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_connected) {
598602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         len = send(data_socket,
598702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  	    send_ring->buffer_ptr,
598802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_size,
598902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    0);
599002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      } else {
599102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         len = sendto(data_socket,
599202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_ring->buffer_ptr,
599302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_size,
599402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      0,
599502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      remote_res->ai_addr,
599602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      remote_res->ai_addrlen);
599702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
599802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
599902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (len != send_size) {
600002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((len >= 0) ||
600102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    SOCKET_EINTR(len))
600202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
600302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == ENOBUFS) {
600402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  failed_sends++;
600502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  continue;
600602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
600702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("udp_send: data send error");
600802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
600902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
601002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      messages_sent++;
601102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
601202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
601302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer... */
601402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
601502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
601602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
601702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
601802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
601902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
602002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* get the second timestamp */
602102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
602202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
602302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
602402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
602502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
602602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
602702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_STREAM_INTERVAL(send_size)
602802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
602902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
603002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
603102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
603202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
603302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
603402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
603502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
603602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This is a timed test, so the remote will be returning to us after */
603702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a time. We should not need to send any "strange" messages to tell */
603802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the remote that the test is completed, unless we decide to add a */
603902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* number of messages to the test. */
604002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
604102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the test is over, so get stats and stuff */
604202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,
604302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &elapsed_time);
604402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
604502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
604602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Get the statistics from the remote end	*/
604702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
604802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
604902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
605002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"send_udp_stream: remote results obtained\n");
605102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
605202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
605302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
605402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("send_udp_stream: error on remote");
605502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
605602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
605702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      messages_recvd = udp_stream_results->messages_recvd;
605802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_recvd    = (double) send_size * (double) messages_recvd;
605902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
606002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
606102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since there was no control connection, we've no idea what was
606202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 actually received. raj 2007-02-08 */
606302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      messages_recvd = -1;
606402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_recvd = -1.0;
606502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
606602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
606702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent    = (double) send_size * (double) messages_sent;
606802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_thruput = calc_thruput(bytes_sent);
606902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
607002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
607102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we asume that the remote ran for as long as we did */
607202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
607302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_thruput = calc_thruput(bytes_recvd);
607402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
607502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* print the results for this socket and message size */
607602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
607702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
607802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
607902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) We pass zeros for the local */
608002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* cpu utilization and elapsed time to tell the routine to use */
608102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the libraries own values for those. */
608202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
608302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
608402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* shouldn't this really be based on bytes_recvd, since that is */
608502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the effective throughput of the test? I think that it should, */
608602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* so will make the change raj 11/94 */
608702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_recvd,
608802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
608902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
609002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
609102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
609202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
609302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
609402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
609502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
609602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
609702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The local calculations could use variables being kept by */
609802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the local netlib routines. The remote calcuations need to */
609902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have a few things passed to them. */
610002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
610102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= udp_stream_results->cpu_util;
610202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_recvd,
610302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
610402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
610502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      udp_stream_results->num_cpus);
610602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
610702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
610802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= (float) -1.0;
610902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= (float) -1.0;
611002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
611102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
611202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
611302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
611402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
611502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization  = (float) -1.0;
611602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand   = (float) -1.0;
611702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
611802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
611902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
612002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
612102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
612202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
612302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
612402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
612502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
612602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
612702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_thruput,
612802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
612902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
613002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
613102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
613202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
613302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since the routine calculate_confidence is rather generic, and */
613402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we have a few other parms of interest, we will do a little work */
613502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here to caclulate their average. */
613602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sum_messages_sent  += messages_sent;
613702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sum_messages_recvd += messages_recvd;
613802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sum_failed_sends   += failed_sends;
613902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sum_local_thruput  += local_thruput;
614002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
614102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
614202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
614302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this datapoint is done, so we don't need the socket any longer */
614402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(data_socket);
614502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
614602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
614702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
614802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we should reach this point once the test is finished */
614902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
615002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
615102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_thruput,
615202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
615302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
615402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
615502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
615602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
615702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* some of the interesting values aren't covered by the generic */
615802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence routine */
615902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  messages_sent    = sum_messages_sent / (confidence_iteration -1);
616002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  messages_recvd   = sum_messages_recvd / (confidence_iteration -1);
616102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  failed_sends     = sum_failed_sends / (confidence_iteration -1);
616202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_thruput    = sum_local_thruput / (confidence_iteration -1);
616302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
616402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
616502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
616602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
616702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
616802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
616902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
617002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
617102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
617202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
617302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
617402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
617502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
617602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
617702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
617802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
617902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
618002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
618102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
618202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
618302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(udp_stream_results->cpu_method);
618402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
618502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
618602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
618702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
618802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
618902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
619002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
619102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
619202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
619302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
619402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
619502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
619602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
619702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
619802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
619902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
620002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
620102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
620202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
620302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
620402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
620502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
620602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
620702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
620802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
620902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
621002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
621102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
621202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
621302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
621402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
621502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_sent,
621602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      failed_sends,
621702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput, 		/* what was the xfer rate */
621802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
621902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
622002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,
622102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,
622202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_recvd,
622302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_thruput,
622402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
622502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
622602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
622702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
622802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
622902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
623002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
623102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
623202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
623302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
623402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
623502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput);
623602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
623702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
623802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
623902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
624002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
624102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
624202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
624302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
624402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size, 		/* local sendbuf size */
624502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
624602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
624702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_sent,
624802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      failed_sends,
624902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput,
625002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size, 		/* remote recvbuf size */
625102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,
625202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_recvd,
625302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_thruput);
625402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
625502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
625602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
625702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
625802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
625902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
626002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
626102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of time spent in send() call\n");
626202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
626302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
626402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
626502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
626602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
626702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
626802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
626902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
627002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive side (netserver) of the */
627102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* UDP_STREAM performance test. */
627202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
627302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
627402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_udp_stream()
627502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
627602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
627702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
627802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
627902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
628002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
628102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage myaddr_in;
628202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_data;
628302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
628402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage remote_addr;
628502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t remote_addrlen;
628602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
628702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len = 0;
628802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	bytes_received = 0;
628902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
629002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
629102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	message_size;
629202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	messages_recvd = 0;
629302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
629402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_stream_request_struct	*udp_stream_request;
629502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_stream_response_struct	*udp_stream_response;
629602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_stream_results_struct	*udp_stream_results;
629702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
629802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_request  =
629902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_stream_request_struct *)netperf_request.content.test_specific_data;
630002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response =
630102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_stream_response_struct *)netperf_response.content.test_specific_data;
630202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_results  =
630302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_stream_results_struct *)netperf_response.content.test_specific_data;
630402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
630502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
630602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_udp_stream: entered...\n");
630702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
630802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
630902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
631002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
631102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
631202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
631302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
631402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
631502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
631602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
631702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
631802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
631902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
632002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
632102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
632202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
632302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
632402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_stream: setting the response type...\n");
632502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
632602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
632702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
632802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = UDP_STREAM_RESPONSE;
632902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
633002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 2) {
633102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_stream: the response type is set...\n");
633202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
633302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
633402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
633502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
633602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
633702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
633802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
633902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_stream: requested alignment of %d\n",
634002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    udp_stream_request->recv_alignment);
634102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
634202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
634302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
634402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
634502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
634602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
634702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_stream_request->message_size,
634802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_stream_request->recv_alignment,
634902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_stream_request->recv_offset);
635002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
635102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
635202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_stream: receive alignment and offset set...\n");
635302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
635402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
635502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
635602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
635702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
635802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
635902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_stream: grabbing a socket...\n");
636002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
636102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
636202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
636302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
636402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
636502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
636602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
636702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = udp_stream_request->recv_buf_size;
636802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = udp_stream_request->so_rcvavoid;
636902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = udp_stream_request->so_sndavoid;
637002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_connected = udp_stream_request->recv_connected;
637102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
637202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
637302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
637402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(udp_stream_request->ipfamily),
637502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			udp_stream_request->port);
637602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
637702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
637802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
637902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
638002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(udp_stream_request->ipfamily),
638102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_DGRAM,
638202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_UDP,
638302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
638402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
638502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_data = create_data_socket(local_res);
638602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
638702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_data == INVALID_SOCKET) {
638802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
638902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
639002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
639102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
639202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
639302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response->test_length = udp_stream_request->test_length;
639402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
639502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
639602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
639702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_data,
639802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
639902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
640002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
640102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_data);
640202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
640302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
640402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
640502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
640602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
640702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
640802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
640902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
641002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
641102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response->data_port_number =
641202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
641302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
641402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
641502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
641602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
641702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
641802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
641902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
642002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
642102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response->cpu_rate    = (float)0.0; /* assume no cpu */
642202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response->measure_cpu = 0;
642302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (udp_stream_request->measure_cpu) {
642402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We will pass the rate into the calibration routine. If the */
642502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user did not specify one, it will be 0.0, and we will do a */
642602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "real" calibration. Otherwise, all it will really do is */
642702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* store it away... */
642802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    udp_stream_response->measure_cpu = 1;
642902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    udp_stream_response->cpu_rate =
643002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(udp_stream_request->cpu_rate);
643102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
643202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
643302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_size	= udp_stream_request->message_size;
643402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  test_time	= udp_stream_request->test_length;
643502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
643602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
643702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
643802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response->send_buf_size = lss_size;
643902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response->recv_buf_size = lsr_size;
644002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response->so_rcvavoid = loc_rcvavoid;
644102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_response->so_sndavoid = loc_sndavoid;
644202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
644302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
644402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
644502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
644602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
644702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
644802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(udp_stream_request->measure_cpu);
644902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
645002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
645102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is used so the timer thread can close the socket out from */
645202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* under us, which to date is the easiest/cleanest/least */
645302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Windows-specific way I can find to force the winsock calls to */
645402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return WSAEINTR with the test is over. anything that will run on */
645502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 95 and NT and is closer to what netperf expects from Unix signals */
645602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and such would be appreciated raj 1/96 */
645702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket = s_data;
645802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
645902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
646002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the timer pops, or if we happen to recv a */
646102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* message of less than send_size bytes... */
646202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
646302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up = 0;
646402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
646502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  start_timer(test_time + PAD_TIME);
646602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
646702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
646802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_stream: about to enter inner sanctum.\n");
646902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
647002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
647102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
647202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We "connect" up to the remote post to allow us to use the recv */
647302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* call instead of the recvfrom call. Presumeably, this is a little */
647402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* simpler, and a little more efficient. */
647502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
647602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_connected) {
647702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
647802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Receive the first message using recvfrom to find the remote address */
647902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_addrlen = sizeof(remote_addr);
648002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    len = recvfrom(s_data, recv_ring->buffer_ptr,
648102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                   message_size, 0,
648202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                   (struct sockaddr*)&remote_addr, &remote_addrlen);
648302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (len != message_size) {
648402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len == SOCKET_ERROR) && !SOCKET_EINTR(len)) {
648502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            netperf_response.content.serv_errno = errno;
648602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            send_response();
648702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exit(1);
648802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
648902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
649002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_recvd++;
649102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
649202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
649302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
649402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now connect with the remote socket address */
649502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(s_data,
649602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                (struct sockaddr*)&remote_addr,
649702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                remote_addrlen )== INVALID_SOCKET) {
649802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        netperf_response.content.serv_errno = errno;
649902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        close(s_data);
650002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        send_response();
650102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit(1);
650202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
650302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
650402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
650502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"recv_udp_stream: connected data socket\n");
650602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
650702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     }
650802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
650902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
651002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (!times_up) {
651102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(local_connected) {
651202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       len = recv(s_data,
651302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                  recv_ring->buffer_ptr,
651402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                  message_size,
651502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                  0);
651602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } else {
651702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       len = recvfrom(s_data,
651802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                      recv_ring->buffer_ptr,
651902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    	              message_size,
652002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      0,0,0);
652102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
652202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
652302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (len != message_size) {
652402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len == SOCKET_ERROR) && !SOCKET_EINTR(len)) {
652502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            netperf_response.content.serv_errno = errno;
652602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    send_response();
652702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
652802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
652902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
653002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
653102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_recvd++;
653202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
653302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
653402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
653502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
653602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_stream: got %d messages.\n",messages_recvd);
653702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
653802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
653902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
654002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
654102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due timer or < send_size bytes received. in */
654202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reality, we only really support a timed UDP_STREAM test. raj */
654302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 12/95 */
654402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
654502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(udp_stream_request->measure_cpu,&elapsed_time);
654602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
654702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (times_up) {
654802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended on a timer, subtract the PAD_TIME */
654902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= (float)PAD_TIME;
655002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
655102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
655202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    stop_timer();
655302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
655402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
655502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
655602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_stream: test ended in %f seconds.\n",elapsed_time);
655702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
655802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
655902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
656002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
656102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We will count the "off" message that got us out of the loop */
656202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_received = (messages_recvd * message_size) + len;
656302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
656402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
656502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
656602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
656702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
656802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_udp_stream: got %d bytes\n",
656902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
657002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
657102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
657202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
657302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type	= UDP_STREAM_RESULTS;
657402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_results->bytes_received	= htonl(bytes_received);
657502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_results->messages_recvd	= messages_recvd;
657602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_results->elapsed_time	= elapsed_time;
657702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_results->cpu_method        = cpu_method;
657802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_stream_results->num_cpus          = lib_num_loc_cpus;
657902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (udp_stream_request->measure_cpu) {
658002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    udp_stream_results->cpu_util	= calc_cpu_util(elapsed_time);
658102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
658202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
658302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    udp_stream_results->cpu_util	= (float) -1.0;
658402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
658502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
658602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
658702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
658802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_udp_stream: test complete, sending results.\n");
658902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
659002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
659102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
659202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
659302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
659402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
659502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
659602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
659702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
659802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
659902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_udp_rr(char remote_host[])
660002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
660102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
660202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
660302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
660402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
660502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
660602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
660702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
660802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
660902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
661002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
661102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
661202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
661302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
661402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
661502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
661602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
661702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
661802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
661902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
662002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
662102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
662202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
662302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
662402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
662502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
662602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f   %-6.2f %-6.2f %-6.3f  %-6.3f\n";
662702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
662802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
662902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
663002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
663102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
663202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
663302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
663402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
663502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
663602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
663702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
663802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	send_socket;
663902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
664002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_xferd;
664102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
664202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
664302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
664402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
664502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
664602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
664702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
664802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
664902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
665002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
665102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
665202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
665302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_rr_request_struct	*udp_rr_request;
665402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_rr_response_struct	*udp_rr_response;
665502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_rr_results_struct	*udp_rr_result;
665602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
665702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_request  =
665802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_rr_request_struct *)netperf_request.content.test_specific_data;
665902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response =
666002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_rr_response_struct *)netperf_response.content.test_specific_data;
666102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_result	 =
666202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_rr_results_struct *)netperf_response.content.test_specific_data;
666302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
666402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
666502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
666602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
666702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
666802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
666902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
667002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
667102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
667202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
667302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
667402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
667502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
667602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
667702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
667802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_DGRAM,
667902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_UDP,
668002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
668102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
668202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
668302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("UDP REQUEST/RESPONSE TEST",local_res,remote_res);
668402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
668502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
668602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
668702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
668802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring     = NULL;
668902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring     = NULL;
669002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	= 0;
669102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	= 0;
669202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 0;
669302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
669402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
669502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
669602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
669702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
669802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
669902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
670002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
670102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
670202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
670302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
670402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
670502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
670602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages     = 0;
670702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd     = 0;
670802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up        = 0;
670902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
671002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
671102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffers with the requested alignment and offset */
671202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
671302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 1;
671402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) recv_width = 1;
671502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
671602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
671702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
671802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       req_size,
671902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
672002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
672102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
672202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
672302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
672402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
672502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       rsp_size,
672602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
672702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
672802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
672902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
673002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
673102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
673202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
673302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
673402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_udp_rr: udp rr data socket");
673502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
673602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
673702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
673802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
673902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_udp_rr: send_socket obtained...\n");
674002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
674102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
674202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
674302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
674402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
674502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
674602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
674702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. If */
674802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there is no idle counter in the kernel idle loop, the */
674902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local_cpu_rate will be set to -1. */
675002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
675102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
675202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
675302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
675402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
675502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
675602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Tell the remote end to do a listen. The server alters the
675702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket paramters on the other side at this point, hence the
675802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 reason for all the values being passed in the setup
675902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 message. If the user did not specify any of the parameters,
676002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 they will be passed as 0, which will indicate to the remote
676102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that no changes beyond the system's default should be
676202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 used. Alignment is the exception, it will default to 8, which
676302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will be no alignment alterations. */
676402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
676502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_request.content.request_type	= DO_UDP_RR;
676602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->recv_buf_size	= rsr_size_req;
676702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->send_buf_size	= rss_size_req;
676802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->recv_alignment      = remote_recv_align;
676902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->recv_offset	        = remote_recv_offset;
677002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->send_alignment      = remote_send_align;
677102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->send_offset	        = remote_send_offset;
677202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->request_size	= req_size;
677302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->response_size	= rsp_size;
677402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->measure_cpu	        = remote_cpu_usage;
677502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->cpu_rate	        = remote_cpu_rate;
677602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->so_rcvavoid	        = rem_rcvavoid;
677702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->so_sndavoid	        = rem_sndavoid;
677802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (test_time) {
677902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	udp_rr_request->test_length	= test_time;
678002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
678102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
678202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	udp_rr_request->test_length	= test_trans * -1;
678302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
678402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->port                = atoi(remote_data_port);
678502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      udp_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
678602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
678702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 1) {
678802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"netperf: send_udp_rr: requesting UDP r/r test\n");
678902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
679002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
679102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_request();
679202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
679302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The response from the remote will contain all of the relevant
679402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket parameters for this test type. We will put them back
679502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 into the variables here so they can be displayed if desired.
679602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 The remote will have calibrated CPU if necessary, and will
679702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 have done all the needed set-up we will have calibrated the
679802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 cpu locally before sending the request, and will grab the
679902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 counter value right after the connect returns. The remote
680002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will grab the counter right after the accept call. This saves
680102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 the hassle of extra messages being sent for the UDP
680202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 tests.  */
680302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
680402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
680502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
680602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
680702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
680802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote listen done.\n");
680902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size	       =	udp_rr_response->recv_buf_size;
681002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size	       =	udp_rr_response->send_buf_size;
681102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_usage =	udp_rr_response->measure_cpu;
681202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_rate  = 	udp_rr_response->cpu_rate;
681302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* port numbers in proper order */
681402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	set_port_number(remote_res,(short)udp_rr_response->data_port_number);
681502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
681602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
681702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
681802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
681902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
682002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
682102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
682202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
682302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
682402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
682502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
682602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
682702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
682802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_RR_SETUP(100)
682902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
683002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
683102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Connect up to the remote port on the data socket. This will set */
683202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the default destination address on this socket. With UDP, this */
683302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* does make a performance difference as we may not have to do as */
683402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* many routing lookups, however, I expect that a client would */
683502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* behave this way. raj 1/94 */
683602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
683702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ( connect(send_socket,
683802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 remote_res->ai_addr,
683902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 remote_res->ai_addrlen) == INVALID_SOCKET ) {
684002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: data socket connect failed");
684102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
684202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
684302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
684402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either the */
684502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect would have failed, or the previous response would have */
684602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indicated a problem. I failed to see the value of the extra */
684702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* message after the accept on the remote. If it failed, we'll see it */
684802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here. If it didn't, we might as well start pumping data. */
684902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
685002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a request/response test, they */
685102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can be either time or transaction based. */
685202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
685302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
685402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
685502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
685602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = 0;
685702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
685802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
685902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
686002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
686102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = test_bytes;
686202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
686302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
686402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
686502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
686602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
686702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
686802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
686902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
687002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
687102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
687202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (demo_mode) {
687302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(demo_one_ptr);
687402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
687502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
687602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
687702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
687802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
687902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
688002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
688102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
688202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return */
688302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* false. When the test is controlled by byte count, the time test */
688402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will always return false. When the test is finished, the whole */
688502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. I think */
688602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I just arbitrarily decrement trans_remaining for the timed */
688702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* test, but will not do that just yet... One other question is */
688802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* whether or not the send buffer and the receive buffer should be */
688902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the same buffer. */
689002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
689102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
689202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
689302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int i;
689402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (i = 0; i < first_burst_size; i++) {
689502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if((len=send(send_socket,
689602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     send_ring->buffer_ptr,
689702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     req_size,
689802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0)) != req_size) {
689902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we should never hit the end of the test in the first burst */
690002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_udp_rr: initial burst data send error");
690102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(-1);
690202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
690302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
690402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
690502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
690602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
690702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (trans_remaining > 0)) {
690802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send the request */
690902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
691002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
691102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
691202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
691302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
691402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((len=send(send_socket,
691502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   send_ring->buffer_ptr,
691602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   req_size,
691702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   0)) != req_size) {
691802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (SOCKET_EINTR(len)) {
691902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* We likely hit */
692002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* test-end time. */
692102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
692202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
692302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    perror("send_udp_rr: data send error");
692402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
692502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
692602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
692702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
692802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* receive the response. with UDP we will get it all, or nothing */
692902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
693002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((rsp_bytes_recvd=recv(send_socket,
693102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       recv_ring->buffer_ptr,
693202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       rsp_size,
693302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       0)) != rsp_size) {
693402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if (SOCKET_EINTR(rsp_bytes_recvd))
693502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		{
693602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    	  /* Again, we have likely hit test-end time */
693702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
693802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
693902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    perror("send_udp_rr: data recv error");
694002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
694102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
694202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
694302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
694402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
694502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
694602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
694702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
694802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
694902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
695002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
695102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
695202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* at this point, we may wish to sleep for some period of */
695302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* time, so we see how long that last transaction just took, */
695402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* and sleep for the difference of that and the interval. We */
695502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* will not sleep if the time would be less than a */
695602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* millisecond.  */
695702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
695802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
695902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_RR_INTERVAL(1);
696002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
696102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
696202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
696302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
696402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
696502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
696602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
696702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
696802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
696902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
697002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
697102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
697202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((nummessages % 100) == 0) {
697302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"Transaction %d completed\n",nummessages);
697402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
697502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
697602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
697702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
697802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
697902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
698002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* for some strange reason, I used to call shutdown on the UDP */
698102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data socket here. I'm not sure why, because it would not have */
698202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* any effect... raj 11/94 */
698302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
698402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
698502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
698602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
698702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
698802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured? how long */
698902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* did we really run? */
699002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
699102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
699202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Get the statistics from the remote end. The remote will have
699302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 calculated service demand and all those interesting
699402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 things. If it wasn't supposed to care, it will return obvious
699502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 values. */
699602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
699702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
699802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
699902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
700002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote results obtained\n");
700102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
700202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
700302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
700402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
700502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
700602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
700702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
700802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
700902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
701002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
701102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
701202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
701302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our thruput was for the test. In the */
701402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* future, we may want to include a calculation of the thruput */
701502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* measured by the remote, but it should be the case that for a */
701602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* UDP rr test, that the two numbers should be *very* close... */
701702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We calculate bytes_sent regardless of the way the test length */
701802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* was controlled.  */
701902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
702002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
702102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= nummessages / elapsed_time;
702202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
702302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
702402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
702502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
702602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) Of course, some of the */
702702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* information might be bogus because there was no idle counter */
702802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in the kernel(s). We need to make a note of this for the */
702902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* user's benefit by placing a code for the metod used in the */
703002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* test banner */
703102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
703202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
703302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization = calc_cpu_util(0.0);
703402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
703502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
703602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
703702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
703802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
703902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand  = calc_service_demand((double) nummessages*1024,
704002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
704102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
704202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0);
704302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
704402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
704502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
704602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
704702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
704802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
704902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
705002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = udp_rr_result->cpu_util;
705102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
705202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
705302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
705402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
705502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
705602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = calc_service_demand((double) nummessages*1024,
705702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						     0.0,
705802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						     remote_cpu_utilization,
705902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						     udp_rr_result->num_cpus);
706002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
706102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
706202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
706302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
706402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
706502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
706602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
706702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
706802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
706902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
707002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
707102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
707202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
707302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
707402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
707502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
707602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
707702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
707802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
707902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
708002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
708102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
708202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
708302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
708402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
708502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
708602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
708702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
708802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
708902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
709002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are done with the socket */
709102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
709202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
709302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
709402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have made all the iterations we are going to */
709502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* make. */
709602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
709702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
709802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
709902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
710002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
710102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
710202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
710302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
710402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
710502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
710602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
710702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
710802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
710902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
711002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
711102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
711202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
711302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
711402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
711502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
711602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
711702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
711802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
711902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
712002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
712102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(udp_rr_result->cpu_method);
712202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
712302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
712402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
712502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
712602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
712702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
712802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
712902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
713002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
713102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
713202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
713302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
713402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
713502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
713602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
713702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
713802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
713902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
714002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
714102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
714202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
714302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
714402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
714502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
714602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
714702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
714802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
714902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
715002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
715102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
715202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
715302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
715402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time,
715502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
715602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
715702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
715802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
715902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
716002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
716102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
716202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
716302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
716402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
716502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
716602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
716702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
716802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
716902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
717002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
717102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
717202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
717302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
717402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
717502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
717602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
717702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
717802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
717902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
718002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
718102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
718202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
718302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
718402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
718502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
718602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
718702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
718802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
718902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
719002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
719102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
719202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
719302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
719402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
719502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
719602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
719702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
719802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
719902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
720002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
720102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
720202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
720302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
720402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how to handle the verbose information in the presence of */
720502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence intervals is yet to be determined... raj 11/94 */
720602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
720702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
720802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
720902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
721002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* UDP statistics, the alignments of the sends and receives */
721102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
721202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
721302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
721402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/reponse times.\n");
721502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
721602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
721702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
721802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
721902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
722002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
722102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive side (netserver) of a UDP_RR */
722202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test. */
722302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
722402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_udp_rr()
722502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
722602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
722702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
722802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
722902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
723002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
723102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
723202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
723302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
723402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage        myaddr_in;
723502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage    peeraddr;
723602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_data;
723702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
723802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
723902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
724002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   request_bytes_recvd;
724102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   response_bytes_sent;
724202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
724302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
724402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_rr_request_struct	*udp_rr_request;
724502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_rr_response_struct	*udp_rr_response;
724602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	udp_rr_results_struct	*udp_rr_results;
724702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
724802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_request  =
724902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_rr_request_struct *)netperf_request.content.test_specific_data;
725002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response =
725102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_rr_response_struct *)netperf_response.content.test_specific_data;
725202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_results  =
725302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct udp_rr_results_struct *)netperf_response.content.test_specific_data;
725402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
725502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
725602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_udp_rr: entered...\n");
725702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
725802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
725902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
726002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
726102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
726202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
726302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
726402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
726502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
726602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
726702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
726802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
726902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
727002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
727102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
727202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
727302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
727402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_rr: setting the response type...\n");
727502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
727602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
727702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
727802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = UDP_RR_RESPONSE;
727902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
728002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
728102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_rr: the response type is set...\n");
728202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
728302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
728402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
728502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variables to be at the desired */
728602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignments with the desired offsets. */
728702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
728802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
728902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_rr: requested recv alignment of %d offset %d\n",
729002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    udp_rr_request->recv_alignment,
729102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    udp_rr_request->recv_offset);
729202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_rr: requested send alignment of %d offset %d\n",
729302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    udp_rr_request->send_alignment,
729402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    udp_rr_request->send_offset);
729502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
729602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
729702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
729802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
729902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
730002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
730102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
730202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_rr_request->request_size,
730302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_rr_request->recv_alignment,
730402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_rr_request->recv_offset);
730502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
730602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
730702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_rr_request->response_size,
730802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_rr_request->send_alignment,
730902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   udp_rr_request->send_offset);
731002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
731102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
731202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_rr: receive alignment and offset set...\n");
731302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
731402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
731502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
731602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
731702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
731802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
731902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_udp_rr: grabbing a socket...\n");
732002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
732102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
732202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
732302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
732402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
732502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
732602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
732702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
732802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = udp_rr_request->send_buf_size;
732902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = udp_rr_request->recv_buf_size;
733002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = udp_rr_request->so_rcvavoid;
733102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = udp_rr_request->so_sndavoid;
733202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
733302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
733402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
733502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(udp_rr_request->ipfamily),
733602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			udp_rr_request->port);
733702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
733802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
733902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
734002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
734102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(udp_rr_request->ipfamily),
734202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_DGRAM,
734302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_UDP,
734402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
734502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
734602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_data = create_data_socket(local_res);
734702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
734802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_data == INVALID_SOCKET) {
734902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
735002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
735102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
735202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
735302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
735402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
735502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
735602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
735702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_data,
735802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
735902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
736002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
736102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_data);
736202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
736302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
736402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
736502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
736602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
736702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
736802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
736902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
737002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
737102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response->data_port_number =
737202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
737302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
737402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
737502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
737602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
737702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv port number %d\n",
737802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ((struct sockaddr_in *)&myaddr_in)->sin_port);
737902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
738002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
738102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
738202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
738302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
738402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
738502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
738602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
738702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
738802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response->cpu_rate    = (float)0.0; 	/* assume no cpu */
738902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response->measure_cpu = 0;
739002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (udp_rr_request->measure_cpu) {
739102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    udp_rr_response->measure_cpu = 1;
739202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    udp_rr_response->cpu_rate = calibrate_local_cpu(udp_rr_request->cpu_rate);
739302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
739402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
739502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
739602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
739702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response->send_buf_size = lss_size;
739802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response->recv_buf_size = lsr_size;
739902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response->so_rcvavoid   = loc_rcvavoid;
740002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_response->so_sndavoid   = loc_sndavoid;
740102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
740202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
740302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
740402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
740502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
740602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
740702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
740802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(udp_rr_request->measure_cpu);
740902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
741002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
741102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is used so the timer thread can close the socket out from */
741202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* under us, which to date is the easiest/cleanest/least */
741302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Windows-specific way I can find to force the winsock calls to */
741402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return WSAEINTR with the test is over. anything that will run on */
741502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 95 and NT and is closer to what netperf expects from Unix signals */
741602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and such would be appreciated raj 1/96 */
741702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket = s_data;
741802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
741902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
742002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (udp_rr_request->test_length > 0) {
742102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
742202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
742302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(udp_rr_request->test_length + PAD_TIME);
742402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
742502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
742602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
742702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = udp_rr_request->test_length * -1;
742802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
742902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
743002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr);
743102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&peeraddr, addrlen);
743202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
743302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
743402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
743502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
743602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
743702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the request from the other side */
743802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((request_bytes_recvd = recvfrom(s_data,
743902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 recv_ring->buffer_ptr,
744002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 udp_rr_request->request_size,
744102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 0,
744202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (struct sockaddr *)&peeraddr,
744302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 &addrlen)) != udp_rr_request->request_size) {
744402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if ( SOCKET_EINTR(request_bytes_recvd) )
744502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
744602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* we must have hit the end of test time. */
744702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
744802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
744902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
745002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
745102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
745202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
745302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
745402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
745502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
745602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((response_bytes_sent = sendto(s_data,
745702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      send_ring->buffer_ptr,
745802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      udp_rr_request->response_size,
745902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      0,
746002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      (struct sockaddr *)&peeraddr,
746102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      addrlen)) !=
746202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	udp_rr_request->response_size) {
746302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ( SOCKET_EINTR(response_bytes_sent) )
746402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
746502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* we have hit end of test time. */
746602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
746702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
746802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
746902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
747002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
747102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
747202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
747302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
747402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
747502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
747602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
747702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
747802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
747902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
748002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
748102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_udp_rr: Transaction %d complete.\n",
748202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
748302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
748402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
748502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
748602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
748702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
748802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
748902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
749002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
749102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
749202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(udp_rr_request->measure_cpu,&elapsed_time);
749302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
749402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (times_up) {
749502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
749602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
749702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
749802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
749902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
750002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
750102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
750202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
750302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
750402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_udp_rr: got %d transactions\n",
750502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
750602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
750702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
750802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
750902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_results->bytes_received = (trans_received *
751002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    (udp_rr_request->request_size +
751102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     udp_rr_request->response_size));
751202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_results->trans_received = trans_received;
751302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_results->elapsed_time	 = elapsed_time;
751402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_results->cpu_method     = cpu_method;
751502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  udp_rr_results->num_cpus       = lib_num_loc_cpus;
751602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (udp_rr_request->measure_cpu) {
751702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    udp_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
751802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
751902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
752002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
752102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
752202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_udp_rr: test complete, sending results.\n");
752302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
752402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
752502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
752602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
752702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
752802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are done with the socket now */
752902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
753002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
753102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
753202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
753302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
753402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive (netserver) side of a TCP_RR */
753502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test */
753602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
753702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_tcp_rr()
753802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
753902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
754002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
754102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
754202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
754302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
754402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
754502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
754602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
754702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_storage        myaddr_in,
754802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  peeraddr_in;
754902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,s_data;
755002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
755102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
755202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
755302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
755402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
755502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_recvd;
755602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
755702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
755802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   sock_closed = 0;
755902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
756002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
756102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_request_struct	*tcp_rr_request;
756202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_response_struct	*tcp_rr_response;
756302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_results_struct	*tcp_rr_results;
756402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
756502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_request =
756602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_request_struct *)netperf_request.content.test_specific_data;
756702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response =
756802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_response_struct *)netperf_response.content.test_specific_data;
756902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results =
757002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_results_struct *)netperf_response.content.test_specific_data;
757102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
757202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
757302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_tcp_rr: entered...\n");
757402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
757502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
757602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
757702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
757802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
757902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
758002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
758102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
758202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
758302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
758402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
758502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
758602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
758702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
758802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
758902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
759002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
759102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_rr: setting the response type...\n");
759202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
759302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
759402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
759502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = TCP_RR_RESPONSE;
759602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
759702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
759802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_rr: the response type is set...\n");
759902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
760002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
760102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
760202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* allocate the recv and send rings with the requested alignments */
760302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and offsets. raj 7/94 */
760402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
760502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_rr: requested recv alignment of %d offset %d\n",
760602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_rr_request->recv_alignment,
760702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_rr_request->recv_offset);
760802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_rr: requested send alignment of %d offset %d\n",
760902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_rr_request->send_alignment,
761002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_rr_request->send_offset);
761102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
761202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
761302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
761402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at some point, these need to come to us from the remote system */
761502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
761602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
761702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
761802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
761902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->response_size,
762002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->send_alignment,
762102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->send_offset);
762202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
762302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
762402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->request_size,
762502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->recv_alignment,
762602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->recv_offset);
762702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
762802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
762902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
763002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
763102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
763202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_rr: grabbing a socket...\n");
763302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
763402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
763502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
763602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
763702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
763802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
763902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
764002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = tcp_rr_request->send_buf_size;
764102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = tcp_rr_request->recv_buf_size;
764202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = tcp_rr_request->no_delay;
764302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = tcp_rr_request->so_rcvavoid;
764402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = tcp_rr_request->so_sndavoid;
764502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
764602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
764702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
764802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(tcp_rr_request->ipfamily),
764902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_rr_request->port);
765002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
765102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
765202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
765302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
765402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(tcp_rr_request->ipfamily),
765502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
765602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
765702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
765802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
765902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
766002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
766102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
766202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
766302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
766402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
766502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
766602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
766702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
766802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
766902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
767002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test timer can fire during operations on the listening socket,
767102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     so to make the start_timer below work we have to move
767202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     it to close s_listen while we are blocked on accept. */
767302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket2 = s_listen;
767402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
767502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
767602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
767702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
767802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
767902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
768002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
768102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
768202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
768302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
768402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
768502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
768602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
768702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
768802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
768902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
769002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
769102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR) {
769202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
769302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
769402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
769502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
769602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
769702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
769802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
769902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
770002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
770102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
770202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
770302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->data_port_number =
770402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
770502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
770602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
770702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
770802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
770902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
771002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
771102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
771202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
771302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->cpu_rate = (float)0.0; 	/* assume no cpu */
771402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->measure_cpu = 0;
771502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
771602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_rr_request->measure_cpu) {
771702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_response->measure_cpu = 1;
771802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_response->cpu_rate = calibrate_local_cpu(tcp_rr_request->cpu_rate);
771902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
772002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
772102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
772202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
772302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
772402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->send_buf_size = lss_size;
772502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->recv_buf_size = lsr_size;
772602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->no_delay = loc_nodelay;
772702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->so_rcvavoid = loc_rcvavoid;
772802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->so_sndavoid = loc_sndavoid;
772902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->test_length = tcp_rr_request->test_length;
773002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
773102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
773202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
773302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
773402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data = accept(s_listen,
773502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       (struct sockaddr *)&peeraddr_in,
773602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       &addrlen)) == INVALID_SOCKET) {
773702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
773802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
773902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
774002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
774102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
774202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
774302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
774402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass */
774502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* attributes across an accept() call. Including this goes against */
774602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* my better judgement :( raj 11/95 */
774702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
774802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
774902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
775002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
775102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
775202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
775302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is used so the timer thread can close the socket out from */
775402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* under us, which to date is the easiest/cleanest/least */
775502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Windows-specific way I can find to force the winsock calls to */
775602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return WSAEINTR with the test is over. anything that will run on */
775702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 95 and NT and is closer to what netperf expects from Unix signals */
775802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and such would be appreciated raj 1/96 */
775902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket = s_data;
776002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
776102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
776202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
776302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_rr: accept completes on the data connection.\n");
776402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
776502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
776602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
776702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
776802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
776902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
777002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(tcp_rr_request->measure_cpu);
777102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
777202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when we hit the end of the test time, or when */
777302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have exchanged the requested number of transactions. */
777402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
777502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_rr_request->test_length > 0) {
777602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
777702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
777802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(tcp_rr_request->test_length + PAD_TIME);
777902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
778002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
778102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
778202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = tcp_rr_request->test_length * -1;
778302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
778402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
778502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
778602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
778702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
778802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr = recv_ring->buffer_ptr;
778902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining	= tcp_rr_request->request_size;
779002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(request_bytes_remaining > 0) {
779102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((request_bytes_recvd=recv(s_data,
779202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   temp_message_ptr,
779302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   request_bytes_remaining,
779402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   0)) == SOCKET_ERROR) {
779502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (SOCKET_EINTR(request_bytes_recvd))
779602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
779702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
779802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
779902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
780002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
780102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = errno;
780202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
780302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
780402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
780502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else if( request_bytes_recvd == 0 ) {
780602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
780702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"zero is my hero\n");
780802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
780902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
781002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sock_closed = 1;
781102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
781202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
781302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
781402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_bytes_remaining -= request_bytes_recvd;
781502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += request_bytes_recvd;
781602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
781702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
781802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
781902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
782002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
782102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((timed_out) || (sock_closed)) {
782202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - or the socket
782302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 closed on us along the way.  bail out of here now... */
782402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
782502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo5\n");
782602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
782702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
782802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
782902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
783002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
783102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
783202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((bytes_sent=send(s_data,
783302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->buffer_ptr,
783402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_rr_request->response_size,
783502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			0)) == SOCKET_ERROR) {
783602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(bytes_sent)) {
783702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
783802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
783902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo6\n");
784002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
784102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
784202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
784302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 992;
784402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
784502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
784602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
784702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
784802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
784902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
785002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
785102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
785202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
785302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
785402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
785502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
785602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
785702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
785802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
785902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
786002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(tcp_rr_request->measure_cpu,&elapsed_time);
786102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
786202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  stop_timer();
786302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
786402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
786502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
786602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
786702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
786802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
786902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
787002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
787102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
787202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
787302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
787402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
787502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_rr: got %d transactions\n",
787602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
787702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
787802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
787902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
788002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->bytes_received = (trans_received *
788102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    (tcp_rr_request->request_size +
788202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     tcp_rr_request->response_size));
788302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->trans_received = trans_received;
788402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->elapsed_time   = elapsed_time;
788502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->cpu_method     = cpu_method;
788602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->num_cpus       = lib_num_loc_cpus;
788702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_rr_request->measure_cpu) {
788802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
788902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
789002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
789102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
789202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
789302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_rr: test complete, sending results.\n");
789402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
789502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
789602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
789702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
789802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
789902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_listen);
790002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
790102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
790202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
790302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
790402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
790502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
790602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
790702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectloc_cpu_rate()
790802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
790902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(USE_LOOPER)
791002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float dummy;
791102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
791202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
791302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* a rather simple little test - it merely calibrates the local cpu */
791402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and prints the results. There are no headers to allow someone to */
791502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* find a rate and use it in other tests automagically by setting a */
791602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variable equal to the output of this test. We ignore any rates */
791702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that may have been specified. In fact, we ignore all of the */
791802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* command line args! */
791902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
792002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
792102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "%g",
792202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  calibrate_local_cpu(0.0));
792302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
792402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1)
792502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
792602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "\nThere %s %d local %s\n",
792702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (lib_num_loc_cpus > 1) ? "are" : "is",
792802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    lib_num_loc_cpus,
792902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (lib_num_loc_cpus > 1) ? "cpus" : "cpu");
793002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
793102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we need the cpu_start, cpu_stop in the looper case to kill the */
793202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* child proceses raj 4/95 */
793302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
793402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef USE_LOOPER
793502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(1);
793602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(1,&dummy);
793702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* USE_LOOPER */
793802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
793902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
794002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
794102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
794202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrem_cpu_rate()
794302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
794402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this test is much like the local variant, except that it works for */
794502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote system, so in this case, we do pay attention to the */
794602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* value of the '-H' command line argument. */
794702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
794802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
794902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "%g",
795002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  calibrate_remote_cpu());
795102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
795202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1)
795302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
795402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "\nThere %s %d remote %s\n",
795502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (lib_num_rem_cpus > 1) ? "are" : "is",
795602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    lib_num_rem_cpus,
795702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (lib_num_rem_cpus > 1) ? "cpus" : "cpu");
795802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
795902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
796002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
796102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
796202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this test is intended to test the performance of establishing a
796302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    connection, exchanging a request/response pair, and repeating. it
796402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    is expected that this would be a good starting-point for
796502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    comparision of T/TCP with classic TCP for transactional workloads.
796602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    it will also look (can look) much like the communication pattern
796702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    of http for www access. */
796802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
796902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
797002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_tcp_conn_rr(char remote_host[])
797102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
797202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
797302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
797402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
797502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
797602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
797702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
797802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
797902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
798002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
798102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
798202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
798302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
798402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
798502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
798602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
798702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
798802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
798902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
799002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
799102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %%      %%      us/Tr   us/Tr\n\n";
799202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
799302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
799402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f\n";
799502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
799602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
799702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f   %-6.2f %-6.2f %-6.3f  %-6.3f\n";
799802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
799902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
800002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
800102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
800202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
800302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
800402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
800502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
800602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
800702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
800802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
800902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
801002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
801102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
801202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
801302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
801402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
801502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
801602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
801702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	send_socket;
801802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
801902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
802002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
802102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
802202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
802302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
802402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
802502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
802602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
802702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
802802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
802902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
803002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
803102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
803202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int                           myport;
803302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int                           ret;
803402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
803502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_conn_rr_request_struct	*tcp_conn_rr_request;
803602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_conn_rr_response_struct	*tcp_conn_rr_response;
803702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_conn_rr_results_struct	*tcp_conn_rr_result;
803802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
803902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_request =
804002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_conn_rr_request_struct *)netperf_request.content.test_specific_data;
804102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response =
804202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_conn_rr_response_struct *)netperf_response.content.test_specific_data;
804302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_result =
804402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_conn_rr_results_struct *)netperf_response.content.test_specific_data;
804502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
804602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
804702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
804802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
804902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
805002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
805102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
805202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
805302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
805402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
805502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
805602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
805702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
805802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
805902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
806002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
806102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
806202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
806302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
806402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
806502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
806602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP Connect/Request/Response TEST",local_res,remote_res);
806702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
806802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
806902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
807002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
807102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	=	0;
807202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	=	0.0;
807302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 	0;
807402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
807502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffers with the requested alignment and offset */
807602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
807702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
807802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
807902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
808002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   req_size,
808102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_send_align,
808202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_send_offset);
808302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
808402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
808502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   rsp_size,
808602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_recv_align,
808702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_recv_offset);
808802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
808902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
809002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
809102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_tcp_conn_rr: send_socket obtained...\n");
809202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
809302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
809402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user has requested cpu utilization measurements, we must */
809502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate the cpu(s). We will perform this task within the tests */
809602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* themselves. If the user has specified the cpu rate, then */
809702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate_local_cpu will return rather quickly as it will have */
809802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nothing to do. If local_cpu_rate is zero, then we will go through */
809902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the "normal" calibration stuff and return the rate back.*/
810002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
810102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage) {
810202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
810302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
810402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
810502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!no_control) {
810602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
810702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the
810802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       socket paramters on the other side at this point, hence the
810902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       reason for all the values being passed in the setup message. If
811002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the user did not specify any of the parameters, they will be
811102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       passed as 0, which will indicate to the remote that no changes
811202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       beyond the system's default should be used. Alignment is the
811302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       exception, it will default to 8, which will be no alignment
811402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       alterations. */
811502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
811602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type =	DO_TCP_CRR;
811702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->recv_buf_size	=	rsr_size_req;
811802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->send_buf_size	=	rss_size_req;
811902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->recv_alignment	=	remote_recv_align;
812002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->recv_offset	=	remote_recv_offset;
812102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->send_alignment	=	remote_send_align;
812202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->send_offset	=	remote_send_offset;
812302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->request_size	=	req_size;
812402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->response_size	=	rsp_size;
812502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->no_delay	=	rem_nodelay;
812602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->measure_cpu	=	remote_cpu_usage;
812702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->cpu_rate	=	remote_cpu_rate;
812802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->so_rcvavoid	=	rem_rcvavoid;
812902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->so_sndavoid	=	rem_sndavoid;
813002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
813102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_conn_rr_request->test_length	=	test_time;
813202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
813302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
813402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_conn_rr_request->test_length	=	test_trans * -1;
813502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
813602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->port           = atoi(remote_data_port);
813702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_request->ipfamily       = af_to_nf(remote_res->ai_family);
813802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
813902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
814002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_tcp_conn_rr: requesting TCP crr test\n");
814102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
814202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
814302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
814402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
814502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant
814602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       socket parameters for this test type. We will put them back
814702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       into the variables here so they can be displayed if desired.
814802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       The remote will have calibrated CPU if necessary, and will have
814902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       done all the needed set-up we will have calibrated the cpu
815002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       locally before sending the request, and will grab the counter
815102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       value right after the connect returns. The remote will grab the
815202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       counter right after the accept call. This saves the hassle of
815302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       extra messages being sent for the TCP tests.  */
815402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
815502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
815602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
815702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
815802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size	       =	tcp_conn_rr_response->recv_buf_size;
815902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size	       =	tcp_conn_rr_response->send_buf_size;
816002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay      =	tcp_conn_rr_response->no_delay;
816102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage =	tcp_conn_rr_response->measure_cpu;
816202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate  = 	tcp_conn_rr_response->cpu_rate;
816302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* make sure that port numbers are in network order */
816402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res,
816502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      (unsigned short)tcp_conn_rr_response->data_port_number);
816602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
816702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
816802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote listen done.\n");
816902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote port is %u\n",get_port_number(remote_res));
817002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
817102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
817202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
817302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
817402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
817502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
817602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
817702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
817802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
817902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
818002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
818102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
818202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
818302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
818402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DEMO_RR_SETUP(100)
818502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
818602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
818702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* pick a nice random spot between client_port_min and */
818802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* client_port_max for our initial port number */
818902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  srand(getpid());
819002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (client_port_max - client_port_min) {
819102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport = client_port_min +
819202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (rand() % (client_port_max - client_port_min));
819302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
819402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
819502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport = client_port_min;
819602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
819702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* there will be a ++ before the first call to bind, so subtract one */
819802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myport--;
819902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Set-up the test end conditions. For a request/response test, they */
820002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can be either time or transaction based. */
820102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
820202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
820302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to end the test after a period of time. */
820402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
820502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
820602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(test_time);
820702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
820802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
820902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester wanted to send a number of bytes. */
821002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = test_bytes;
821102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
821202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
821302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
821402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The cpu_start routine will grab the current time and possibly */
821502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* value of the idle counter for later use in measuring cpu */
821602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* utilization and/or service demand and thruput. */
821702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
821802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
821902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(local_cpu_usage);
822002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
822102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
822202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
822302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(demo_one_ptr);
822402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
822502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
822602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
822702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We use an "OR" to control test execution. When the test is */
822802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* controlled by time, the byte count check will always return false. */
822902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* When the test is controlled by byte count, the time test will */
823002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* always return false. When the test is finished, the whole */
823102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* expression will go false and we will stop sending data. I think I */
823202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just arbitrarily decrement trans_remaining for the timed test, but */
823302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will not do that just yet... One other question is whether or not */
823402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the send buffer and the receive buffer should be the same buffer. */
823502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
823602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
823702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
823802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
823902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
824002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before our call to create the socket, and then */
824102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* again just after the receive raj 3/95 */
824202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
824302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
824402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
824502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
824602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnewport:
824702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* pick a new port number */
824802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport++;
824902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
825002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wrap the port number when we get to client_port_max. NOTE, some */
825102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* broken TCP's might treat the port number as a signed 16 bit */
825202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* quantity.  we aren't interested in testing such broken */
825302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* implementations :) so we won't make sure that it is below 32767 */
825402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* raj 8/94  */
825502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (myport >= client_port_max) {
825602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      myport = client_port_min;
825702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
825802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
825902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we do not want to use the port number that the server is */
826002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sitting at - this would cause us to fail in a loopback test. we */
826102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* could just rely on the failure of the bind to get us past this, */
826202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but I'm guessing that in this one case at least, it is much */
826302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* faster, given that we *know* that port number is already in use */
826402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* (or rather would be in a loopback test) */
826502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
826602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (myport == get_port_number(remote_res)) myport++;
826702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
826802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
826902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((nummessages % 100) == 0) {
827002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	printf("port %d\n",myport);
827102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
827202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
827302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
827402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set up the data socket */
827502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    set_port_number(local_res, (unsigned short)myport);
827602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
827702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
827802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET) {
827902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_conn_rr: tcp stream data socket");
828002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
828102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
828202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
828302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
828402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we used to call bind here, but that is now taken-care-of by the
828502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       create_data_socket routine. */
828602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
828702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Connect up to the remote port on the data socket  */
828802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((ret = connect(send_socket,
828902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       remote_res->ai_addr,
829002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       remote_res->ai_addrlen)) == INVALID_SOCKET){
829102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(ret))
829202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
829302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* we hit the end of a */
829402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* timed test. */
829502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
829602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
829702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
829802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((SOCKET_EADDRINUSE(ret)) || SOCKET_EADDRNOTAVAIL(ret)) {
829902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* likely something our explicit bind() would have caught in
830002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           the past, so go get another port, via create_data_socket.
830102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           yes, this is a bit more overhead than before, but the
830202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           condition should be rather rare.  raj 2005-02-08 */
830302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	close(send_socket);
830402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	goto newport;
830502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
830602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: data socket connect failed");
830702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("\tattempted to connect on socket %d to port %d",
830802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     send_socket,
830902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     get_port_number(remote_res));
831002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf(" from port %d \n",get_port_number(local_res));
831102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
831202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
831302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
831402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
831502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send the request */
831602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((len=send(send_socket,
831702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 send_ring->buffer_ptr,
831802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 req_size,
831902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 0)) != req_size) {
832002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(len))
832102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
832202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* we hit the end of a */
832302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* timed test. */
832402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
832502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
832602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
832702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_tcp_conn_rr: data send error");
832802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
832902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
833002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
833102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
833202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the response */
833302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsp_bytes_left = rsp_size;
833402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr  = recv_ring->buffer_ptr;
833502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
833602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
833702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    do {
833802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_recvd = recv(send_socket,
833902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     temp_message_ptr,
834002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     rsp_bytes_left,
834102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     0);
834202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (rsp_bytes_recvd > 0) {
834302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_bytes_left -= rsp_bytes_recvd;
834402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr += rsp_bytes_recvd;
834502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
834602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
834702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
834802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
834902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } while (rsp_bytes_left);
835002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
835102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
835202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* OK, we are out of the loop - now what? */
835302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (rsp_bytes_recvd < 0) {
835402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* did the timer hit, or was there an error? */
835502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(rsp_bytes_recvd))
835602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
835702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* We hit the end of a timed test. */
835802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
835902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
836002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
836102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_tcp_conn_rr: data recv error");
836202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
836302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
836402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
836502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if this is a no_control test, we initiate connection close,
836602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       otherwise the remote netserver does it to remain just like
836702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       previous behaviour. raj 2007-27-08 */
836802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
836902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      shutdown(send_socket,SHUT_WR);
837002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
837102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
837202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are expecting to get either a return of zero indicating
837302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       connection close, or an error.  */
837402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsp_bytes_recvd = recv(send_socket,
837502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   temp_message_ptr,
837602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   1,
837702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   0);
837802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
837902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* our exit from the while loop should generally be when */
838002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* tmp_bytes_recvd is equal to zero, which implies the connection */
838102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has been closed by the server side. By waiting until we get the */
838202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* zero return we can avoid race conditions that stick us with the */
838302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TIME_WAIT connection and not the server. raj 8/96 */
838402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
838502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (rsp_bytes_recvd == 0) {
838602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* connection close, call close. we assume that the requisite */
838702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* number of bytes have been received */
838802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
838902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
839002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
839102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
839202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
839302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
839402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
839502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
839602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
839702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
839802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_RR_INTERVAL(1)
839902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
840002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
840102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
840202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
840302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
840402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
840502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
840602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
840702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
840802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"Transaction %d completed on local port %d\n",
840902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		nummessages,
841002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		get_port_number(local_res));
841102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
841202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
841302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
841402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      close(send_socket);
841502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
841602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
841702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
841802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it was less than zero - an error occured */
841902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(rsp_bytes_recvd))
842002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
842102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* We hit the end of a timed test. */
842202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
842302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
842402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
842502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_tcp_conn_rr: data recv error");
842602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
842702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
842802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
842902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
843002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
843102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
843202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this call will always give us the elapsed time for the test, and */
843302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will also store-away the necessaries for cpu utilization */
843402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
843502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being measured? */
843602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how long did we really run? */
843702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
843802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!no_control) {
843902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have
844002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       calculated service demand and all those interesting things. If
844102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       it wasn't supposed to care, it will return obvious values. */
844202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
844302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
844402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
844502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
844602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
844702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
844802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
844902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
845002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
845102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
845202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
845302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
845402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
845502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
845602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
845702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
845802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
845902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
846002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now calculate what our thruput was for the test. In the future, */
846102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we may want to include a calculation of the thruput measured by */
846202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote, but it should be the case that for a TCP stream test, */
846302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the two numbers should be *very* close... We calculate */
846402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bytes_sent regardless of the way the test length was controlled. */
846502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If it was time, we needed to, and if it was by bytes, the user may */
846602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* have specified a number of bytes that wasn't a multiple of the */
846702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_size, so we really didn't send what he asked for ;-) We use */
846802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
846902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 1024. A future enhancement *might* be to choose from a couple of */
847002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* unit selections. */
847102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
847202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
847302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  thruput	= calc_thruput(bytes_xferd);
847402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
847502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
847602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We must now do a little math for service demand and cpu */
847702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization for the system(s) */
847802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Of course, some of the information might be bogus because */
847902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was no idle counter in the kernel(s). We need to make */
848002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a note of this for the user's benefit...*/
848102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
848202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_rate == 0.0) {
848302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
848402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"WARNING WARNING WARNING  WARNING WARNING WARNING  WARNING!\n");
848502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
848602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"Local CPU usage numbers based on process information only!\n");
848702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
848802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
848902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization = calc_cpu_util(0.0);
849002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
849102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
849202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
849302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand  = calc_service_demand((double) nummessages*1024,
849402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
849502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
849602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0);
849702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
849802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
849902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
850002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
850102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
850202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
850302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (remote_cpu_usage) {
850402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_rate == 0.0) {
850502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
850602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"DANGER  DANGER  DANGER    DANGER  DANGER  DANGER    DANGER!\n");
850702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
850802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"Remote CPU usage numbers based on process information only!\n");
850902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
851002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
851102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = tcp_conn_rr_result->cpu_util;
851202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
851302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
851402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
851502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand = calc_service_demand((double) nummessages*1024,
851602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
851702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  remote_cpu_utilization,
851802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  tcp_conn_rr_result->num_cpus);
851902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
852002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
852102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
852202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
852302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
852402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
852502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
852602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
852702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
852802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
852902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
853002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
853102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
853202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
853302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
853402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
853502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
853602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
853702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
853802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
853902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand);
854002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
854102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
854202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
854302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
854402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand);
854502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
854602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
854702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
854802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
854902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
855002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
855102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
855202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
855302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
855402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
855502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
855602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
855702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
855802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
855902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
856002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
856102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
856202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
856302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
856402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time,
856502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
856602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
856702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
856802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
856902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
857002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
857102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
857202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
857302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
857402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
857502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
857602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
857702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
857802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
857902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
858002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
858102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
858202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
858302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
858402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
858502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
858602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
858702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
858802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
858902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
859002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
859102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
859202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
859302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
859402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
859502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
859602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
859702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
859802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
859902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
860002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
860102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
860202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
860302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
860402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
860502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
860602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
860702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
860802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
860902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
861002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
861102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
861202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
861302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
861402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
861502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
861602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
861702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
861802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
861902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
862002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
862102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
862202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
862302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
862402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset);
862502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
862602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
862702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
862802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
862902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
863002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
863102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
863202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
863302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
863402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
863502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
863602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
863702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
863802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_tcp_conn_rr()
863902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
864002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
864102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  *message;
864202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
864302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
864402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
864502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
864602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_storage        myaddr_in, peeraddr_in;
864702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,s_data;
864802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
864902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*recv_message_ptr;
865002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*send_message_ptr;
865102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
865202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
865302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
865402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
865502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_recvd;
865602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
865702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
865802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
865902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
866002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_conn_rr_request_struct	*tcp_conn_rr_request;
866102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_conn_rr_response_struct	*tcp_conn_rr_response;
866202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_conn_rr_results_struct	*tcp_conn_rr_results;
866302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
866402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_request =
866502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_conn_rr_request_struct *)netperf_request.content.test_specific_data;
866602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response =
866702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_conn_rr_response_struct *)netperf_response.content.test_specific_data;
866802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_results =
866902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_conn_rr_results_struct *)netperf_response.content.test_specific_data;
867002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
867102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
867202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_tcp_conn_rr: entered...\n");
867302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
867402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
867502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
867602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
867702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
867802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
867902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
868002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
868102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
868202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
868302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
868402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
868502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
868602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
868702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
868802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
868902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
869002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_conn_rr: setting the response type...\n");
869102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
869202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
869302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
869402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = TCP_CRR_RESPONSE;
869502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
869602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
869702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_conn_rr: the response type is set...\n");
869802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
869902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
870002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
870102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset */
870202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(DATABUFFERLEN);
870302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
870402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", DATABUFFERLEN);
870502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
870602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
870702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
870802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variables to be at the desired */
870902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignments with the desired offsets. */
871002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
871102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
871202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
871302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_conn_rr: requested recv alignment of %d offset %d\n",
871402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_conn_rr_request->recv_alignment,
871502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_conn_rr_request->recv_offset);
871602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
871702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_conn_rr: requested send alignment of %d offset %d\n",
871802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_conn_rr_request->send_alignment,
871902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_conn_rr_request->send_offset);
872002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
872102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
872202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
872302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = ALIGN_BUFFER(message, tcp_conn_rr_request->recv_alignment, tcp_conn_rr_request->recv_offset);
872402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
872502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = ALIGN_BUFFER(message, tcp_conn_rr_request->send_alignment, tcp_conn_rr_request->send_offset);
872602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
872702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
872802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_conn_rr: receive alignment and offset set...\n");
872902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
873002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
873102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
873202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
873302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
873402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
873502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_conn_rr: grabbing a socket...\n");
873602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
873702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
873802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
873902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
874002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
874102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
874202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
874302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = tcp_conn_rr_request->send_buf_size;
874402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = tcp_conn_rr_request->recv_buf_size;
874502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = tcp_conn_rr_request->no_delay;
874602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = tcp_conn_rr_request->so_rcvavoid;
874702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = tcp_conn_rr_request->so_sndavoid;
874802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
874902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
875002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
875102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(tcp_conn_rr_request->ipfamily),
875202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_conn_rr_request->port);
875302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
875402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
875502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
875602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
875702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(tcp_conn_rr_request->ipfamily),
875802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
875902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
876002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
876102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
876202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
876302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
876402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
876502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
876602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
876702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
876802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not create data socket\n");
876902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
877002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
877102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
877202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
877302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
877402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
877502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test timer can fire during operations on the listening socket,
877602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       so to make the start_timer below work we have to move
877702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       it to close s_listen while we are blocked on accept. */
877802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    win_kludge_socket2 = s_listen;
877902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
878002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
878102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
878202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
878302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
878402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
878502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
878602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
878702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
878802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not listen\n");
878902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
879002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
879102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
879202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
879302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
879402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
879502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
879602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
879702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
879802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
879902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
880002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
880102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
880202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
880302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not getsockname\n");
880402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
880502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
880602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
880702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
880802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
880902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
881002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
881102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
881202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
881302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response->data_port_number =
881402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
881502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
881602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"telling the remote to call me at %d\n",
881702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_conn_rr_response->data_port_number);
881802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
881902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
882002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
882102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
882202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
882302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
882402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
882502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
882602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
882702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
882802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response->cpu_rate = (float)0.0; 	/* assume no cpu */
882902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_conn_rr_request->measure_cpu) {
883002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_response->measure_cpu = 1;
883102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_response->cpu_rate =
883202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(tcp_conn_rr_request->cpu_rate);
883302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
883402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
883502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
883602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
883702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
883802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
883902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response->send_buf_size = lss_size;
884002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response->recv_buf_size = lsr_size;
884102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response->no_delay = loc_nodelay;
884202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response->so_rcvavoid = loc_rcvavoid;
884302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_response->so_sndavoid = loc_sndavoid;
884402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
884502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
884602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
884702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
884802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
884902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
885002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
885102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
885202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(tcp_conn_rr_request->measure_cpu);
885302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
885402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
885502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
885602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
885702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_conn_rr_request->test_length > 0) {
885802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
885902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
886002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(tcp_conn_rr_request->test_length + PAD_TIME);
886102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
886202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
886302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
886402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = tcp_conn_rr_request->test_length * -1;
886502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
886602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
886702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
886802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
886902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
887002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
887102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* accept a connection from the remote */
887202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
887302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test timer will probably fire during this accept,
887402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       so to make the start_timer above work we have to move
887502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       it to close s_listen while we are blocked on accept. */
887602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    win_kludge_socket = s_listen;
887702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
887802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((s_data=accept(s_listen,
887902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       (struct sockaddr *)&peeraddr_in,
888002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       &addrlen)) == INVALID_SOCKET) {
888102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
888202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the timer popped */
888302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
888402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
888502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
888602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_tcp_conn_rr: accept: errno = %d\n",errno);
888702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
888802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      close(s_listen);
888902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
889002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
889102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
889202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
889302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
889402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_tcp_conn_rr: accepted data connection.\n");
889502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
889602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
889702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
889802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
889902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is used so the timer thread can close the socket out from */
890002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* under us, which to date is the easiest/cleanest/least */
890102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Windows-specific way I can find to force the winsock calls to */
890202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return WSAEINTR with the test is over. anything that will run on */
890302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 95 and NT and is closer to what netperf expects from Unix signals */
890402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and such would be appreciated raj 1/96 */
890502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket = s_data;
890602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
890702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
890802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
890902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this is for those systems which *INCORRECTLY* fail to pass */
891002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* attributes across an accept() call. Including this goes against */
891102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* my better judgement :( raj 11/95 */
891202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
891302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    kludge_socket_options(s_data);
891402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
891502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
891602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
891702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr	= recv_message_ptr;
891802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining	= tcp_conn_rr_request->request_size;
891902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
892002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the request from the other side */
892102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while (!times_up && (request_bytes_remaining > 0)) {
892202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((request_bytes_recvd=recv(s_data,
892302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   temp_message_ptr,
892402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   request_bytes_remaining,
892502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   0)) == SOCKET_ERROR) {
892602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (SOCKET_EINTR(request_bytes_recvd))
892702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
892802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* the timer popped */
892902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
893002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
893102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
893202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = errno;
893302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
893402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
893502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
893602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
893702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_bytes_remaining -= request_bytes_recvd;
893802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += request_bytes_recvd;
893902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
894002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
894102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
894202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
894302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
894402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
894502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"yo5\n");
894602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
894702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
894802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
894902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
895002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
895102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((bytes_sent=send(s_data,
895202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_message_ptr,
895302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_conn_rr_request->response_size,
895402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			0)) == SOCKET_ERROR) {
895502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
895602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
895702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
895802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo6\n");
895902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
896002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
896102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
896202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 99;
896302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
896402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
896502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
896602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
896702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
896802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
896902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
897002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
897102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
897202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
897302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
897402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_tcp_conn_rr: Transaction %d complete\n",
897502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
897602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
897702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
897802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
897902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* close the connection. the server will likely do a graceful */
898002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* close of the connection, insuring that all data has arrived at */
898102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the client. for this it will call shutdown(), and then recv() and */
898202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* then close(). I'm reasonably confident that this is the */
898302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* appropriate sequence of calls - I would like to hear of */
898402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* examples in web servers to the contrary. raj 10/95*/
898502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef TCP_CRR_SHUTDOWN
898602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    shutdown(s_data,SHUT_WR);
898702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv(s_data,
898802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 recv_message_ptr,
898902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 1,
899002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 0);
899102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_data);
899202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
899302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_data);
899402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_CRR_SHUTDOWN */
899502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
899602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
899702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
899802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
899902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
900002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
900102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
900202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(tcp_conn_rr_request->measure_cpu,&elapsed_time);
900302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
900402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
900502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
900602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
900702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
900802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
900902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
901002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
901102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
901202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
901302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
901402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_conn_rr: got %d transactions\n",
901502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
901602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
901702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
901802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
901902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_results->bytes_received	= (trans_received *
902002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					   (tcp_conn_rr_request->request_size +
902102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					    tcp_conn_rr_request->response_size));
902202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_results->trans_received	= trans_received;
902302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_conn_rr_results->elapsed_time	= elapsed_time;
902402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_conn_rr_request->measure_cpu) {
902502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_conn_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
902602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
902702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
902802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
902902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
903002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_conn_rr: test complete, sending results.\n");
903102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
903202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
903302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
903402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
903502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
903602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
903702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
903802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
903902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_1644
904002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
904102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this test is intended to test the performance of establishing a */
904202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* connection, exchanging a request/response pair, and repeating. it */
904302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* is expected that this would be a good starting-point for */
904402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* comparision of T/TCP with classic TCP for transactional workloads. */
904502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* it will also look (can look) much like the communication pattern */
904602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* of http for www access. */
904702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
904802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
904902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_tcp_tran_rr(char remote_host[])
905002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
905102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
905202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
905302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
905402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
905502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
905602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
905702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
905802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
905902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
906002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
906102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
906202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
906302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
906402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
906502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
906602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
906702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
906802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
906902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
907002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %%      %%      us/Tr   us/Tr\n\n";
907102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
907202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
907302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f\n";
907402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
907502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
907602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f   %-6.2f %-6.2f %-6.3f  %-6.3f\n";
907702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
907802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
907902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
908002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
908102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
908202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
908302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
908402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
908502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
908602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
908702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
908802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 			one = 1;
908902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
909002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
909102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
909202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
909302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
909402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
909502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
909602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
909702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	send_socket;
909802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
909902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
910002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	sock_opt_len = sizeof(int);
910102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
910202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
910302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
910402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
910502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
910602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
910702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
910802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
910902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
911002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	hostent	        *hp;
911102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in	server;
911202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct        sockaddr_in     *myaddr;
911302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned      int             addr;
911402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int                           myport;
911502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
911602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_tran_rr_request_struct	*tcp_tran_rr_request;
911702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_tran_rr_response_struct	*tcp_tran_rr_response;
911802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_tran_rr_results_struct	*tcp_tran_rr_result;
911902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
912002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request =
912102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_tran_rr_request_struct *)netperf_request.content.test_specific_data;
912202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response =
912302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_tran_rr_response_struct *)netperf_response.content.test_specific_data;
912402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_result =
912502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_tran_rr_results_struct *)netperf_response.content.test_specific_data;
912602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
912702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
912802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
912902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
913002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
913102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
913202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
913302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
913402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
913502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
913602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
913702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
913802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
913902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr = (struct sockaddr_storage *)malloc(sizeof(struct sockaddr_storage));
914002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (myaddr == NULL) {
914102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", sizeof(struct sockaddr_storage));
914202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
914302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
914402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
914502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&server,
914602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(server));
914702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)myaddr,
914802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(struct sockaddr_storage));
914902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr->sin_family = AF_INET;
915002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
915102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
915202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
915302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
915402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
915502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
915602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
915702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
915802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
915902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP Transactional/Request/Response TEST",local_res,remote_res);
916002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
916102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
916202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
916302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
916402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	=	0;
916502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	=	0.0;
916602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 	0;
916702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
916802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffers with the requested alignment and offset */
916902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
917002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
917102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
917202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
917302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   req_size,
917402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_send_align,
917502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_send_offset);
917602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
917702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
917802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   rsp_size,
917902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_recv_align,
918002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_recv_offset);
918102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
918202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
918302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
918402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_tcp_tran_rr: send_socket obtained...\n");
918502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
918602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
918702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user has requested cpu utilization measurements, we must */
918802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate the cpu(s). We will perform this task within the tests */
918902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* themselves. If the user has specified the cpu rate, then */
919002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate_local_cpu will return rather quickly as it will have */
919102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nothing to do. If local_cpu_rate is zero, then we will go through */
919202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the "normal" calibration stuff and return the rate back.*/
919302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
919402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage) {
919502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
919602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
919702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
919802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Tell the remote end to do a listen. The server alters the socket */
919902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* paramters on the other side at this point, hence the reason for */
920002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the values being passed in the setup message. If the user did */
920102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not specify any of the parameters, they will be passed as 0, which */
920202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will indicate to the remote that no changes beyond the system's */
920302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default should be used. Alignment is the exception, it will */
920402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default to 8, which will be no alignment alterations. */
920502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
920602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.request_type	        =	DO_TCP_TRR;
920702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->recv_buf_size	=	rsr_size_req;
920802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->send_buf_size	=	rss_size_req;
920902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->recv_alignment	=	remote_recv_align;
921002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->recv_offset	=	remote_recv_offset;
921102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->send_alignment	=	remote_send_align;
921202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->send_offset	=	remote_send_offset;
921302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->request_size	=	req_size;
921402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->response_size	=	rsp_size;
921502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->no_delay	        =	rem_nodelay;
921602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->measure_cpu	=	remote_cpu_usage;
921702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->cpu_rate	        =	remote_cpu_rate;
921802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->so_rcvavoid	=	rem_rcvavoid;
921902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->so_sndavoid	=	rem_sndavoid;
922002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
922102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_tran_rr_request->test_length	=	test_time;
922202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
922302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
922402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_tran_rr_request->test_length	=	test_trans * -1;
922502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
922602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->port             =       atoi(remote_data_port);
922702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request->ipfamily        =       af_to_nf(remote_res->ai_family);
922802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
922902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
923002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: send_tcp_tran_rr: requesting TCP_TRR test\n");
923102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
923202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
923302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_request();
923402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
923502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The response from the remote will contain all of the relevant 	*/
923602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket parameters for this test type. We will put them back into 	*/
923702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the variables here so they can be displayed if desired.  The	*/
923802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote will have calibrated CPU if necessary, and will have done	*/
923902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the needed set-up we will have calibrated the cpu locally	*/
924002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before sending the request, and will grab the counter value right	*/
924102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the connect returns. The remote will grab the counter right	*/
924202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the accept call. This saves the hassle of extra messages	*/
924302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* being sent for the TCP tests.					*/
924402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
924502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
924602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
924702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
924802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsr_size	=	tcp_tran_rr_response->recv_buf_size;
924902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rss_size	=	tcp_tran_rr_response->send_buf_size;
925002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rem_nodelay	=	tcp_tran_rr_response->no_delay;
925102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_usage=	tcp_tran_rr_response->measure_cpu;
925202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_rate = 	tcp_tran_rr_response->cpu_rate;
925302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* make sure that port numbers are in network order */
925402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_port	=	tcp_tran_rr_response->data_port_number;
925502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_port =	htons(server.sin_port);
925602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
925702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote listen done.\n");
925802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote port is %d\n",ntohs(server.sin_port));
925902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
926002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
926102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
926202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
926302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
926402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
926502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: remote error %d",
926602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    netperf_response.content.serv_errno);
926702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("");
926802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
926902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
927002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
927102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
927202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* pick a nice random spot between client_port_min and */
927302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* client_port_max for our initial port number. if they are the */
927402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* same, then just set to _min */
927502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (client_port_max - client_port_min) {
927602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    srand(getpid());
927702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport = client_port_min +
927802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (rand() % (client_port_max - client_port_min));
927902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
928002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
928102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport = client_port_min;
928202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
928302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
928402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* there will be a ++ before the first call to bind, so subtract one */
928502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myport--;
928602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr->sin_port = htons((unsigned short)myport);
928702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
928802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Set-up the test end conditions. For a request/response test, they */
928902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can be either time or transaction based. */
929002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
929102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
929202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to end the test after a period of time. */
929302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
929402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
929502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(test_time);
929602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
929702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
929802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester wanted to send a number of bytes. */
929902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = test_bytes;
930002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
930102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
930202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
930302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The cpu_start routine will grab the current time and possibly */
930402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* value of the idle counter for later use in measuring cpu */
930502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* utilization and/or service demand and thruput. */
930602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
930702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(local_cpu_usage);
930802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
930902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We use an "OR" to control test execution. When the test is */
931002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* controlled by time, the byte count check will always return false. */
931102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* When the test is controlled by byte count, the time test will */
931202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* always return false. When the test is finished, the whole */
931302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* expression will go false and we will stop sending data. I think I */
931402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just arbitrarily decrement trans_remaining for the timed test, but */
931502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will not do that just yet... One other question is whether or not */
931602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the send buffer and the receive buffer should be the same buffer. */
931702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
931802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
931902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
932002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
932102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
932202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before our call to create the socket, and then */
932302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* again just after the receive raj 3/95 */
932402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
932502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
932602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
932702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
932802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set up the data socket - is this really necessary or can I just */
932902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* re-use the same socket and move this cal out of the while loop. */
933002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it does introcudea *boatload* of system calls. I guess that it */
933102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all depends on "reality of programming." keeping it this way is */
933202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a bit more conservative I imagine - raj 3/95 */
933302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
933402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
933502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET) {
933602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_tran_rr: tcp stream data socket");
933702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
933802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
933902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
934002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we set SO_REUSEADDR on the premis that no unreserved port */
934102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* number on the local system is going to be already connected to */
934202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the remote netserver's port number. One thing that I might */
934302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* try later is to have the remote actually allocate a couple of */
934402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* port numbers and cycle through those as well. depends on if we */
934502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can get through all the unreserved port numbers in less than */
934602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the length of the TIME_WAIT state raj 8/94 */
934702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    one = 1;
934802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(setsockopt(send_socket, SOL_SOCKET, SO_REUSEADDR,
934902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (char *)&one, sock_opt_len) == SOCKET_ERROR) {
935002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_tran_rr: so_reuseaddr");
935102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
935202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
935302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
935402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnewport:
935502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* pick a new port number */
935602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport = ntohs(myaddr->sin_port);
935702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport++;
935802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
935902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we do not want to use the port number that the server is */
936002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sitting at - this would cause us to fail in a loopback test. we */
936102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* could just rely on the failure of the bind to get us past this, */
936202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but I'm guessing that in this one case at least, it is much */
936302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* faster, given that we *know* that port number is already in use */
936402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* (or rather would be in a loopback test) */
936502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
936602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (myport == ntohs(server.sin_port)) myport++;
936702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
936802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wrap the port number when we get to 65535. NOTE, some broken */
936902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP's might treat the port number as a signed 16 bit quantity. */
937002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we aren't interested in testing such broken implementations :) */
937102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* raj 8/94  */
937202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (myport >= client_port_max) {
937302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      myport = client_port_min;
937402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
937502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myaddr->sin_port = htons((unsigned short)myport);
937602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
937702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
937802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((nummessages % 100) == 0) {
937902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	printf("port %d\n",myport);
938002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
938102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
938202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
938302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to bind our socket to a particular port number. */
938402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (bind(send_socket,
938502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     (struct sockaddr *)myaddr,
938602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     sizeof(struct sockaddr_storage)) == SOCKET_ERROR) {
938702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* if the bind failed, someone else must have that port number */
938802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* - perhaps in the listen state. since we can't use it, skip to */
938902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the next port number. we may have to do this again later, but */
939002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* that's just too bad :) */
939102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 1) {
939202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
939302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"send_tcp_tran_rr: tried to bind to port %d errno %d\n",
939402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		ntohs(myaddr->sin_port),
939502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno);
939602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
939702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
939802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* yes, goto's are supposed to be evil, but they do have their */
939902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* uses from time to time. the real world doesn't always have */
940002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* to code to ge tthe A in CS 101 :) raj 3/95 */
940102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	goto newport;
940202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
940302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
940402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Connect up to the remote port on the data socket. Since this is */
940502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a test for RFC_1644-style transactional TCP, we can use the */
940602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sendto() call instead of calling connect and then send() */
940702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
940802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send the request */
940902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((len=sendto(send_socket,
941002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   send_ring->buffer_ptr,
941102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   req_size,
941202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   MSG_EOF,
941302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   (struct sockaddr *)&server,
941402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   sizeof(server))) != req_size) {
941502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(len))
941602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
941702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* we hit the end of a */
941802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* timed test. */
941902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
942002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
942102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
942202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_tcp_tran_rr: data send error");
942302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
942402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
942502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
942602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
942702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the response */
942802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsp_bytes_left = rsp_size;
942902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr  = recv_ring->buffer_ptr;
943002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(rsp_bytes_left > 0) {
943102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((rsp_bytes_recvd=recv(send_socket,
943202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       temp_message_ptr,
943302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       rsp_bytes_left,
943402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       0)) == SOCKET_ERROR) {
943502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if (SOCKET_EINTR(rsp_bytes_recvd))
943602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		{
943702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* We hit the end of a timed test. */
943802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      timed_out = 1;
943902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
944002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
944102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    perror("send_tcp_tran_rr: data recv error");
944202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
944302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
944402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_left -= rsp_bytes_recvd;
944502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_message_ptr  += rsp_bytes_recvd;
944602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
944702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
944802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
944902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
945002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we may have been in a nested while loop - we need */
945102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* another call to break. */
945202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
945302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
945402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
945502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
945602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
945702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
945802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
945902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_two);
946002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_add(time_hist,delta_micro(&time_one,&time_two));
946102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
946202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
946302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
946402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages++;
946502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
946602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
946702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
946802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
946902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 3) {
947002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
947102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "Transaction %d completed on local port %d\n",
947202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages,
947302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ntohs(myaddr->sin_port));
947402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
947502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
947602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
947702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
947802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
947902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
948002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this call will always give us the elapsed time for the test, and */
948102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will also store-away the necessaries for cpu utilization */
948202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
948302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being measured? */
948402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how long did we really run? */
948502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
948602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Get the statistics from the remote end. The remote will have */
948702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculated service demand and all those interesting things. If it */
948802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* wasn't supposed to care, it will return obvious values. */
948902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
949002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
949102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
949202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
949302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote results obtained\n");
949402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
949502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
949602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
949702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
949802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: remote error %d",
949902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    netperf_response.content.serv_errno);
950002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("");
950102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
950202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
950302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
950402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
950502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now calculate what our thruput was for the test. In the future, */
950602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we may want to include a calculation of the thruput measured by */
950702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote, but it should be the case that for a TCP stream test, */
950802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the two numbers should be *very* close... We calculate */
950902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bytes_sent regardless of the way the test length was controlled. */
951002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If it was time, we needed to, and if it was by bytes, the user may */
951102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* have specified a number of bytes that wasn't a multiple of the */
951202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_size, so we really didn't send what he asked for ;-) We use */
951302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
951402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 1024. A future enhancement *might* be to choose from a couple of */
951502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* unit selections. */
951602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
951702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
951802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  thruput	= calc_thruput(bytes_xferd);
951902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
952002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
952102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We must now do a little math for service demand and cpu */
952202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization for the system(s) */
952302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Of course, some of the information might be bogus because */
952402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was no idle counter in the kernel(s). We need to make */
952502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a note of this for the user's benefit...*/
952602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
952702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_rate == 0.0) {
952802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"WARNING WARNING WARNING  WARNING WARNING WARNING  WARNING!\n");
952902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Local CPU usage numbers based on process information only!\n");
953002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
953102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
953202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization = calc_cpu_util(0.0);
953302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
953402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
953502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
953602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand  = calc_service_demand((double) nummessages*1024,
953702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
953802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
953902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0);
954002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
954102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
954202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
954302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
954402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
954502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
954602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (remote_cpu_usage) {
954702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_rate == 0.0) {
954802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"DANGER  DANGER  DANGER    DANGER  DANGER  DANGER    DANGER!\n");
954902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Remote CPU usage numbers based on process information only!\n");
955002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
955102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
955202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = tcp_tran_rr_result->cpu_util;
955302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
955402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
955502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
955602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand = calc_service_demand((double) nummessages*1024,
955702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
955802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  remote_cpu_utilization,
955902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  tcp_tran_rr_result->num_cpus);
956002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
956102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
956202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
956302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
956402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
956502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
956602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
956702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
956802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
956902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
957002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
957102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
957202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
957302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
957402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
957502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
957602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
957702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
957802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
957902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
958002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand);
958102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
958202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
958302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
958402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
958502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand);
958602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
958702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
958802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
958902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
959002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
959102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
959202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
959302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
959402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
959502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
959602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
959702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
959802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
959902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
960002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
960102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
960202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
960302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
960402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
960502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time,
960602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
960702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
960802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
960902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
961002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
961102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
961202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
961302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
961402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
961502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
961602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
961702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
961802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
961902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
962002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
962102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
962202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
962302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
962402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
962502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
962602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
962702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
962802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
962902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
963002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
963102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
963202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
963302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
963402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
963502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
963602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
963702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
963802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
963902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
964002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
964102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
964202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
964302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
964402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
964502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
964602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
964702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
964802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
964902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
965002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
965102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
965202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
965302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
965402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
965502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
965602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
965702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
965802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
965902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
966002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
966102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
966202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
966302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
966402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
966502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset);
966602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
966702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
966802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
966902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
967002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
967102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
967202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
967302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
967402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
967502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
967602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
967702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
967802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
967902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_tcp_tran_rr()
968002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
968102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
968202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  *message;
968302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in        myaddr_in,
968402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  peeraddr_in;
968502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,s_data;
968602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
968702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   NoPush = 1;
968802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
968902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*recv_message_ptr;
969002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*send_message_ptr;
969102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
969202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
969302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
969402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
969502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_recvd;
969602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
969702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
969802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
969902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
970002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_tran_rr_request_struct	*tcp_tran_rr_request;
970102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_tran_rr_response_struct	*tcp_tran_rr_response;
970202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_tran_rr_results_struct	*tcp_tran_rr_results;
970302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
970402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_request =
970502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_tran_rr_request_struct *)netperf_request.content.test_specific_data;
970602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response =
970702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_tran_rr_response_struct *)netperf_response.content.test_specific_data;
970802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_results =
970902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_tran_rr_results_struct *)netperf_response.content.test_specific_data;
971002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
971102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
971202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_tcp_tran_rr: entered...\n");
971302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
971402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
971502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
971602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
971702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
971802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
971902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
972002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
972102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
972202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
972302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
972402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
972502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
972602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
972702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
972802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
972902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
973002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_tran_rr: setting the response type...\n");
973102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
973202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
973302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
973402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = TCP_TRR_RESPONSE;
973502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
973602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
973702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_tran_rr: the response type is set...\n");
973802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
973902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
974002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
974102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset */
974202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(DATABUFFERLEN);
974302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
974402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", DATABUFFERLEN);
974502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
974602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
974702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
974802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variables to be at the desired */
974902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignments with the desired offsets. */
975002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
975102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
975202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
975302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_tran_rr: requested recv alignment of %d offset %d\n",
975402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_tran_rr_request->recv_alignment,
975502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_tran_rr_request->recv_offset);
975602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
975702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_tran_rr: requested send alignment of %d offset %d\n",
975802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_tran_rr_request->send_alignment,
975902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_tran_rr_request->send_offset);
976002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
976102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
976202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
976302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = ALIGN_BUFFER(message, tcp_tran_rr_request->recv_alignment, tcp_tran_rr_request->recv_offset);
976402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
976502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = ALIGN_BUFFER(message, tcp_tran_rr_request->send_alignment, tcp_tran_rr_request->send_offset);
976602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
976702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
976802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_tran_rr: receive alignment and offset set...\n");
976902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
977002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
977102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
977202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
977302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can put in OUR values !-) At some point, we may want to nail this */
977402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket to a particular network-level address, but for now, */
977502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* INADDR_ANY should be just fine. */
977602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
977702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&myaddr_in,
977802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(myaddr_in));
977902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_family      = AF_INET;
978002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_addr.s_addr = INADDR_ANY;
978102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_port        = htons((unsigned short)tcp_tran_rr_request->port);
978202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
978302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
978402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
978502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
978602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_tran_rr: grabbing a socket...\n");
978702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
978802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
978902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
979002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
979102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
979202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
979302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
979402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = tcp_tran_rr_request->send_buf_size;
979502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = tcp_tran_rr_request->recv_buf_size;
979602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = tcp_tran_rr_request->no_delay;
979702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = tcp_tran_rr_request->so_rcvavoid;
979802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = tcp_tran_rr_request->so_sndavoid;
979902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
980002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
980102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
980202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(tcp_tran_rr_request->ipfamily),
980302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_tran_rr_request->port);
980402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
980502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
980602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
980702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
980802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(tcp_tran_rr_request->ipfamily),
980902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
981002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
981102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
981202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
981302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
981402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
981502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
981602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
981702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
981802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
981902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not create data socket\n");
982002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
982102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
982202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
982302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
982402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
982502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
982602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test timer can fire during operations on the listening socket,
982702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     so to make the start_timer below work we have to move
982802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     it to close s_listen while we are blocked on accept. */
982902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket2 = s_listen;
983002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
983102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
983202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
983302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's get an address assigned to this socket so we can tell the */
983402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator how to reach the data socket. There may be a desire to */
983502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nail this socket to a specific IP address in a multi-homed, */
983602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multi-connection situation, but for now, we'll ignore the issue */
983702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and concentrate on single connection testing. */
983802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
983902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (bind(s_listen,
984002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   (struct sockaddr *)&myaddr_in,
984102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   sizeof(myaddr_in)) == SOCKET_ERROR) {
984202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
984302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
984402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
984502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
984602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not bind\n");
984702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
984802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
984902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
985002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
985102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
985202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to disable the implicit PUSH on all sends. at some point, */
985302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this might want to be a parm to the test raj 3/95 */
985402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (setsockopt(s_listen,
985502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 IPPROTO_TCP,
985602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 TCP_NOPUSH,
985702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (const char *)&NoPush,
985802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 sizeof(int)) == SOCKET_ERROR) {
985902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
986002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_tran_rr: could not set TCP_NOPUSH errno %d\n",
986102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
986202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
986302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
986402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
986502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
986602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
986702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
986802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
986902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
987002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
987102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
987202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
987302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
987402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not listen\n");
987502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
987602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
987702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
987802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
987902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
988002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
988102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
988202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
988302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
988402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
988502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
988602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
988702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
988802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
988902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not geetsockname\n");
989002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
989102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
989202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
989302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
989402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
989502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
989602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
989702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
989802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
989902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
990002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
990102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"telling the remote to call me at %d\n",
990202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_tran_rr_response->data_port_number);
990302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
990402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
990502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
990602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
990702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
990802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
990902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
991002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
991102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
991202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
991302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response->cpu_rate = 0.0; 	/* assume no cpu */
991402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_tran_rr_request->measure_cpu) {
991502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_tran_rr_response->measure_cpu = 1;
991602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_tran_rr_response->cpu_rate =
991702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(tcp_tran_rr_request->cpu_rate);
991802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
991902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
992002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
992102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
992202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
992302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
992402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response->send_buf_size = lss_size;
992502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response->recv_buf_size = lsr_size;
992602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response->no_delay = loc_nodelay;
992702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response->so_rcvavoid = loc_rcvavoid;
992802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_response->so_sndavoid = loc_sndavoid;
992902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
993002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
993102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
993202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
993302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
993402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
993502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
993602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
993702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(tcp_tran_rr_request->measure_cpu);
993802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
993902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
994002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
994102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
994202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_tran_rr_request->test_length > 0) {
994302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
994402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
994502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(tcp_tran_rr_request->test_length + PAD_TIME);
994602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
994702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
994802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
994902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = tcp_tran_rr_request->test_length * -1;
995002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
995102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
995202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
995302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
995402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
995502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
995602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* accept a connection from the remote */
995702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((s_data=accept(s_listen,
995802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       (struct sockaddr *)&peeraddr_in,
995902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       &addrlen)) == INVALID_SOCKET) {
996002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
996102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the timer popped */
996202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
996302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
996402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
996502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_tcp_tran_rr: accept: errno = %d\n",errno);
996602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
996702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      close(s_listen);
996802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
996902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
997002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
997102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
997202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
997302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_tcp_tran_rr: accepted data connection.\n");
997402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
997502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
997602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
997702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
997802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is used so the timer thread can close the socket out from */
997902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* under us, which to date is the easiest/cleanest/least */
998002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Windows-specific way I can find to force the winsock calls to */
998102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return WSAEINTR with the test is over. anything that will run on */
998202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 95 and NT and is closer to what netperf expects from Unix signals */
998302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and such would be appreciated raj 1/96 */
998402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket = s_data;
998502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
998602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
998702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
998802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass */
998902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* attributes across an accept() call. Including this goes against */
999002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* my better judgement :( raj 11/95 */
999102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
999202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
999302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
999402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
999502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
999602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr	= recv_message_ptr;
999702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining	= tcp_tran_rr_request->request_size;
999802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
999902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the request from the other side. we can just receive */
1000002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* until we get zero bytes, but that would be a slight structure */
1000102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* change in the code, with minimal perfomance effects. If */
1000202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* however, I has variable-length messages, I would want to do */
1000302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this to avoid needing "double reads" - one for the message */
1000402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* length, and one for the rest of the message raj 3/95 */
1000502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(request_bytes_remaining > 0) {
1000602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((request_bytes_recvd=recv(s_data,
1000702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   temp_message_ptr,
1000802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   request_bytes_remaining,
1000902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   0)) == SOCKET_ERROR) {
1001002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if ( SOCKET_EINTR(request_bytes_recvd) )
1001102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		{
1001202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* the timer popped */
1001302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      timed_out = 1;
1001402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
1001502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
1001602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    netperf_response.content.serv_errno = errno;
1001702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    send_response();
1001802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
1001902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1002002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
1002102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_bytes_remaining -= request_bytes_recvd;
1002202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += request_bytes_recvd;
1002302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1002402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1002502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1002602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
1002702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
1002802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
1002902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"yo5\n");
1003002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1003102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1003202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1003302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1003402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote we can use sendto here to */
1003502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* help remind people that this is an rfc 1644 style of test */
1003602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((bytes_sent=sendto(s_data,
1003702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			  send_message_ptr,
1003802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			  tcp_tran_rr_request->response_size,
1003902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			  MSG_EOF,
1004002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			  (struct sockaddr *)&peeraddr_in,
1004102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			  sizeof(struct sockaddr_storage))) == SOCKET_ERROR) {
1004202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(bytes_sent)) {
1004302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
1004402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
1004502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo6\n");
1004602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
1004702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
1004802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1004902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 99;
1005002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
1005102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1005202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1005302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1005402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
1005502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
1005602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
1005702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1005802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1005902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1006002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1006102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_tcp_tran_rr: Transaction %d complete\n",
1006202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
1006302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1006402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1006502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1006602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* close the connection. since we have disable PUSH on sends, the */
1006702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* FIN should be tacked-onto our last send instead of being */
1006802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* standalone */
1006902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_data);
1007002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1007102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1007202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1007302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1007402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
1007502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
1007602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1007702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(tcp_tran_rr_request->measure_cpu,&elapsed_time);
1007802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1007902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
1008002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
1008102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
1008202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
1008302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
1008402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1008502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
1008602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1008702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1008802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1008902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_tran_rr: got %d transactions\n",
1009002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
1009102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1009202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1009302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1009402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_results->bytes_received	= (trans_received *
1009502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					   (tcp_tran_rr_request->request_size +
1009602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					    tcp_tran_rr_request->response_size));
1009702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_results->trans_received	= trans_received;
1009802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_tran_rr_results->elapsed_time	= elapsed_time;
1009902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_tran_rr_request->measure_cpu) {
1010002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_tran_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
1010102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1010202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1010302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1010402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1010502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_tran_rr: test complete, sending results.\n");
1010602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1010702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1010802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1010902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
1011002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1011102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
1011202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_1644 */
1011302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1011402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_NBRR
1011502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the sending (netperf) side of the TCP_RR */
1011602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test using POSIX-style non-blocking sockets. */
1011702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1011802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
1011902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_tcp_nbrr(char remote_host[])
1012002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
1012102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1012202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
1012302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
1012402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
1012502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
1012602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
1012702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1012802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
1012902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
1013002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1013102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
1013202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
1013302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
1013402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
1013502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1013602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
1013702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
1013802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
1013902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
1014002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
1014102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1014202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
1014302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
1014402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1014502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
1014602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f  %-6.2f %-6.2f %-6.3f  %-6.3f\n";
1014702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1014802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
1014902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
1015002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1015102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
1015202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
1015302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
1015402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
1015502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
1015602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1015702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1015802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
1015902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
1016002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1016102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
1016202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
1016302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
1016402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	send_socket;
1016502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
1016602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
1016702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1016802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
1016902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
1017002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1017102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
1017202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
1017302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1017402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
1017502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
1017602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
1017702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
1017802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
1017902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1018002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	hostent	        *hp;
1018102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_storage	server;
1018202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned      int             addr;
1018302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1018402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_request_struct	*tcp_rr_request;
1018502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_response_struct	*tcp_rr_response;
1018602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_results_struct	*tcp_rr_result;
1018702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1018802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
1018902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
1019002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1019102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_request =
1019202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_request_struct *)netperf_request.content.test_specific_data;
1019302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response=
1019402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_response_struct *)netperf_response.content.test_specific_data;
1019502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_result	=
1019602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_results_struct *)netperf_response.content.test_specific_data;
1019702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1019802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
1019902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
1020002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
1020102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1020202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
1020302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1020402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
1020502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
1020602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
1020702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
1020802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1020902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&server,
1021002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(server));
1021102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1021202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
1021302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
1021402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
1021502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
1021602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
1021702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
1021802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1021902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
1022002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP Non-Blocking REQUEST/RESPONSE TEST",local_res,remote_res);
1022102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1022202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1022302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
1022402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1022502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
1022602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = NULL;
1022702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
1022802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
1022902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1023002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
1023102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
1023202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
1023302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
1023402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
1023502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
1023602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1023702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
1023802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
1023902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1024002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
1024102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
1024202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1024302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages     = 0;
1024402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd     = 0.0;
1024502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up        = 0;
1024602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    timed_out       = 0;
1024702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
1024802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1024902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffers with the requested alignment and offset. */
1025002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since this is a request/response test, default the send_width and */
1025102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* recv_width to 1 and not two raj 7/94 */
1025202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1025302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 1;
1025402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) recv_width = 1;
1025502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1025602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
1025702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
1025802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       req_size,
1025902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
1026002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
1026102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1026202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1026302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
1026402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
1026502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       rsp_size,
1026602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
1026702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
1026802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1026902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1027002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
1027102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
1027202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1027302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
1027402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_nbrr: tcp stream data socket");
1027502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1027602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1027702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1027802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1027902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_tcp_nbrr: send_socket obtained...\n");
1028002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1028102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1028202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
1028302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
1028402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
1028502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
1028602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
1028702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back.*/
1028802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1028902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
1029002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
1029102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1029202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1029302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the socket */
1029402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* paramters on the other side at this point, hence the reason for */
1029502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the values being passed in the setup message. If the user did */
1029602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not specify any of the parameters, they will be passed as 0, which */
1029702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will indicate to the remote that no changes beyond the system's */
1029802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default should be used. Alignment is the exception, it will */
1029902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default to 8, which will be no alignment alterations. */
1030002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1030102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type	=	DO_TCP_NBRR;
1030202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->recv_buf_size	=	rsr_size_req;
1030302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->send_buf_size	=	rss_size_req;
1030402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->recv_alignment      =	remote_recv_align;
1030502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->recv_offset	        =	remote_recv_offset;
1030602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->send_alignment      =	remote_send_align;
1030702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->send_offset	        =	remote_send_offset;
1030802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->request_size	=	req_size;
1030902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->response_size	=	rsp_size;
1031002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->no_delay	        =	rem_nodelay;
1031102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->measure_cpu	        =	remote_cpu_usage;
1031202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->cpu_rate	        =	remote_cpu_rate;
1031302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->so_rcvavoid	        =	rem_rcvavoid;
1031402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_request->so_sndavoid	        =	rem_sndavoid;
1031502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
1031602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->test_length	=	test_time;
1031702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1031802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1031902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_rr_request->test_length	=	test_trans * -1;
1032002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1032102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1032202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
1032302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_tcp_nbrr: requesting TCP rr test\n");
1032402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1032502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1032602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
1032702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1032802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant 	*/
1032902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket parameters for this test type. We will put them back into */
1033002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the variables here so they can be displayed if desired.  The	*/
1033102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote will have calibrated CPU if necessary, and will have done	*/
1033202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the needed set-up we will have calibrated the cpu locally	*/
1033302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before sending the request, and will grab the counter value right*/
1033402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the connect returns. The remote will grab the counter right*/
1033502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the accept call. This saves the hassle of extra messages	*/
1033602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* being sent for the TCP tests.					*/
1033702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1033802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
1033902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1034002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
1034102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
1034202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote listen done.\n");
1034302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size          = tcp_rr_response->recv_buf_size;
1034402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size          = tcp_rr_response->send_buf_size;
1034502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay       = tcp_rr_response->no_delay;
1034602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage  = tcp_rr_response->measure_cpu;
1034702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate   = tcp_rr_response->cpu_rate;
1034802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* make sure that port numbers are in network order */
1034902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_port   = (unsigned short)tcp_rr_response->data_port_number;
1035002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_port   = htons(server.sin_port);
1035102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1035202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1035302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
1035402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1035502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
1035602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
1035702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
1035802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1035902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1036002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1036102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1036202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
1036302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
1036402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
1036502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET){
1036602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: data socket connect failed");
1036702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1036802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1036902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1037002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1037102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* now that we are connected, mark the socket as non-blocking */
1037202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!set_nonblock(send_socket)) {
1037302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: set_nonblock");
1037402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1037502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1037602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1037702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either the */
1037802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect would have failed, or the previous response would have */
1037902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indicated a problem. I failed to see the value of the extra */
1038002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* message after the accept on the remote. If it failed, we'll see it */
1038102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here. If it didn't, we might as well start pumping data. */
1038202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1038302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a request/response test, they */
1038402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can be either time or transaction based. */
1038502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1038602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
1038702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
1038802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
1038902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = 0;
1039002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
1039102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1039202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1039302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
1039402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = test_bytes;
1039502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
1039602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1039702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1039802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
1039902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
1040002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
1040102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1040202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
1040302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1040402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
1040502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
1040602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
1040702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1040802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
1040902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
1041002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
1041102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
1041202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. I think I */
1041302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* just arbitrarily decrement trans_remaining for the timed test, but */
1041402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will not do that just yet... One other question is whether or not */
1041502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the send buffer and the receive buffer should be the same buffer. */
1041602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1041702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (trans_remaining > 0)) {
1041802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send the request. we assume that if we use a blocking socket, */
1041902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the request will be sent at one shot. */
1042002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1042102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
1042202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
1042302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp just before our call to send, and then again just */
1042402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* after the receive raj 8/94 */
1042502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
1042602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1042702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
1042802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1042902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* even though this is a non-blocking socket, we will assume for */
1043002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the time being that we will be able to send an entire request */
1043102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* without getting an EAGAIN */
1043202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((len=send(send_socket,
1043302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   send_ring->buffer_ptr,
1043402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   req_size,
1043502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   0)) != req_size) {
1043602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (SOCKET_EINTR(len)) {
1043702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we hit the end of a */
1043802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* timed test. */
1043902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
1044002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
1044102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
1044202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("send_tcp_nbrr: data send error");
1044302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
1044402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1044502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
1044602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1044702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* receive the response. since we are using non-blocking I/O, we */
1044802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* will "spin" on the recvs */
1044902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_left = rsp_size;
1045002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_message_ptr  = recv_ring->buffer_ptr;
1045102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while(rsp_bytes_left > 0) {
1045202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if((rsp_bytes_recvd=recv(send_socket,
1045302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 temp_message_ptr,
1045402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 rsp_bytes_left,
1045502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 0)) == SOCKET_ERROR) {
1045602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if (SOCKET_EINTR(rsp_bytes_recvd))
1045702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
1045802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* We hit the end of a timed test. */
1045902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
1046002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
1046102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
1046202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32  // But what does WinNT indicate in this situation...
1046302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  else if (errno == EAGAIN) {
1046402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    Set_errno(0);
1046502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    continue;
1046602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
1046702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1046802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  else {
1046902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    perror("send_tcp_nbrr: data recv error");
1047002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
1047102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
1047202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
1047302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_bytes_left -= rsp_bytes_recvd;
1047402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += rsp_bytes_recvd;
1047502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1047602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
1047702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1047802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (timed_out) {
1047902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we may have been in a nested while loop - we need */
1048002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* another call to break. */
1048102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
1048202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1048302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1048402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
1048502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
1048602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
1048702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
1048802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1048902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
1049002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
1049102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
1049202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
1049302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1049402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
1049502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
1049602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
1049702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1049802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1049902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
1050002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((nummessages % 100) == 0) {
1050102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
1050202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "Transaction %d completed\n",
1050302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  nummessages);
1050402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
1050502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
1050602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1050702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1050802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1050902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* At this point we used to call shutdown on the data socket to be */
1051002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sure all the data was delivered, but this was not germane in a */
1051102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* request/response test, and it was causing the tests to "hang" when */
1051202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* they were being controlled by time. So, I have replaced this */
1051302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* shutdown call with a call to close that can be found later in the */
1051402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* procedure. */
1051502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1051602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
1051702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
1051802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1051902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
1052002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured? how long */
1052102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* did we really run? */
1052202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1052302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
1052402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated service demand and all those interesting things. If it */
1052502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wasn't supposed to care, it will return obvious values. */
1052602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1052702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
1052802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
1052902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
1053002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
1053102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1053202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1053302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
1053402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1053502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
1053602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
1053702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
1053802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1053902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1054002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1054102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1054202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1054302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our thruput was for the test. */
1054402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1054502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
1054602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= nummessages/elapsed_time;
1054702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1054802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
1054902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
1055002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
1055102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
1055202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
1055302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
1055402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
1055502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization = calc_cpu_util(0.0);
1055602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
1055702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
1055802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
1055902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand  = calc_service_demand((double) nummessages*1024,
1056002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
1056102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
1056202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0);
1056302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1056402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
1056502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
1056602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
1056702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1056802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1056902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
1057002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = tcp_rr_result->cpu_util;
1057102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
1057202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
1057302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
1057402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand = calc_service_demand((double) nummessages*1024,
1057502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
1057602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    remote_cpu_utilization,
1057702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    tcp_rr_result->num_cpus);
1057802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1057902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
1058002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
1058102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
1058202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1058302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1058402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1058502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1058602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
1058702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
1058802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
1058902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
1059002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
1059102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
1059202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1059302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1059402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
1059502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
1059602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
1059702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1059802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
1059902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
1060002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
1060102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
1060202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
1060302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
1060402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
1060502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1060602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1060702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
1060802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1060902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are now done with the socket, so close it */
1061002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
1061102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1061202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1061302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1061402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
1061502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
1061602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
1061702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
1061802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
1061902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
1062002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1062102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
1062202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
1062302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
1062402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
1062502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
1062602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
1062702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
1062802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
1062902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1063002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
1063102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
1063202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
1063302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
1063402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1063502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1063602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1063702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
1063802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
1063902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(tcp_rr_result->cpu_method);
1064002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1064102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
1064202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
1064302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
1064402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
1064502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
1064602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
1064702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
1064802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1064902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
1065002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
1065102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
1065202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
1065302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
1065402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1065502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1065602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
1065702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
1065802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
1065902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
1066002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
1066102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
1066202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
1066302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1066402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1066502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1066602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
1066702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
1066802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
1066902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
1067002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
1067102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
1067202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
1067302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
1067402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
1067502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
1067602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
1067702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1067802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
1067902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
1068002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
1068102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1068202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1068302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1068402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1068502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
1068602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1068702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
1068802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
1068902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1069002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
1069102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
1069202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1069302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
1069402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
1069502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
1069602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
1069702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1069802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1069902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1070002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
1070102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
1070202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
1070302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
1070402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
1070502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
1070602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
1070702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1070802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
1070902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
1071002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
1071102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1071202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1071302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1071402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1071502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1071602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
1071702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
1071802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
1071902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
1072002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
1072102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1072202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how to handle the verbose information in the presence of */
1072302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence intervals is yet to be determined... raj 11/94 */
1072402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
1072502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
1072602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
1072702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
1072802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
1072902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1073002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1073102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
1073202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
1073302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
1073402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
1073502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset);
1073602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1073702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
1073802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
1073902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1074002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
1074102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
1074202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1074302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1074402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1074502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
1074602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1074702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive (netserver) side of a TCP_RR */
1074802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test */
1074902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
1075002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_tcp_nbrr()
1075102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
1075202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1075302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
1075402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
1075502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1075602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in        myaddr_in,
1075702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  peeraddr_in;
1075802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,s_data;
1075902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
1076002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
1076102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
1076202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
1076302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
1076402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_recvd;
1076502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
1076602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
1076702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
1076802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1076902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
1077002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
1077102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
1077202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1077302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_request_struct	*tcp_rr_request;
1077402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_response_struct	*tcp_rr_response;
1077502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_rr_results_struct	*tcp_rr_results;
1077602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1077702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_request =
1077802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_request_struct *)netperf_request.content.test_specific_data;
1077902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response =
1078002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_response_struct *)netperf_response.content.test_specific_data;
1078102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results =
1078202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_rr_results_struct *)netperf_response.content.test_specific_data;
1078302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1078402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1078502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_tcp_nbrr: entered...\n");
1078602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1078702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1078802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1078902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
1079002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
1079102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
1079202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
1079302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
1079402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
1079502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
1079602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1079702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
1079802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
1079902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
1080002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
1080102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1080202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1080302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_nbrr: setting the response type...\n");
1080402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1080502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1080602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1080702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = TCP_RR_RESPONSE;
1080802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1080902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1081002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_nbrr: the response type is set...\n");
1081102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1081202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1081302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1081402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* allocate the recv and send rings with the requested alignments */
1081502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and offsets. raj 7/94 */
1081602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1081702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_nbrr: requested recv alignment of %d offset %d\n",
1081802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_rr_request->recv_alignment,
1081902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_rr_request->recv_offset);
1082002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_nbrr: requested send alignment of %d offset %d\n",
1082102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_rr_request->send_alignment,
1082202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_rr_request->send_offset);
1082302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1082402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1082502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1082602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at some point, these need to come to us from the remote system */
1082702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
1082802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
1082902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1083002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
1083102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->response_size,
1083202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->send_alignment,
1083302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->send_offset);
1083402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1083502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
1083602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->request_size,
1083702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->recv_alignment,
1083802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   tcp_rr_request->recv_offset);
1083902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1084002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1084102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
1084202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can put in OUR values !-) At some point, we may want to nail this */
1084302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket to a particular network-level address, but for now, */
1084402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* INADDR_ANY should be just fine. */
1084502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1084602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&myaddr_in,
1084702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(myaddr_in));
1084802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_family      = AF_INET;
1084902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_addr.s_addr = INADDR_ANY;
1085002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_port        = htons((unsigned short)tcp_rr_request->port);
1085102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1085202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
1085302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1085402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1085502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_nbrr: grabbing a socket...\n");
1085602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1085702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1085802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1085902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
1086002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
1086102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
1086202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
1086302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = tcp_rr_request->send_buf_size;
1086402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = tcp_rr_request->recv_buf_size;
1086502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = tcp_rr_request->no_delay;
1086602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = tcp_rr_request->so_rcvavoid;
1086702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = tcp_rr_request->so_sndavoid;
1086802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1086902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
1087002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
1087102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(tcp_rr_request->ipfamily),
1087202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_rr_request->port);
1087302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1087402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
1087502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
1087602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
1087702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(tcp_rr_request->ipfamily),
1087802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
1087902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
1088002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
1088102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1088202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
1088302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1088402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
1088502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
1088602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
1088702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1088802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1088902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1089002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1089102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's get an address assigned to this socket so we can tell the */
1089202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator how to reach the data socket. There may be a desire to */
1089302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nail this socket to a specific IP address in a multi-homed, */
1089402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multi-connection situation, but for now, we'll ignore the issue */
1089502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and concentrate on single connection testing. */
1089602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1089702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (bind(s_listen,
1089802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   (struct sockaddr *)&myaddr_in,
1089902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   sizeof(myaddr_in)) == SOCKET_ERROR) {
1090002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
1090102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
1090202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
1090302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1090402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1090502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1090602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1090702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
1090802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
1090902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
1091002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
1091102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
1091202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1091302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1091402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1091502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1091602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1091702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
1091802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
1091902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
1092002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in, &addrlen) == SOCKET_ERROR){
1092102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
1092202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
1092302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
1092402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1092502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1092602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1092702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1092802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
1092902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
1093002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
1093102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1093202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
1093302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
1093402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1093502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
1093602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
1093702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
1093802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
1093902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
1094002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1094102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->cpu_rate = 0.0; 	/* assume no cpu */
1094202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->measure_cpu = 0;
1094302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1094402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_rr_request->measure_cpu) {
1094502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_response->measure_cpu = 1;
1094602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_response->cpu_rate = calibrate_local_cpu(tcp_rr_request->cpu_rate);
1094702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1094802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1094902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1095002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
1095102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
1095202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->send_buf_size = lss_size;
1095302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->recv_buf_size = lsr_size;
1095402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->no_delay = loc_nodelay;
1095502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->so_rcvavoid = loc_rcvavoid;
1095602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->so_sndavoid = loc_sndavoid;
1095702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_response->test_length = tcp_rr_request->test_length;
1095802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
1095902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1096002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
1096102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1096202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data = accept(s_listen,
1096302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       (struct sockaddr *)&peeraddr_in,
1096402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       &addrlen)) == INVALID_SOCKET) {
1096502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
1096602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
1096702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1096802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1096902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1097002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1097102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_nbrr: accept completes on the data connection.\n");
1097202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1097302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1097402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1097502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
1097602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass */
1097702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* attributes across an accept() call. Including this goes against */
1097802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* my better judgement :( raj 11/95 */
1097902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1098002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
1098102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1098202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
1098302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1098402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now that we are connected, mark the socket as non-blocking */
1098502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!set_nonblock(s_data)) {
1098602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_data);
1098702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1098802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1098902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1099002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1099102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
1099202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
1099302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1099402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(tcp_rr_request->measure_cpu);
1099502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1099602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
1099702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is used so the timer thread can close the socket out from */
1099802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* under us, which to date is the easiest/cleanest/least */
1099902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Windows-specific way I can find to force the winsock calls to */
1100002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return WSAEINTR with the test is over. anything that will run on */
1100102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 95 and NT and is closer to what netperf expects from Unix signals */
1100202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and such would be appreciated raj 1/96 */
1100302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket = s_data;
1100402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
1100502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1100602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
1100702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
1100802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1100902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_rr_request->test_length > 0) {
1101002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
1101102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
1101202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(tcp_rr_request->test_length + PAD_TIME);
1101302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1101402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1101502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
1101602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = tcp_rr_request->test_length * -1;
1101702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1101802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1101902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
1102002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1102102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
1102202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr = recv_ring->buffer_ptr;
1102302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining	= tcp_rr_request->request_size;
1102402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(request_bytes_remaining > 0) {
1102502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((request_bytes_recvd=recv(s_data,
1102602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   temp_message_ptr,
1102702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   request_bytes_remaining,
1102802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   0)) == SOCKET_ERROR) {
1102902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if ( SOCKET_EINTR(request_bytes_recvd))
1103002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		{
1103102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* the timer popped */
1103202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      timed_out = 1;
1103302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
1103402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
1103502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32  // But what does WinNT indicate in this situation...
1103602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    else if (errno == EAGAIN) {
1103702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      Set_errno(0);
1103802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      if (times_up) {
1103902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	        timed_out = 1;
1104002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	        break;
1104102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  }
1104202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      continue;
1104302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
1104402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1104502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    else {
1104602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno = errno;
1104702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_response();
1104802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      exit(1);
1104902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
1105002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1105102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
1105202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_bytes_remaining -= request_bytes_recvd;
1105302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += request_bytes_recvd;
1105402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1105502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1105602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1105702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
1105802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1105902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
1106002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
1106102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
1106202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"yo5\n");
1106302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1106402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1106502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1106602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1106702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
1106802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((bytes_sent=send(s_data,
1106902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->buffer_ptr,
1107002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_rr_request->response_size,
1107102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			0)) == SOCKET_ERROR) {
1107202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(bytes_sent)) {
1107302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
1107402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
1107502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo6\n");
1107602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
1107702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
1107802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1107902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 992;
1108002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
1108102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1108202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1108302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1108402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
1108502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1108602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
1108702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
1108802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
1108902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1109002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1109102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1109202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1109302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
1109402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
1109502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1109602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(tcp_rr_request->measure_cpu,&elapsed_time);
1109702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1109802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  stop_timer();
1109902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1110002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
1110102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
1110202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
1110302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
1110402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
1110502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1110602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1110702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
1110802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1110902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1111002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1111102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_nbrr: got %d transactions\n",
1111202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
1111302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1111402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1111502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1111602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->bytes_received = (trans_received *
1111702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    (tcp_rr_request->request_size +
1111802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     tcp_rr_request->response_size));
1111902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->trans_received = trans_received;
1112002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->elapsed_time   = elapsed_time;
1112102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->cpu_method     = cpu_method;
1112202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_rr_results->num_cpus       = lib_num_loc_cpus;
1112302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_rr_request->measure_cpu) {
1112402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
1112502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1112602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1112702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1112802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1112902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_nbrr: test complete, sending results.\n");
1113002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1113102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1113202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1113302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are done with the socket, free it */
1113402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
1113502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1113602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
1113702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1113802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
1113902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1114002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_NBRR */
1114102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1114202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1114302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this test is intended to test the performance of establishing a */
1114402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* connection, and then closing it again. this test is of somewhat */
1114502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* arcane interest since no packets are exchanged between the */
1114602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* user-space processes, but it will show the raw overhead of */
1114702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* establishing a TCP connection. that service demand could then be */
1114802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* compared with the sum of the service demands of a TCP_CRR and */
1114902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* TCP_RR test - presumeably, they would all relate */
1115002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1115102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
1115202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_tcp_cc(char remote_host[])
1115302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
1115402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1115502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
1115602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
1115702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
1115802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
1115902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
1116002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1116102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
1116202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
1116302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1116402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
1116502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
1116602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
1116702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
1116802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1116902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
1117002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
1117102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
1117202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
1117302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %%      %%      us/Tr   us/Tr\n\n";
1117402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1117502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
1117602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f\n";
1117702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1117802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
1117902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f   %-6.2f %-6.2f %-6.3f  %-6.3f\n";
1118002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1118102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
1118202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
1118302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1118402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
1118502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
1118602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
1118702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
1118802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
1118902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1119002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1119102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
1119202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
1119302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1119402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	temp_message_ptr[1];
1119502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
1119602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	send_socket;
1119702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
1119802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
1119902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left = 1;
1120002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
1120102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1120202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
1120302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
1120402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
1120502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
1120602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
1120702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1120802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
1120902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
1121002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1121102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int                           myport;
1121202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int                           ret;
1121302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1121402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_cc_request_struct	*tcp_cc_request;
1121502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_cc_response_struct	*tcp_cc_response;
1121602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_cc_results_struct	*tcp_cc_result;
1121702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1121802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request =
1121902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_cc_request_struct *)netperf_request.content.test_specific_data;
1122002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response =
1122102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_cc_response_struct *)netperf_response.content.test_specific_data;
1122202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_result =
1122302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_cc_results_struct *)netperf_response.content.test_specific_data;
1122402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1122502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1122602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
1122702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
1122802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
1122902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1123002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
1123102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1123202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
1123302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
1123402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
1123502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
1123602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1123702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
1123802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
1123902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
1124002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
1124102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
1124202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
1124302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1124402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
1124502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("TCP Connect/Close TEST",local_res,remote_res);
1124602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1124702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1124802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
1124902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1125002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	=	0;
1125102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	=	0.0;
1125202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 	0;
1125302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1125402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since there are no data buffers in this test, we need no send or */
1125502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* recv rings */
1125602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1125702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1125802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_tcp_cc: send_socket obtained...\n");
1125902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1126002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1126102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user has requested cpu utilization measurements, we must */
1126202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate the cpu(s). We will perform this task within the tests */
1126302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* themselves. If the user has specified the cpu rate, then */
1126402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate_local_cpu will return rather quickly as it will have */
1126502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nothing to do. If local_cpu_rate is zero, then we will go through */
1126602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the "normal" calibration stuff and return the rate back.*/
1126702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1126802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage) {
1126902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
1127002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1127102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1127202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Tell the remote end to do a listen. The server alters the socket */
1127302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* paramters on the other side at this point, hence the reason for */
1127402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the values being passed in the setup message. If the user did */
1127502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not specify any of the parameters, they will be passed as 0, which */
1127602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will indicate to the remote that no changes beyond the system's */
1127702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default should be used. Alignment is the exception, it will */
1127802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default to 8, which will be no alignment alterations. */
1127902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1128002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.request_type	=	DO_TCP_CC;
1128102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->recv_buf_size	        =	rsr_size_req;
1128202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->send_buf_size	        =	rss_size_req;
1128302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->recv_alignment	=	remote_recv_align;
1128402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->recv_offset	        =	remote_recv_offset;
1128502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->send_alignment	=	remote_send_align;
1128602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->send_offset	        =	remote_send_offset;
1128702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->request_size	        =	req_size;
1128802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->response_size	        =	rsp_size;
1128902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->no_delay	        =	rem_nodelay;
1129002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->measure_cpu	        =	remote_cpu_usage;
1129102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->cpu_rate	        =	remote_cpu_rate;
1129202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->so_rcvavoid	=	rem_rcvavoid;
1129302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->so_sndavoid	=	rem_sndavoid;
1129402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
1129502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_cc_request->test_length	=	test_time;
1129602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1129702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1129802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_cc_request->test_length	=	test_trans * -1;
1129902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1130002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->port          = atoi(remote_data_port);
1130102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request->ipfamily  = af_to_nf(remote_res->ai_family);
1130202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1130302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
1130402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: send_tcp_cc: requesting TCP crr test\n");
1130502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1130602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1130702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_request();
1130802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1130902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The response from the remote will contain all of the relevant 	*/
1131002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket parameters for this test type. We will put them back into 	*/
1131102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the variables here so they can be displayed if desired.  The	*/
1131202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote will have calibrated CPU if necessary, and will have done	*/
1131302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the needed set-up we will have calibrated the cpu locally	*/
1131402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before sending the request, and will grab the counter value right	*/
1131502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the connect returns. The remote will grab the counter right	*/
1131602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the accept call. This saves the hassle of extra messages	*/
1131702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* being sent for the TCP tests.					*/
1131802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1131902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
1132002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1132102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
1132202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsr_size	=	tcp_cc_response->recv_buf_size;
1132302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rss_size	=	tcp_cc_response->send_buf_size;
1132402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rem_nodelay	=	tcp_cc_response->no_delay;
1132502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_usage=	tcp_cc_response->measure_cpu;
1132602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_rate = 	tcp_cc_response->cpu_rate;
1132702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* make sure that port numbers are in network order */
1132802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    set_port_number(remote_res,(unsigned short)tcp_cc_response->data_port_number);
1132902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1133002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1133102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote listen done.\n");
1133202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote port is %d\n",get_port_number(remote_res));
1133302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1133402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1133502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1133602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1133702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
1133802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1133902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: remote error %d",
1134002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    netperf_response.content.serv_errno);
1134102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("");
1134202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1134302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1134402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1134502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1134602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
1134702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  DEMO_RR_SETUP(100)
1134802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1134902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1135002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* pick a nice random spot between client_port_min and */
1135102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* client_port_max for our initial port number */
1135202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  srand(getpid());
1135302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (client_port_max - client_port_min) {
1135402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport = client_port_min +
1135502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (rand() % (client_port_max - client_port_min));
1135602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1135702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1135802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport = client_port_min;
1135902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1136002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* there will be a ++ before the first call to bind, so subtract one */
1136102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myport--;
1136202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1136302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Set-up the test end conditions. For a request/response test, they */
1136402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can be either time or transaction based. */
1136502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1136602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
1136702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to end the test after a period of time. */
1136802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
1136902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
1137002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(test_time);
1137102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1137202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1137302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester wanted to send a number of bytes. */
1137402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = test_bytes;
1137502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
1137602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1137702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1137802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The cpu_start routine will grab the current time and possibly */
1137902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* value of the idle counter for later use in measuring cpu */
1138002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* utilization and/or service demand and thruput. */
1138102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1138202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(local_cpu_usage);
1138302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1138402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
1138502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (demo_mode) {
1138602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_timestamp(demo_one_ptr);
1138702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1138802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1138902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1139002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We use an "OR" to control test execution. When the test is */
1139102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* controlled by time, the byte count check will always return false. */
1139202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* When the test is controlled by byte count, the time test will */
1139302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* always return false. When the test is finished, the whole */
1139402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* expression will go false and we will stop sending data. I think I */
1139502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just arbitrarily decrement trans_remaining for the timed test, but */
1139602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will not do that just yet... One other question is whether or not */
1139702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the send buffer and the receive buffer should be the same buffer. */
1139802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1139902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
1140002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1140102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
1140202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
1140302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before our call to create the socket, and then */
1140402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* again just after the receive raj 3/95 */
1140502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
1140602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1140702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
1140802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1140902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set up the data socket */
1141002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* newport: is this label really required any longer? */
1141102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* pick a new port number */
1141202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport++;
1141302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1141402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wrap the port number when we get to client_port_max. NOTE, some */
1141502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* broken TCP's might treat the port number as a signed 16 bit */
1141602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* quantity.  we aren't interested in testing such broken */
1141702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* implementations :) so we won't make sure that it is below 32767 */
1141802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* raj 8/94  */
1141902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (myport >= client_port_max) {
1142002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      myport = client_port_min;
1142102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1142202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1142302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we do not want to use the port number that the server is */
1142402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sitting at - this would cause us to fail in a loopback test. we */
1142502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* could just rely on the failure of the bind to get us past this, */
1142602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but I'm guessing that in this one case at least, it is much */
1142702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* faster, given that we *know* that port number is already in use */
1142802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* (or rather would be in a loopback test) */
1142902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1143002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (myport == get_port_number(remote_res)) myport++;
1143102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1143202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1143302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((nummessages % 100) == 0) {
1143402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	printf("port %d\n",myport);
1143502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1143602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1143702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    set_port_number(local_res, (unsigned short)myport);
1143802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
1143902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1144002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET) {
1144102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_tcp_cc: tcp stream data socket");
1144202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1144302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1144402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1144502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we used to have a call to bind() here, but that is being
1144602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       taken care of by create_data_socket(). raj 2005-02-08 */
1144702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1144802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Connect up to the remote port on the data socket  */
1144902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((ret = connect(send_socket,
1145002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       remote_res->ai_addr,
1145102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       remote_res->ai_addrlen)) == INVALID_SOCKET){
1145202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(ret))
1145302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
1145402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* we hit the end of a */
1145502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* timed test. */
1145602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
1145702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
1145802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1145902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: data socket connect failed");
1146002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("\tattempted to connect on socket %d to port %d",
1146102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     send_socket,
1146202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     get_port_number(remote_res));
1146302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf(" from port %u \n",get_port_number(local_res));
1146402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1146502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1146602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1146702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we hang in a recv() to get the remote's close indication */
1146802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1146902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsp_bytes_recvd=recv(send_socket,
1147002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 temp_message_ptr,
1147102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 rsp_bytes_left,
1147202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 0);
1147302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1147402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1147502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (rsp_bytes_recvd == 0) {
1147602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* connection close, call close. we assume that the requisite */
1147702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* number of bytes have been received */
1147802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1147902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
1148002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
1148102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
1148202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
1148302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1148402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
1148502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1148602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
1148702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_RR_INTERVAL(1)
1148802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1148902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1149002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
1149102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
1149202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
1149302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1149402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1149502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
1149602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
1149702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"Transaction %d completed on local port %u\n",
1149802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		nummessages,
1149902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		get_port_number(local_res));
1150002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
1150102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1150202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1150302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      close(send_socket);
1150402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1150502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1150602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1150702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it was less than zero - an error occured */
1150802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(rsp_bytes_recvd))
1150902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  {
1151002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* We hit the end of a timed test. */
1151102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
1151202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
1151302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
1151402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_tcp_cc: data recv error");
1151502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
1151602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1151702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1151802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1151902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1152002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1152102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this call will always give us the elapsed time for the test, and */
1152202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will also store-away the necessaries for cpu utilization */
1152302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1152402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being measured? */
1152502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how long did we really run? */
1152602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1152702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Get the statistics from the remote end. The remote will have */
1152802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculated service demand and all those interesting things. If it */
1152902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* wasn't supposed to care, it will return obvious values. */
1153002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1153102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
1153202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
1153302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
1153402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote results obtained\n");
1153502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1153602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1153702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
1153802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1153902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: remote error %d",
1154002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     netperf_response.content.serv_errno);
1154102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("");
1154202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1154302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1154402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1154502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1154602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1154702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now calculate what our thruput was for the test. In the future, */
1154802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we may want to include a calculation of the thruput measured by */
1154902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote, but it should be the case that for a TCP stream test, */
1155002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the two numbers should be *very* close... We calculate */
1155102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bytes_sent regardless of the way the test length was controlled. */
1155202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If it was time, we needed to, and if it was by bytes, the user may */
1155302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* have specified a number of bytes that wasn't a multiple of the */
1155402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_size, so we really didn't send what he asked for ;-) We use */
1155502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
1155602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 1024. A future enhancement *might* be to choose from a couple of */
1155702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* unit selections. */
1155802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1155902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
1156002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  thruput	= calc_thruput(bytes_xferd);
1156102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1156202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
1156302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We must now do a little math for service demand and cpu */
1156402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization for the system(s) */
1156502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Of course, some of the information might be bogus because */
1156602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was no idle counter in the kernel(s). We need to make */
1156702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a note of this for the user's benefit...*/
1156802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
1156902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_rate == 0.0) {
1157002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"WARNING WARNING WARNING  WARNING WARNING WARNING  WARNING!\n");
1157102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Local CPU usage numbers based on process information only!\n");
1157202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
1157302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1157402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization = calc_cpu_util(0.0);
1157502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
1157602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
1157702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
1157802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand  = calc_service_demand((double) nummessages*1024,
1157902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
1158002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
1158102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0);
1158202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1158302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1158402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
1158502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
1158602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1158702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1158802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (remote_cpu_usage) {
1158902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_rate == 0.0) {
1159002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"DANGER  DANGER  DANGER    DANGER  DANGER  DANGER    DANGER!\n");
1159102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Remote CPU usage numbers based on process information only!\n");
1159202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
1159302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1159402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = tcp_cc_result->cpu_util;
1159502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
1159602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
1159702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
1159802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand = calc_service_demand((double) nummessages*1024,
1159902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
1160002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  remote_cpu_utilization,
1160102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  tcp_cc_result->num_cpus);
1160202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1160302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1160402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
1160502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
1160602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1160702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1160802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
1160902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
1161002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
1161102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
1161202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
1161302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
1161402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
1161502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
1161602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1161702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
1161802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
1161902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
1162002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
1162102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
1162202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand);
1162302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1162402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
1162502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
1162602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
1162702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand);
1162802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1162902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1163002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
1163102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
1163202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1163302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
1163402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
1163502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
1163602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
1163702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
1163802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1163902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1164002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1164102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
1164202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
1164302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
1164402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
1164502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
1164602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
1164702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time,
1164802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
1164902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
1165002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
1165102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
1165202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1165302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
1165402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
1165502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
1165602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1165702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1165802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1165902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1166002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
1166102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
1166202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
1166302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1166402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
1166502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
1166602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1166702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
1166802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
1166902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
1167002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
1167102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1167202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1167302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1167402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
1167502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
1167602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
1167702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
1167802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
1167902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
1168002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
1168102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1168202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
1168302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
1168402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
1168502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1168602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1168702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1168802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1168902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1169002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
1169102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
1169202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
1169302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
1169402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
1169502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1169602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
1169702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
1169802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
1169902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
1170002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
1170102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1170202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1170302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
1170402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
1170502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
1170602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
1170702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset);
1170802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1170902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
1171002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
1171102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1171202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
1171302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
1171402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1171502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1171602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1171702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
1171802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1171902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1172002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
1172102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_tcp_cc()
1172202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
1172302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1172402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  *message;
1172502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1172602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
1172702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
1172802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
1172902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1173002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_storage        myaddr_in,  peeraddr_in;
1173102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,s_data;
1173202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
1173302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*recv_message_ptr;
1173402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*send_message_ptr;
1173502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
1173602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
1173702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
1173802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
1173902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1174002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_cc_request_struct	*tcp_cc_request;
1174102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_cc_response_struct	*tcp_cc_response;
1174202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	tcp_cc_results_struct	*tcp_cc_results;
1174302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1174402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_request =
1174502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_cc_request_struct *)netperf_request.content.test_specific_data;
1174602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response =
1174702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_cc_response_struct *)netperf_response.content.test_specific_data;
1174802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_results =
1174902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct tcp_cc_results_struct *)netperf_response.content.test_specific_data;
1175002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1175102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1175202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_tcp_cc: entered...\n");
1175302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1175402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1175502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1175602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
1175702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
1175802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
1175902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
1176002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
1176102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
1176202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
1176302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1176402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
1176502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
1176602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
1176702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
1176802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1176902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1177002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_cc: setting the response type...\n");
1177102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1177202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1177302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1177402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = TCP_CC_RESPONSE;
1177502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1177602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1177702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_cc: the response type is set...\n");
1177802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1177902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1178002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1178102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset */
1178202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(DATABUFFERLEN);
1178302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
1178402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", DATABUFFERLEN);
1178502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1178602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1178702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1178802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variables to be at the desired */
1178902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignments with the desired offsets. */
1179002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1179102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1179202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1179302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_cc: requested recv alignment of %d offset %d\n",
1179402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_cc_request->recv_alignment,
1179502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_cc_request->recv_offset);
1179602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1179702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_cc: requested send alignment of %d offset %d\n",
1179802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_cc_request->send_alignment,
1179902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_cc_request->send_offset);
1180002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1180102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1180202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1180302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = ALIGN_BUFFER(message, tcp_cc_request->recv_alignment, tcp_cc_request->recv_offset);
1180402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1180502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = ALIGN_BUFFER(message, tcp_cc_request->send_alignment, tcp_cc_request->send_offset);
1180602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1180702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1180802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_cc: receive alignment and offset set...\n");
1180902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1181002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1181102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1181202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
1181302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1181402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1181502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_tcp_cc: grabbing a socket...\n");
1181602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1181702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1181802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1181902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
1182002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
1182102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
1182202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
1182302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = tcp_cc_request->send_buf_size;
1182402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = tcp_cc_request->recv_buf_size;
1182502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = tcp_cc_request->no_delay;
1182602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = tcp_cc_request->so_rcvavoid;
1182702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = tcp_cc_request->so_sndavoid;
1182802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1182902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
1183002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
1183102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(tcp_cc_request->ipfamily),
1183202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			tcp_cc_request->port);
1183302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1183402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
1183502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
1183602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
1183702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(tcp_cc_request->ipfamily),
1183802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
1183902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
1184002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
1184102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1184202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
1184302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1184402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
1184502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
1184602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
1184702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1184802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not create data socket\n");
1184902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1185002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1185102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1185202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1185302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1185402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
1185502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test timer can fire during operations on the listening socket,
1185602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     so to make the start_timer below work we have to move
1185702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     it to close s_listen while we are blocked on accept. */
1185802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket2 = s_listen;
1185902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1186002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1186102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1186202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
1186302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
1186402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
1186502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
1186602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
1186702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1186802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not listen\n");
1186902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1187002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1187102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1187202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1187302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1187402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
1187502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
1187602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
1187702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
1187802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
1187902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
1188002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
1188102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
1188202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1188302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not geetsockname\n");
1188402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1188502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1188602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
1188702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1188802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1188902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
1189002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
1189102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
1189202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1189302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response->data_port_number =
1189402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(((struct sockaddr_in *)&myaddr_in)->sin_port);
1189502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1189602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"telling the remote to call me at %d\n",
1189702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_cc_response->data_port_number);
1189802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1189902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1190002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
1190102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1190202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
1190302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
1190402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
1190502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
1190602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
1190702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1190802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response->cpu_rate = (float)0.0; 	/* assume no cpu */
1190902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_cc_request->measure_cpu) {
1191002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_cc_response->measure_cpu = 1;
1191102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_cc_response->cpu_rate =
1191202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(tcp_cc_request->cpu_rate);
1191302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1191402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1191502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1191602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1191702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
1191802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
1191902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response->send_buf_size = lss_size;
1192002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response->recv_buf_size = lsr_size;
1192102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response->no_delay = loc_nodelay;
1192202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response->so_rcvavoid = loc_rcvavoid;
1192302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_response->so_sndavoid = loc_sndavoid;
1192402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1192502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
1192602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1192702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
1192802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1192902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
1193002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
1193102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1193202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(tcp_cc_request->measure_cpu);
1193302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1193402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
1193502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
1193602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1193702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_cc_request->test_length > 0) {
1193802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
1193902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
1194002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(tcp_cc_request->test_length + PAD_TIME);
1194102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1194202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
1194302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
1194402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = tcp_cc_request->test_length * -1;
1194502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1194602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1194702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
1194802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1194902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
1195002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
1195102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test timer will probably fire during this accept,
1195202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       so to make the start_timer above work we have to move
1195302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       it to close s_listen while we are blocked on accept. */
1195402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    win_kludge_socket = s_listen;
1195502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1195602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* accept a connection from the remote */
1195702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((s_data=accept(s_listen,
1195802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       (struct sockaddr *)&peeraddr_in,
1195902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       &addrlen)) == INVALID_SOCKET) {
1196002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
1196102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the timer popped */
1196202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
1196302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
1196402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1196502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_tcp_cc: accept: errno = %d\n",errno);
1196602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1196702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      close(s_listen);
1196802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1196902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1197002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1197102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1197202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
1197302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this is for those systems which *INCORRECTLY* fail to pass */
1197402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* attributes across an accept() call. Including this goes against */
1197502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* my better judgement :( raj 11/95 */
1197602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1197702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    kludge_socket_options(s_data);
1197802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1197902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
1198002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1198102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
1198202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is used so the timer thread can close the socket out from */
1198302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* under us, which to date is the easiest/cleanest/least */
1198402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Windows-specific way I can find to force the winsock calls to */
1198502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return WSAEINTR with the test is over. anything that will run on */
1198602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 95 and NT and is closer to what netperf expects from Unix signals */
1198702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and such would be appreciated raj 1/96 */
1198802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket = s_data;
1198902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
1199002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1199102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1199202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_tcp_cc: accepted data connection.\n");
1199302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1199402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1199502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1199602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1199702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* close the connection. the server will likely do a graceful */
1199802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* close of the connection, insuring that all data has arrived at */
1199902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the client. for this it will call shutdown(), and then recv() and */
1200002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* then close(). I'm reasonably confident that this is the */
1200102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* appropriate sequence of calls - I would like to hear of */
1200202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* examples in web servers to the contrary. raj 10/95*/
1200302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_data);
1200402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1200502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
1200602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
1200702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
1200802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1200902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1201002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
1201102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
1201202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_tcp_cc: Transaction %d complete\n",
1201302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
1201402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
1201502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1201602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1201702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1201802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1201902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1202002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
1202102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
1202202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1202302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(tcp_cc_request->measure_cpu,&elapsed_time);
1202402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1202502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
1202602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
1202702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
1202802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
1202902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
1203002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1203102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
1203202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1203302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1203402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1203502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_cc: got %d transactions\n",
1203602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
1203702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1203802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1203902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1204002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_results->bytes_received	= (trans_received *
1204102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					   (tcp_cc_request->request_size +
1204202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					    tcp_cc_request->response_size));
1204302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_results->trans_received	= trans_received;
1204402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tcp_cc_results->elapsed_time	= elapsed_time;
1204502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (tcp_cc_request->measure_cpu) {
1204602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    tcp_cc_results->cpu_util	= calc_cpu_util(elapsed_time);
1204702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1204802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1204902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1205002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
1205102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_tcp_cc: test complete, sending results.\n");
1205202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
1205302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1205402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1205502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
1205602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1205702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
1205802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1205902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
1206002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_sockets_usage()
1206102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
1206202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1206302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fwrite(sockets_usage, sizeof(char), strlen(sockets_usage), stdout);
1206402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(1);
1206502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1206602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
1206702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1206802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
1206902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectscan_sockets_args(int argc, char *argv[])
1207002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1207102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
1207202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1207302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define SOCKETS_ARGS "b:CDnNhH:L:m:M:p:P:r:s:S:T:Vw:W:z46"
1207402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1207502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  extern char	*optarg;	  /* pointer to option string	*/
1207602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1207702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int		c;
1207802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1207902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char
1208002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    arg1[BUFSIZ],  /* argument holders		*/
1208102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    arg2[BUFSIZ];
1208202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1208302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
1208402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int i;
1208502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("%s called with the following argument vector\n",
1208602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   __func__);
1208702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i< argc; i++) {
1208802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("%s ",argv[i]);
1208902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1209002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("\n");
1209102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1209202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1209302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strncpy(local_data_port,"0",sizeof(local_data_port));
1209402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strncpy(remote_data_port,"0",sizeof(remote_data_port));
1209502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1209602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Go through all the command line arguments and break them */
1209702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* out. For those options that take two parms, specifying only */
1209802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the first will set both to that value. Specifying only the */
1209902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* second will leave the first untouched. To change only the */
1210002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first, use the form "first," (see the routine break_args.. */
1210102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1210202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((c= getopt(argc, argv, SOCKETS_ARGS)) != EOF) {
1210302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (c) {
1210402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '?':
1210502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '4':
1210602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_data_family = AF_INET;
1210702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_data_family = AF_INET;
1210802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1210902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '6':
1211002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
1211102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_data_family = AF_INET6;
1211202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_data_family = AF_INET6;
1211302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
1211402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr,
1211502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "This netperf was not compiled on an IPv6 capable host!\n");
1211602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(stderr);
1211702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
1211802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1211902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1212002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'h':
1212102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      print_sockets_usage();
1212202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
1212302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'b':
1212402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
1212502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      first_burst_size = atoi(optarg);
1212602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* WANT_FIRST_BURST */
1212702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Initial request burst functionality not compiled-in!\n");
1212802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
1212902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1213002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'C':
1213102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef TCP_CORK
1213202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set TCP_CORK */
1213302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_tcpcork = 1;
1213402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_tcpcork = 1; /* however, at first, we ony have cork affect loc */
1213502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
1213602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("WARNING: TCP_CORK not available on this platform!\n");
1213702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_CORK */
1213802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1213902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'D':
1214002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the TCP nodelay flag */
1214102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_nodelay = 1;
1214202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay = 1;
1214302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1214402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'H':
1214502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args_explicit(optarg,arg1,arg2);
1214602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0]) {
1214702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure we leave room for the NULL termination boys and
1214802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   girls. raj 2005-02-82 */
1214902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_data_address = malloc(strlen(arg1)+1);
1215002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_address,arg1,strlen(arg1));
1215102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1215202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
1215302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_data_family = parse_address_family(arg2);
1215402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1215502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'L':
1215602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args_explicit(optarg,arg1,arg2);
1215702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0]) {
1215802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure we leave room for the NULL termination boys and
1215902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   girls. raj 2005-02-82 */
1216002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_data_address = malloc(strlen(arg1)+1);
1216102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(local_data_address,arg1,strlen(arg1));
1216202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1216302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
1216402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_data_family = parse_address_family(arg2);
1216502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1216602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 's':
1216702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set local socket sizes */
1216802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
1216902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
1217002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lss_size_req = convert(arg1);
1217102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
1217202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lsr_size_req = convert(arg2);
1217302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1217402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'S':
1217502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set remote socket sizes */
1217602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
1217702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
1217802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size_req = convert(arg1);
1217902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
1218002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size_req = convert(arg2);
1218102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1218202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'r':
1218302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the request/response sizes */
1218402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
1218502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
1218602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	req_size = convert(arg1);
1218702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
1218802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_size = convert(arg2);
1218902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1219002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'm':
1219102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the send size */
1219202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = convert(optarg);
1219302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1219402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'M':
1219502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the recv size */
1219602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = convert(optarg);
1219702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1219802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'n':
1219902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the local socket type*/
1220002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_connected = 1;
1220102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1220202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'N':
1220302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the remote socket type*/
1220402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_connected = 1;
1220502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1220602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'p':
1220702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the min and max port numbers for the TCP_CRR and TCP_TRR */
1220802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* tests. */
1220902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
1221002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
1221102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	client_port_min = atoi(arg1);
1221202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
1221302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	client_port_max = atoi(arg2);
1221402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1221502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'P':
1221602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the local and remote data port numbers for the tests to
1221702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 allow them to run through those blankety blank end-to-end
1221802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 breaking firewalls. raj 2004-06-15 */
1221902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
1222002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
1222102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(local_data_port,arg1,sizeof(local_data_port));
1222202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
1222302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_port,arg2,sizeof(remote_data_port));
1222402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1222502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 't':
1222602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the test name */
1222702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      strcpy(test_name,optarg);
1222802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1222902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'W':
1223002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the "width" of the user space data */
1223102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* buffer. This will be the number of */
1223202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send_size buffers malloc'd in the */
1223302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* *_STREAM test. It may be enhanced to set */
1223402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* both send and receive "widths" but for now */
1223502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it is just the sending *_STREAM. */
1223602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_width = convert(optarg);
1223702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1223802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'V' :
1223902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to do copy avoidance and will set */
1224002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it for everything, everywhere, if we really */
1224102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* can. of course, we don't know anything */
1224202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* about the remote... */
1224302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_SND_COPYAVOID
1224402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 1;
1224502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
1224602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 0;
1224702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Local send copy avoidance not available.\n");
1224802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1224902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_RCV_COPYAVOID
1225002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 1;
1225102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
1225202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 0;
1225302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Local recv copy avoidance not available.\n");
1225402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1225502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid = 1;
1225602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid = 1;
1225702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
1225802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
1225902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1226002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1226102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_FIRST_BURST)
1226202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_HISTOGRAM)
1226302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* if WANT_FIRST_BURST and WANT_HISTOGRAM are defined and the user
1226402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     indeed wants a non-zero first burst size, and we would emit a
1226502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     histogram, then we should emit a warning that the two are not
1226602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     compatible. raj 2006-01-31 */
1226702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((first_burst_size > 0) && (verbosity >= 2)) {
1226802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(stderr,
1226902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "WARNING! Histograms and first bursts are incompatible!\n");
1227002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(stderr);
1227102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1227202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1227302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1227402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1227502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we do not want to make remote_data_address non-NULL because if
1227602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     the user has not specified a remote adata address, we want to
1227702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     take it from the hostname in the -H global option. raj
1227802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     2005-02-08 */
1227902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1228002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* so, if there is to be no control connection, we want to have some
1228102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     different settings for a few things */
1228202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1228302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (no_control) {
1228402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1228502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (strcmp(remote_data_port,"0") == 0) {
1228602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we need to select either the discard port, echo port or
1228702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 chargen port dedepending on the test name. raj 2007-02-08 */
1228802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (strstr(test_name,"STREAM") ||
1228902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  strstr(test_name,"SENDFILE")) {
1229002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_port,"discard",sizeof(remote_data_port));
1229102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1229202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else if (strstr(test_name,"RR")) {
1229302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_port,"echo",sizeof(remote_data_port));
1229402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1229502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else if (strstr(test_name,"MAERTS")) {
1229602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_port,"chargen",sizeof(remote_data_port));
1229702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1229802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
1229902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	printf("No default port known for the %s test, please set one yourself\n",test_name);
1230002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(-1);
1230102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
1230202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1230302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_data_port[sizeof(remote_data_port) - 1] = '\0';
1230402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1230502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I go back and forth on whether these should become -1 or if
1230602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       they should become 0 for a no_control test. what do you think?
1230702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       raj 2006-02-08 */
1230802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1230902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rem_rcvavoid = -1;
1231002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rem_sndavoid = -1;
1231102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rss_size_req = -1;
1231202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsr_size_req = -1;
1231302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rem_nodelay = -1;
1231402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1231502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (strstr(test_name,"STREAM") ||
1231602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strstr(test_name,"SENDFILE")) {
1231702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = -1;
1231802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1231902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else if (strstr(test_name,"RR")) {
1232002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* I am however _certain_ that for a no control RR test the
1232102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 response size must equal the request size since 99 times out
1232202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 of ten we will be speaking to the echo service somewhere */
1232302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_size = req_size;
1232402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1232502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else if (strstr(test_name,"MAERTS")) {
1232602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = -1;
1232702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1232802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
1232902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("No default port known for the %s test, please set one yourself\n",test_name);
1233002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
1233102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
1233202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
1233302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
12334