102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_CONFIG_H
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <config.h>
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_XTI
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef lint
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar	nettest_xti_id[]="\
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)nettest_xti.c (c) Copyright 1995-2007 Hewlett-Packard Co. Version 2.4.3";
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DIRTY
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define WANT_HISTOGRAM
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define WANT_INTERVALS
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* lint */
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	nettest_xti.c						*/
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      the XTI args parsing routine...                         */
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      scan_xti_args()                                         */
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	the actual test routines...				*/
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_xti_tcp_stream()	perform a tcp stream test	*/
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_xti_tcp_stream()					*/
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_xti_tcp_rr()	perform a tcp request/response	*/
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_xti_tcp_rr()					*/
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      send_xti_tcp_conn_rr()  an RR test including connect    */
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      recv_xti_tcp_conn_rr()                                  */
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_xti_udp_stream()	perform a udp stream test	*/
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_xti_udp_stream()					*/
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_xti_udp_rr()	perform a udp request/response	*/
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_xti_udp_rr()					*/
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_CONFIG_H
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <config.h>
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <fcntl.h>
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/ipc.h>
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/socket.h>
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/in.h>
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netdb.h>
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <signal.h>
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* WIN32 */
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <process.h>
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <winsock2.h>
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <windows.h>
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <time.h>
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <malloc.h>
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* xti.h should be included *after* in.h because there are name */
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* conflicts!( Silly standards people... raj 2/95 fortuenately, the */
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* confilcts are on IP_TOP and IP_TTL, whcih netperf does not yet use */
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <xti.h>
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "nettest_xti.h"
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __sgi
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/time.h>
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __sgi */
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "hist.h"
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* these variables are specific to the XTI sockets tests. declare */
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* them static to make them global only to this file. */
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rss_size,		/* remote socket send buffer size	*/
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rsr_size,		/* remote socket recv buffer size	*/
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size,		/* local  socket send buffer size 	*/
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size,		/* local  socket recv buffer size 	*/
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  req_size = 1,		/* request size                   	*/
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rsp_size = 1,		/* response size			*/
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_size,		/* how big are individual sends		*/
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_size;		/* how big are individual receives	*/
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  int   confidence_iteration;
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  char  local_cpu_method;
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  char  remote_cpu_method;
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* different options for the xti				*/
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay,		/* don't/do use NODELAY	locally		*/
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_nodelay,		/* don't/do use NODELAY remotely	*/
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid,		/* avoid send copies locally		*/
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid,		/* avoid recv copies locally		*/
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_sndavoid,		/* avoid send copies remotely		*/
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_rcvavoid;		/* avoid recv_copies remotely		*/
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct t_info info_struct;
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_GETHRTIME
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecthrtime_t time_one;
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecthrtime_t time_two;
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval time_one;
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval time_two;
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* HAVE_GETHRTIME */
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic HIST time_hist;
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic char loc_xti_device[32] = "/dev/tcp";
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic char rem_xti_device[32] = "/dev/tcp";
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int  xti_flags = 0;
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar xti_usage[] = "\n\
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectUsage: netperf [global options] -- [test options] \n\
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectTCP/UDP XTI API Test Options:\n\
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -D [L][,R]        Set XTI_TCP_NODELAY locally and/or remotely (XTI_TCP_*)\n\
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -h                Display this text\n\
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -m bytes          Set the send size (XTI_TCP_STREAM, XTI_UDP_STREAM)\n\
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -M bytes          Set the recv size (XTI_TCP_STREAM, XTI_UDP_STREAM)\n\
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -r bytes          Set request size (XTI_TCP_RR, XTI_UDP_RR)\n\
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -R bytes          Set response size (XTI_TCP_RR, XTI_UDP_RR)\n\
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -s send[,recv]    Set local socket send/recv buffer sizes\n\
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -S send[,recv]    Set remote socket send/recv buffer sizes\n\
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -X dev[,dev]      Set the local/remote XTI device file name\n\
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectFor those options taking two parms, at least one must be specified;\n\
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectspecifying one value without a comma will set both parms to that\n\
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvalue, specifying a value with a leading comma will set just the second\n\
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectparm, a value with a trailing comma will set just the first. To set\n\
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecteach parm to unique values, specify both and separate them with a\n\
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcomma.\n";
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* This routine is intended to retrieve interesting aspects of tcp */
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for the data connection. at first, it attempts to retrieve the */
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* maximum segment size. later, it might be modified to retrieve */
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* other information, but it must be information that can be */
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* retrieved quickly as it is called during the timing of the test. */
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for that reason, a second routine may be created that can be */
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* called outside of the timing loop */
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_xti_info(socket, info_struct)
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int socket;
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     struct t_info *info_struct;
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* This routine will create a data (listen) socket with the apropriate */
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* options set and return it to the caller. this replaces all the */
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* duplicate code in each of the test routines and should help make */
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* things a little easier to understand. since this routine can be */
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* called by either the netperf or netserver programs, all output */
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* should be directed towards "where." family is generally AF_INET, */
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* and type will be either SOCK_STREAM or SOCK_DGRAM */
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSOCKET
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcreate_xti_endpoint(char *name)
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET temp_socket;
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_optmgmt *opt_req;  /* we request an option */
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_optmgmt *opt_ret;  /* it tells us what we got */
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we use this to pass-in BSD-like socket options through t_optmgmt. */
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it ends up being about as clear as mud. raj 2/95 */
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sock_option {
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct t_opthdr myopthdr;
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    long value;
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } *sock_option;
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"create_xti_endpoint: attempting to open %s\n",
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    name);
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*set up the data socket                        */
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_socket = t_open(name,O_RDWR,NULL);
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (temp_socket == INVALID_SOCKET){
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_xti_endpoint: t_open %s: errno %d t_errno %d\n",
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    name,
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_errno);
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"create_xti_endpoint: socket %d obtained...\n",temp_socket);
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* allocate what we need for option mgmt */
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((opt_req = (struct t_optmgmt *)t_alloc(temp_socket,T_OPTMGMT,T_ALL)) ==
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      NULL) {
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_xti_endpoint: t_alloc: opt_req errno %d\n",
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "create_xti_endpoint: opt_req->opt.buf %x maxlen %d len %d\n",
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    opt_req->opt.buf,
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    opt_req->opt.maxlen,
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    opt_req->opt.len);
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((opt_ret = (struct t_optmgmt *) t_alloc(temp_socket,T_OPTMGMT,T_ALL)) ==
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      NULL) {
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_xti_endpoint: t_alloc: opt_ret errno %d\n",
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "create_xti_endpoint: opt_ret->opt.buf %x maxlen %d len %d\n",
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    opt_ret->opt.buf,
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    opt_ret->opt.maxlen,
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    opt_ret->opt.len);
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Modify the local socket size. The reason we alter the send buffer */
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* size here rather than when the connection is made is to take care */
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of decreases in buffer size. Decreasing the window size after */
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* connection establishment is a TCP no-no. Also, by setting the */
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* buffer (window) size before the connection is established, we can */
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control the TCP MSS (segment size). The MSS is never more that 1/2 */
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the minimum receive buffer size at each half of the connection. */
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* This is why we are altering the receive buffer size on the sending */
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* size of a unidirectional transfer. If the user has not requested */
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the socket buffers be altered, we will try to find-out what */
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* their values are. If we cannot touch the socket buffer in any way, */
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we will set the values to -1 to indicate that.  */
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef XTI_SNDBUF
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lss_size > 0) {
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to "negotiate" the option */
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    opt_req->flags = T_NEGOTIATE;
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to accept the default, and know what it is. I assume */
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that when nothing has been changed, that T_CURRENT will return */
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the same as T_DEFAULT raj 3/95 */
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    opt_req->flags = T_CURRENT;
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the first part is for the netbuf that holds the option we want */
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to negotiate or check */
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the buffer of the netbuf points at the socket options structure */
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we assume that the t_alloc call allocated a buffer that started */
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on a proper alignment */
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option = (struct sock_option *)opt_req->opt.buf;
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and next, set the fields in the sock_option structure */
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option->myopthdr.level = XTI_GENERIC;
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option->myopthdr.name  = XTI_SNDBUF;
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option->myopthdr.len   = sizeof(struct t_opthdr) + sizeof(long);
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option->value        = lss_size;
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  opt_req->opt.len          = sizeof(struct t_opthdr) + sizeof(long);
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now, set-up the stuff to return the value in the end */
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we assume that the t_alloc call allocated a buffer that started */
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on a proper alignment */
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option = (struct sock_option *)opt_ret->opt.buf;
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* finally, call t_optmgmt. clear as mud. */
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_optmgmt(temp_socket,opt_req,opt_ret) == -1) {
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_xti_endpoint: XTI_SNDBUF option: t_errno %d\n",
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_errno);
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sock_option->myopthdr.status == T_SUCCESS) {
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lss_size = sock_option->value;
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"create_xti_endpoint: XTI_SNDBUF option status 0x%.4x",
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sock_option->myopthdr.status);
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," value %d\n",
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sock_option->value);
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lss_size = -1;
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lsr_size > 0) {
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to "negotiate" the option */
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    opt_req->flags = T_NEGOTIATE;
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to accept the default, and know what it is. I assume */
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that when nothing has been changed, that T_CURRENT will return */
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the same as T_DEFAULT raj 3/95 */
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    opt_req->flags = T_CURRENT;
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the first part is for the netbuf that holds the option we want */
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to negotiate or check */
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the buffer of the netbuf points at the socket options structure */
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we assume that the t_alloc call allocated a buffer that started */
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on a proper alignment */
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option = (struct sock_option *)opt_req->opt.buf;
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and next, set the fields in the sock_option structure */
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option->myopthdr.level = XTI_GENERIC;
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option->myopthdr.name  = XTI_RCVBUF;
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option->myopthdr.len   = sizeof(struct t_opthdr) + sizeof(long);
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option->value        = lsr_size;
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  opt_req->opt.len          = sizeof(struct t_opthdr) + sizeof(long);
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now, set-up the stuff to return the value in the end */
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we assume that the t_alloc call allocated a buffer that started */
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on a proper alignment */
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_option = (struct sock_option *)opt_ret->opt.buf;
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* finally, call t_optmgmt. clear as mud. */
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_optmgmt(temp_socket,opt_req,opt_ret) == -1) {
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_xti_endpoint: XTI_RCVBUF option: t_errno %d\n",
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_errno);
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size = sock_option->value;
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this needs code */
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: create_xti_endpoint: socket sizes determined...\n");
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                       send: %d recv: %d\n",
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    lss_size,lsr_size);
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* XTI_SNDBUF */
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size = -1;
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size = -1;
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* XTI_SNDBUF */
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now, we may wish to enable the copy avoidance features on the */
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local system. of course, this may not be possible... */
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (loc_rcvavoid) {
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_xti_endpoint: Could not enable receive copy avoidance");
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    loc_rcvavoid = 0;
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (loc_sndavoid) {
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: create_xti_endpoint: Could not enable send copy avoidance");
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    loc_sndavoid = 0;
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will see about setting the TCP_NODELAY flag on the local */
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket. We will only do this for those systems that actually */
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* support the option. If it fails, note the fact, but keep going. */
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user tries to enable TCP_NODELAY on a UDP socket, this */
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will cause an error to be displayed */
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef TCP_NODELAY
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((strcmp(test_name,"XTI_TCP_STREAM") == 0) ||
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (strcmp(test_name,"XTI_TCP_RR") == 0) ||
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (strcmp(test_name,"XTI_TCP_CRR") == 0)) {
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_nodelay) {
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to "negotiate" the option */
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      opt_req->flags = T_NEGOTIATE;
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to accept the default, and know what it is. I assume */
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* that when nothing has been changed, that T_CURRENT will return */
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the same as T_DEFAULT raj 3/95 */
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      opt_req->flags = T_CURRENT;
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the first part is for the netbuf that holds the option we want */
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to negotiate or check the buffer of the netbuf points at the */
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket options structure */
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we assume that the t_alloc call allocated a buffer that started */
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* on a proper alignment */
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sock_option = (struct sock_option *)opt_req->opt.buf;
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and next, set the fields in the sock_option structure */
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sock_option->myopthdr.level = INET_TCP;
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sock_option->myopthdr.name  = TCP_NODELAY;
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sock_option->myopthdr.len   = sizeof(struct t_opthdr) + sizeof(long);
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sock_option->value          = T_YES;
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    opt_req->opt.len          = sizeof(struct t_opthdr) + sizeof(long);
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* now, set-up the stuff to return the value in the end */
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we assume that the t_alloc call allocated a buffer that started */
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* on a proper alignment */
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sock_option = (struct sock_option *)opt_ret->opt.buf;
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* finally, call t_optmgmt. clear as mud. */
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_optmgmt(temp_socket,opt_req,opt_ret) == -1) {
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "create_xti_endpoint: TCP_NODELAY option: errno %d t_errno %d\n",
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno,
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      t_errno);
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    loc_nodelay = sock_option->value;
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* TCP_NODELAY */
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = 0;
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_NODELAY */
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(temp_socket);
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the TCP unidirectional data transfer test */
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* (a.k.a. stream) for the xti interface. It receives its */
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* parameters via global variables from the shell and writes its */
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* output to the standard output. */
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_xti_tcp_stream(char remote_host[])
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f   %7.2f   \n";
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f\n";
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Sends   %-8.8s Recvs\n\
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv             Send (avg)          Recv (avg)\n\
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt2 = "\n\
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int interval_count;
50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigset_t signal_set;
50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-size greater than our send window. this will insure that we */
50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	*message_int_ptr;
51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int len;
51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int nummessages;
51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET send_socket;
51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_remaining;
51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int tcp_mss = -1;  /* possibly uninitialized on printf far below */
52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can send > 32 bits worth of bytes */
52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) at some point, this should probably become a */
52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 64bit integral type, but those are not entirely common yet */
52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent;
52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* some addressing information */
53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	hostent	        *hp;
53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in	server;
53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned      int             addr;
53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_call server_call;
54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_stream_request_struct	*xti_tcp_stream_request;
54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_stream_response_struct	*xti_tcp_stream_response;
54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_stream_results_struct	*xti_tcp_stream_result;
54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_request  =
54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_stream_request_struct *)netperf_request.content.test_specific_data;
54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response =
54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_stream_response_struct *)netperf_response.content.test_specific_data;
54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_result   =
55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_stream_results_struct *)netperf_response.content.test_specific_data;
55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_hist = HIST_new();
55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
56002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&server,
56102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(server));
56202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
56302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would seem that while HP-UX will allow an IP address (as a */
56402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* string) in a call to gethostbyname, other, less enlightened */
56502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
56602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* order changed to check for IP address first. raj 7/96 */
56702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
56802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
56902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was not an IP address, try it as a name */
57002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((hp = gethostbyname(remote_host)) == NULL) {
57102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have no idea what it is */
57202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
57302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "establish_control: could not resolve the destination %s\n",
57402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_host);
57502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
57602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
57702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
57802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
57902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it was a valid remote_host */
58002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bcopy(hp->h_addr,
58102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (char *)&server.sin_addr,
58202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    hp->h_length);
58302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_family = hp->h_addrtype;
58402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
58502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
58602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
58702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was a valid IP address */
58802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_addr.s_addr = addr;
58902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_family = AF_INET;
59002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
59102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
59302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to have some additional, interesting information in */
59402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the headers. we know some of it here, but not all, so we will */
59502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* only print the test title here and will print the results */
59602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* titles after the test is finished */
59702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"XTI TCP STREAM TEST");
59802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," to %s", remote_host);
59902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
60002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
60102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      " : +/-%3.1f%% @ %2d%% conf.",
60202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      interval/0.02,
60302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      confidence_level);
60402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
60502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_nodelay || rem_nodelay) {
60602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where," : nodelay");
60702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
60802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_sndavoid ||
60902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	loc_rcvavoid ||
61002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_sndavoid ||
61102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_rcvavoid) {
61202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where," : copy avoidance");
61302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
61402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
61502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : histogram");
61602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
61702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
61802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : interval");
61902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
62002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
62102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : dirty data");
62202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
62302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n");
62402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
62502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
62602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
62702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
62802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
62902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
63102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
63202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
63302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
63402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
63502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
63602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
63802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
63902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
64102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
64202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages    =	0;
64402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent     =	0.0;
64502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 	0;
64602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
64802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_xti_endpoint(loc_xti_device);
64902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET) {
65102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_xti_tcp_stream: tcp stream data socket");
65202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
65302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
65402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
65602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_xti_tcp_stream: send_socket obtained...\n");
65702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
65802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it would seem that with XTI, there is no implicit bind on a */
66002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect, so we have to make a call to t_bind. this is not */
66102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* terribly convenient, but I suppose that "standard is better */
66202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* than better" :) raj 2/95 */
66302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_bind(send_socket, NULL, NULL) == SOCKET_ERROR) {
66502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      t_error("send_xti_tcp_stream: t_bind");
66602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
66702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
66802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have either retrieved the socket buffer sizes, */
67002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* or have tried to set them, so now, we may want to set the send */
67102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size based on that (because the user either did not use a -m */
67202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* option, or used one with an argument of 0). If the socket buffer */
67302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size is not available, we will set the send size to 4KB - no */
67402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular reason, just arbitrary... */
67502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_size == 0) {
67602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lss_size > 0) {
67702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = lss_size;
67802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
67902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
68002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = 4096;
68102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
68202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
68302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer ring with the requested alignment and offset. */
68502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* note also that we have allocated a quantity */
68602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of memory that is at least one send-size greater than our socket */
68702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffer size. We want to be sure that there are at least two */
68802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers allocated - this can be a bit of a problem when the */
68902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size is bigger than the socket size, so we must check... the */
69002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user may have wanted to explicitly set the "width" of our send */
69102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers, we should respect that wish... */
69202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) {
69402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_width = (lss_size/send_size) + 1;
69502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (send_width == 1) send_width++;
69602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
69702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
69902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* only allocate the send ring once. this is a networking test, */
70002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* not a memory allocation test. this way, we do not need a */
70102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* deallocate_buffer_ring() routine, and I don't feel like */
70202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* writing one anyway :) raj 11/94 */
70302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
70402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       send_size,
70502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
70602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
70702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
70802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
70902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
71002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
71102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
71202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
71302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
71402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. */
71502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
71702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
71802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
71902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the socket */
72102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* paramters on the other side at this point, hence the reason for */
72202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the values being passed in the setup message. If the user did */
72302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not specify any of the parameters, they will be passed as 0, which */
72402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will indicate to the remote that no changes beyond the system's */
72502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default should be used. Alignment is the exception, it will */
72602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default to 1, which will be no alignment alterations. */
72702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type          = DO_XTI_TCP_STREAM;
72902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->send_buf_size  = rss_size;
73002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->recv_buf_size  = rsr_size;
73102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->receive_size   = recv_size;
73202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->no_delay       = rem_nodelay;
73302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->recv_alignment = remote_recv_align;
73402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->recv_offset    = remote_recv_offset;
73502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->measure_cpu    = remote_cpu_usage;
73602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->cpu_rate       = remote_cpu_rate;
73702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
73802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      xti_tcp_stream_request->test_length  = test_time;
73902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
74002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
74102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      xti_tcp_stream_request->test_length  = test_bytes;
74202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
74302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->so_rcvavoid    = rem_rcvavoid;
74402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->so_sndavoid    = rem_sndavoid;
74502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(xti_tcp_stream_request->xti_device, rem_xti_device);
74702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
74902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
75002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ok - even on a DEC box, strings are strings. I didn't really want */
75102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to ntohl the words of a string. since I don't want to teach the */
75202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_ and recv_ _request and _response routines about the types, */
75302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
75402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* solution would be to use XDR, but I am still leary of being able */
75502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to find XDR libs on all platforms I want running netperf. raj */
75602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
75702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *charword;
75802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *initword;
75902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *lastword;
76002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
76102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      initword = (int *) xti_tcp_stream_request->xti_device;
76202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lastword = initword + ((strlen(rem_xti_device) + 3) / 4);
76302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
76402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (charword = initword;
76502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   charword < lastword;
76602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   charword++) {
76702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
76802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	*charword = ntohl(*charword);
76902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
77002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
77102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
77202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
77402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->dirty_count         = rem_dirty_count;
77502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_request->clean_count         = rem_clean_count;
77602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
77702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
78002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
78102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "netperf: send_xti_tcp_stream: requesting TCP stream test\n");
78202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
78302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
78402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
78502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
78602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant    */
78702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket parameters for this test type. We will put them back into */
78802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the variables here so they can be displayed if desired.  The     */
78902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote will have calibrated CPU if necessary, and will have done */
79002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the needed set-up we will have calibrated the cpu locally    */
79102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before sending the request, and will grab the counter value right*/
79202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the connect returns. The remote will grab the counter right*/
79302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the accept call. This saves the hassle of extra messages   */
79402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* being sent for the TCP tests.                                    */
79502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
79602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
79702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
79802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
79902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
80002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"remote listen done.\n");
80102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size         = xti_tcp_stream_response->recv_buf_size;
80202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size         = xti_tcp_stream_response->send_buf_size;
80302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay      = xti_tcp_stream_response->no_delay;
80402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage = xti_tcp_stream_response->measure_cpu;
80502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate  = xti_tcp_stream_response->cpu_rate;
80602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
80702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have to make sure that the server port number is in */
80802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* network order */
80902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_port   = (short)xti_tcp_stream_response->data_port_number;
81002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_port   = htons(server.sin_port);
81102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid      = xti_tcp_stream_response->so_rcvavoid;
81202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid      = xti_tcp_stream_response->so_sndavoid;
81302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
81402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
81502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
81602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: remote error");
81702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
81802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
81902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
82002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
82202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    memset (&server_call, 0, sizeof(server_call));
82302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server_call.addr.maxlen = sizeof(struct sockaddr_in);
82402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server_call.addr.len    = sizeof(struct sockaddr_in);
82502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server_call.addr.buf    = (char *)&server;
82602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_connect(send_socket,
82802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &server_call,
82902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  NULL) == INVALID_SOCKET){
83002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      t_error("netperf: send_xti_tcp_stream: data socket connect failed");
83102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf(" port: %d\n",ntohs(server.sin_port));
83202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
83302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
83402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
83502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either */
83602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the connect would have failed, or the previous response would */
83702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have indicated a problem. I failed to see the value of the */
83802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* extra  message after the accept on the remote. If it failed, */
83902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we'll see it here. If it didn't, we might as well start pumping */
84002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data. */
84102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a stream test, they can be */
84302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* either time or byte-count based. */
84402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
84602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
84702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
84802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = 0;
84902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in previous revisions, we had the same code repeated throught */
85002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* all the test suites. this was unnecessary, and meant more */
85102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* work for me when I wanted to switch to POSIX signals, so I */
85202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have abstracted this out into a routine in netlib.c. if you */
85302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* are experiencing signal problems, you might want to look */
85402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there. raj 11/94 */
85502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
85602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
85702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
85802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
85902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = test_bytes;
86002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
86102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
86202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
86402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
86502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
86602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
86802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
87002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) || (demo_mode)) {
87102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the */
87202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer, unless we are in demo_mode */
87302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate);
87402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
87502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst;
87602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */
87702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
87802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
87902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "send_xti_tcp_stream: unable to get sigmask errno %d\n",
88002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              errno);
88102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
88202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
88302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
88402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
88502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
88602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before we start, initialize a few variables */
88702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
88802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
88902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
89002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
89102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
89202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. */
89302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (bytes_remaining > 0)) {
89502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
89702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to dirty some number of consecutive integers in the buffer */
89802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we are about to send. we may also want to bring some number of */
89902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* them cleanly into the cache. The clean ones will follow any dirty */
90002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* ones into the cache. at some point, we might want to replace */
90102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the rand() call with something from a table to reduce our call */
90202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* overhead during the test, but it is not a high priority item. */
90302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      access_buffer(send_ring->buffer_ptr,
90402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_size,
90502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_dirty_count,
90602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_clean_count);
90702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
90802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
91002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before we go into send and then again just after */
91102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we come out raj 8/94 */
91202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
91302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
91402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
91502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((len=t_snd(send_socket,
91602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_ring->buffer_ptr,
91702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_size,
91802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    0)) != send_size) {
91902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if ((len >=0) || (errno == EINTR)) {
92002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          /* the test was interrupted, must be the end of test */
92102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          break;
92202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
92302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
92402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"send_xti_tcp_stream: t_snd: errno %d t_errno %d t_look 0x%.4x\n",
92502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno,
92602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_errno,
92702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_look(send_socket));
92802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
92902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit(1);
93002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
93102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
93302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp the exit from the send call and update the histogram */
93402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_two);
93502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_add(time_hist,delta_micro(&time_one,&time_two));
93602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
93702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
93902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
94002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        units_this_tick += send_size;
94102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
94202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter */
94302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to decide to sleep for a little bit */
94402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) {
94502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* call sigsuspend and wait for the interval timer to get us */
94602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* out */
94702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (debug) {
94802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          fprintf(where,"about to suspend\n");
94902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          fflush(where);
95002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
95102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (sigsuspend(&signal_set) == EFAULT) {
95202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          fprintf(where,
95302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                  "send_xti_tcp_stream: fault with signal set!\n");
95402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          fflush(where);
95502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          exit(1);
95602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
95702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        interval_count = interval_burst;
95802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
95902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
96002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
96202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...we may also want to wrap back to the "beginning" */
96302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* of the bufferspace, so we will mod the number of messages sent */
96402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by the send width, and use that to calculate the offset to add */
96502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to the base pointer. */
96602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
96702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
96802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (bytes_remaining) {
96902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        bytes_remaining -= send_size;
97002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
97102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
97202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test is over. Flush the buffers to the remote end. We do a */
97402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* graceful release to insure that all data has been taken by the */
97502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote. */
97602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but first, if the verbosity is greater than 1, find-out what */
97802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the TCP maximum segment_size was (if possible) */
97902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
98002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      tcp_mss = -1;
98102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      get_xti_info(send_socket,info_struct);
98202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
98302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_sndrel(send_socket) == -1) {
98502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      t_error("netperf: cannot shutdown tcp stream socket");
98602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
98702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
98802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* hang a t_rcvrel() off the socket to block until the remote has */
99002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* brought all the data up into the application. it will do a */
99102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* t_sedrel to cause a FIN to be sent our way. We will assume that */
99202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* any exit from the t_rcvrel() call is good... raj 2/95 */
99302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
99502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"about to hang a receive for graceful release.\n");
99602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
99702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
99802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    t_rcvrel(send_socket);
100002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
100202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
100302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);    /* was cpu being */
100502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                /* measured and how */
100602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                /* long did we really */
100702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                /* run? */
100802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
101002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated service demand and all those interesting things. If it */
101102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wasn't supposed to care, it will return obvious values. */
101202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
101402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
101502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
101602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"remote results obtained\n");
101702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
101802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
101902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
102002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: remote error");
102102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
102302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
102402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our thruput was for the test. In the future, */
102602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we may want to include a calculation of the thruput measured by */
102702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the remote, but it should be the case that for a TCP stream test, */
102802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that the two numbers should be *very* close... We calculate */
102902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* bytes_sent regardless of the way the test length was controlled. */
103002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If it was time, we needed to, and if it was by bytes, the user may */
103102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have specified a number of bytes that wasn't a multiple of the */
103202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size, so we really didn't send what he asked for ;-) */
103302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent  = xti_tcp_stream_result->bytes_received;
103502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput     = calc_thruput(bytes_sent);
103702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
103902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
104002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
104102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
104202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
104302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
104402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
104502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
104602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        local_cpu_utilization   = calc_cpu_util(0.0);
104702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        local_service_demand    = calc_service_demand(bytes_sent,
104802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                      0.0,
104902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                      0.0,
105002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
105102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
105202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
105302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        local_cpu_utilization   = -1.0;
105402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        local_service_demand    = -1.0;
105502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
105602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
105802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        remote_cpu_utilization  = xti_tcp_stream_result->cpu_util;
106002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        remote_service_demand   = calc_service_demand(bytes_sent,
106102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                      0.0,
106202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                      remote_cpu_utilization,
106302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      xti_tcp_stream_result->num_cpus);
106402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
106502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
106602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        remote_cpu_utilization = -1.0;
106702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        remote_service_demand  = -1.0;
106802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
106902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
107002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
107102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
107202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
107302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization  = -1.0;
107402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand   = -1.0;
107502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = -1.0;
107602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = -1.0;
107702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
107802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
107902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
108002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
108102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
108202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
108302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
108402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                         elapsed_time,
108502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                         thruput,
108602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                         local_cpu_utilization,
108702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                         remote_cpu_utilization,
108802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                         local_service_demand,
108902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                         remote_service_demand);
109002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
109302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
109402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have finished making all the runs that we */
109602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be making. so, we should extract what the calcuated values */
109702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are for all the confidence stuff. we could make the values */
109802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* global, but that seemed a little messy, and it did not seem worth */
109902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the mucking with header files. so, we create a routine much */
110002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* like calcualte_confidence, which just returns the mean values. */
110102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 11/94 */
110202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
110302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
110402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            &thruput,
110502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            &local_cpu_utilization,
110602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            &remote_cpu_utilization,
110702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            &local_service_demand,
110802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                            &remote_service_demand);
110902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
111102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
111202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
111302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
111402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
111502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
111602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
111702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
111802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
112002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
112102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
112202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
112302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
112402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
112502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
112702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
112802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(xti_tcp_stream_result->cpu_method);
112902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
113102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
113202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
113302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
113402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                cpu_fmt_0,
113502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                local_service_demand,
113602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
113702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
113802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
113902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
114002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
114102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
114202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
114302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
114402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
114502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
114602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
114702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
114802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
114902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
115002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
115102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
115202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
115302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
115402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
115502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
115602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
115702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,		        /* remote recvbuf size */
115802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
115902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
116002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
116102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		        /* what was the xfer rate */
116202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
116302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
116402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
116502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
116602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
116702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
116802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
116902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
117002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
117102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
117202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
117302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
117402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
117502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
117602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
117702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
117802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
117902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
118002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
118102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
118202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
118302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
118402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
118502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size, 		/* remote recvbuf size */
118602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size, 		/* local sendbuf size */
118702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
118802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
118902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);/* how fast did it go */
119002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
119102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
119202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
119302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
119402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
119502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
119602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
119702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
119802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
119902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
120102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
120202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
120302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
120402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
120502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this stuff needs to be worked-out in the presence of confidence */
120702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* intervals and multiple iterations of the test... raj 11/94 */
120802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
121002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
121102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
121202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
121302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
121402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
121502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
121602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
121702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
121802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
121902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
122002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
122102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)xti_tcp_stream_result->recv_calls,
122202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_stream_result->recv_calls);
122302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
122402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt2,
122502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    tcp_mss);
122602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
122702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
122802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n\nHistogram of time spent in send() call.\n");
122902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
123002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
123102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
123202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
123302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
123502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This is the server-side routine for the tcp stream test. It is */
123802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* implemented as one routine. I could break things-out somewhat, but */
123902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* didn't feel it was necessary. */
124002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
124202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_xti_tcp_stream()
124302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
124402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in myaddr_in, peeraddr_in;
124602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_bind      bind_req, bind_resp;
124702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_call      call_req;
124802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET       s_listen,s_data;
125002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int           addrlen;
125102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	        len;
125202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	receive_calls;
125302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	        elapsed_time;
125402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double        bytes_received;
125502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
125702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   *message_int_ptr;
125902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   i;
126002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_tcp_stream_request_struct	*xti_tcp_stream_request;
126202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_tcp_stream_response_struct	*xti_tcp_stream_response;
126302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_tcp_stream_results_struct	*xti_tcp_stream_results;
126402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_request	=
126602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_stream_request_struct *)netperf_request.content.test_specific_data;
126702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response	=
126802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_stream_response_struct *)netperf_response.content.test_specific_data;
126902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_results	=
127002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_stream_results_struct *)netperf_response.content.test_specific_data;
127102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
127302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_xti_tcp_stream: entered...\n");
127402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
127502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
127602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
127802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
127902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
128002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
128102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
128202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
128302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
128402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
128602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
128702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
128802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
128902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
129102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_stream: setting the response type...\n");
129202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
129302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
129402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = XTI_TCP_STREAM_RESPONSE;
129602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
129802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_stream: the response type is set...\n");
129902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
130002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
130102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
130302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
130402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
130602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_stream: requested alignment of %d\n",
130702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_stream_request->recv_alignment);
130802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
130902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
131002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
131202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can put in OUR values !-) At some point, we may want to nail this */
131302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket to a particular network-level address, but for now, */
131402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* INADDR_ANY should be just fine. */
131502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&myaddr_in,
131702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(myaddr_in));
131802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_family      = AF_INET;
131902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_addr.s_addr = INADDR_ANY;
132002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_port        = 0;
132102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
132302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
132502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_stream: grabbing a socket...\n");
132602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
132702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
132802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_xti_endpoint expects to find some things in the global */
133002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
133102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
133202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
133302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size = xti_tcp_stream_request->send_buf_size;
133402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size = xti_tcp_stream_request->recv_buf_size;
133502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = xti_tcp_stream_request->no_delay;
133602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = xti_tcp_stream_request->so_rcvavoid;
133702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = xti_tcp_stream_request->so_sndavoid;
133802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
134002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
134102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
134202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
134302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
134402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
134502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
134602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
134702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
134802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
134902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
135002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
135102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) xti_tcp_stream_request->xti_device;
135302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((xti_tcp_stream_request->dev_name_len + 3) / 4);
135402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
135602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
135702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
135802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = htonl(*charword);
136002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
136102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
136202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
136402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_xti_endpoint(xti_tcp_stream_request->xti_device);
136602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
136802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
136902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
137002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
137102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
137202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's get an address assigned to this socket so we can tell the */
137402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator how to reach the data socket. There may be a desire to */
137502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nail this socket to a specific IP address in a multi-homed, */
137602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multi-connection situation, but for now, we'll ignore the issue */
137702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and concentrate on single connection testing. */
137802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.maxlen = sizeof(struct sockaddr_in);
138002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.len    = sizeof(struct sockaddr_in);
138102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.buf    = (char *)&myaddr_in;
138202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.qlen        = 1;
138302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.maxlen = sizeof(struct sockaddr_in);
138502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.len    = sizeof(struct sockaddr_in);
138602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.buf    = (char *)&myaddr_in;
138702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.qlen        = 1;
138802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_bind(s_listen,
139002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &bind_req,
139102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &bind_resp) == SOCKET_ERROR) {
139202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = t_errno;
139302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
139402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
139502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
139702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
139802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
140002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
140102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: t_bind complete port %d\n",
140202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ntohs(myaddr_in.sin_port));
140302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
140402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
140502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what sort of sizes did we end-up with? */
140702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_stream_request->receive_size == 0) {
140802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lsr_size > 0) {
140902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = lsr_size;
141002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
141102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
141202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = 4096;
141302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
141402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
141502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
141602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_size = xti_tcp_stream_request->receive_size;
141702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
141802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to set-up our recv_ring in a manner analagous to what we */
142002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* do on the sending side. this is more for the sake of symmetry */
142102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* than for the needs of say copy avoidance, but it might also be */
142202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* more realistic - this way one could conceivably go with a */
142302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* double-buffering scheme when taking the data an putting it into */
142402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the filesystem or something like that. raj 7/94 */
142502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
142602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) {
142702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_width = (lsr_size/recv_size) + 1;
142802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 1) recv_width++;
142902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
143002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
143102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
143202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   recv_size,
143302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_tcp_stream_request->recv_alignment,
143402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_tcp_stream_request->recv_offset);
143502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
143602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
143702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_stream: recv alignment and offset set...\n");
143802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
143902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
144002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
144202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
144302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
144402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response->data_port_number =
144602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(myaddr_in.sin_port);
144702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
144802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
145002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
145102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
145202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
145302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
145402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
145502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response->cpu_rate = 0.0; 	/* assume no cpu */
145602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_stream_request->measure_cpu) {
145702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_response->measure_cpu = 1;
145802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_response->cpu_rate =
145902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(xti_tcp_stream_request->cpu_rate);
146002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
146102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
146202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_response->measure_cpu = 0;
146302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
146402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
146502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
146602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
146702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response->send_buf_size = lss_size;
146802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response->recv_buf_size = lsr_size;
146902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response->no_delay = loc_nodelay;
147002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response->so_rcvavoid = loc_rcvavoid;
147102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response->so_sndavoid = loc_sndavoid;
147202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_response->receive_size = recv_size;
147302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
147502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections. for xti, */
147702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the t_listen call is blocking by default - this is different */
147802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* semantics from BSD - probably has to do with being able to reject */
147902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* a call before an accept */
148002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.addr.maxlen = sizeof(struct sockaddr_in);
148102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.addr.len    = sizeof(struct sockaddr_in);
148202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.addr.buf    = (char *)&peeraddr_in;
148302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.opt.maxlen  = 0;
148402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.opt.len     = 0;
148502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.opt.buf     = NULL;
148602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.udata.maxlen= 0;
148702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.udata.len   = 0;
148802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.udata.buf   = 0;
148902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_listen(s_listen, &call_req) == -1) {
149102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
149202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: t_listen: errno %d t_errno %d\n",
149302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
149402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_errno);
149502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
149602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = t_errno;
149702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
149802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
149902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
150002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
150102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
150302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
150402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: t_listen complete t_look 0x%.4x\n",
150502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_look(s_listen));
150602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
150702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
150802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now just rubber stamp the thing. we want to use the same fd? so */
151002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we will just equate s_data with s_listen. this seems a little */
151102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* hokey to me, but then I'm a BSD biggot still. raj 2/95 */
151202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_data = s_listen;
151302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_accept(s_listen,
151402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       s_data,
151502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &call_req) == -1) {
151602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
151702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: t_accept: errno %d t_errno %d\n",
151802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
151902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_errno);
152002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
152102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
152202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
152302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
152402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
152602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
152702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: t_accept complete t_look 0x%.4x\n",
152802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_look(s_data));
152902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
153002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                     remote is %s port %d\n",
153102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    inet_ntoa(*(struct in_addr *)&peeraddr_in.sin_addr),
153202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ntohs(peeraddr_in.sin_port));
153302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
153402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
153502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
153702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
153802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(xti_tcp_stream_request->measure_cpu);
154002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
154102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a t_sndrel, which will */
154202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return T_LOOK error from the t_recv */
154302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
154402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
154502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to dirty some number of consecutive integers in the buffer */
154602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are about to recv. we may also want to bring some number of */
154702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* them cleanly into the cache. The clean ones will follow any dirty */
154802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ones into the cache. */
154902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  access_buffer(recv_ring->buffer_ptr,
155102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		recv_size,
155202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		xti_tcp_stream_request->dirty_count,
155302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		xti_tcp_stream_request->clean_count);
155402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
155602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_received = 0;
155802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  receive_calls  = 0;
155902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((len = t_rcv(s_data,
156102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      recv_ring->buffer_ptr,
156202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      recv_size,
156302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      &xti_flags)) != -1) {
156402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_received += len;
156502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    receive_calls++;
156602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* more to the next buffer in the recv_ring */
156802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
156902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
157102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  access_buffer(recv_ring->buffer_ptr,
157302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		recv_size,
157402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		xti_tcp_stream_request->dirty_count,
157502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		xti_tcp_stream_request->clean_count);
157602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
157802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
157902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_look(s_data) == T_ORDREL) {
158102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this is a normal exit path */
158202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
158302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
158402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_xti_tcp_stream: t_rcv T_ORDREL indicated\n");
158502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
158602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
158702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
158802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
158902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* something went wrong */
159002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
159102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: t_rcv: errno %d t_errno %d len %d",
159202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
159302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_errno,
159402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    len);
159502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
159602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    " t_look 0x%.4x",
159702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_look(s_data));
159802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
159902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = t_errno;
160002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
160102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
160202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
160302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* receive the release and let the initiator know that we have */
160502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* received all the data. raj 3/95 */
160602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_rcvrel(s_data) == -1) {
160802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
160902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
161002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
161102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
161202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
161302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
161402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
161502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: t_rcvrel complete\n");
161602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
161702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
161802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
161902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_sndrel(s_data) == -1) {
162002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
162102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
162202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
162302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
162402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
162602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
162702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: t_sndrel complete\n");
162802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
162902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
163002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(xti_tcp_stream_request->measure_cpu,&elapsed_time);
163202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
163402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
163602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
163702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: got %g bytes\n",
163802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
163902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
164002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: got %d recvs\n",
164102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
164202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
164302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
164402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_results->bytes_received	= bytes_received;
164602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_results->elapsed_time	= elapsed_time;
164702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_results->recv_calls	= receive_calls;
164802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_stream_request->measure_cpu) {
165002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_stream_results->cpu_util	= calc_cpu_util(0.0);
165102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
165202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
165402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
165502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_stream: test complete, sending results.\n");
165602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
165702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 bytes_received %g receive_calls %d\n",
165802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received,
165902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
166002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
166102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 len %d\n",
166202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    len);
166302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
166402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
166502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_stream_results->cpu_method = cpu_method;
166702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
166802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the socket */
167002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  t_close(s_data);
167102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
167302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the sending (netperf) side of the XTI_TCP_RR */
167602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test. */
167702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
167902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_xti_tcp_rr(char remote_host[])
168002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
168102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
168302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
168402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
168502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
168602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
168702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
168902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
169002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
169202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
169302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
169402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
169502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
169702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
169802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
169902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
170002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
170102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
170302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
170402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
170602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f  %-6.2f %-6.2f %-6.3f  %-6.3f\n";
170702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
170902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
171002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
171202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
171302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
171402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
171502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
171602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
171902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
172002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
172102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
172202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
172302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
172402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET send_socket;
172502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
172602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
172702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
172802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
172902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
173002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
173202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
173302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
173502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
173602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
173702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
173802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
173902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	hostent	        *hp;
174102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in	server;
174202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned      int             addr;
174302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_call server_call;
174502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_rr_request_struct	*xti_tcp_rr_request;
174702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_rr_response_struct	*xti_tcp_rr_response;
174802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_rr_results_struct	*xti_tcp_rr_result;
174902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
175002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
175102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	interval_count;
175202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigset_t signal_set;
175302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
175402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
175502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_request =
175602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_rr_request_struct *)netperf_request.content.test_specific_data;
175702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response=
175802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_rr_response_struct *)netperf_response.content.test_specific_data;
175902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_result	=
176002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_rr_results_struct *)netperf_response.content.test_specific_data;
176102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
176202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
176302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_hist = HIST_new();
176402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
176502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
176602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
176702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
176802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
176902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
177002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&server,
177202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(server));
177302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would seem that while HP-UX will allow an IP address (as a */
177502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* string) in a call to gethostbyname, other, less enlightened */
177602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
177702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* order changed to check for IP address first. raj 7/96 */
177802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
178002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was not an IP address, try it as a name */
178102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((hp = gethostbyname(remote_host)) == NULL) {
178202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have no idea what it is */
178302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
178402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "establish_control: could not resolve the destination %s\n",
178502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_host);
178602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
178702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
178802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
178902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
179002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it was a valid remote_host */
179102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bcopy(hp->h_addr,
179202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (char *)&server.sin_addr,
179302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    hp->h_length);
179402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_family = hp->h_addrtype;
179502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
179602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
179702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
179802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was a valid IP address */
179902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_addr.s_addr = addr;
180002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_family = AF_INET;
180102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
180202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
180402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"XTI TCP REQUEST/RESPONSE TEST");
180502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," to %s", remote_host);
180602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
180702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
180802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      " : +/-%3.1f%% @ %2d%% conf.",
180902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      interval/0.02,
181002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      confidence_level);
181102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
181202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_nodelay || rem_nodelay) {
181302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where," : nodelay");
181402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
181502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_sndavoid ||
181602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	loc_rcvavoid ||
181702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_sndavoid ||
181802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_rcvavoid) {
181902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where," : copy avoidance");
182002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
182102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
182202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : histogram");
182302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
182402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
182502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : interval");
182602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
182702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
182802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : dirty data");
182902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
183002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n");
183102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
183202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
183402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
183602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = NULL;
183702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
183802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
183902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
184102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
184202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
184302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
184402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
184502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
184602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
184802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
184902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
185002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
185102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
185202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
185302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages     = 0;
185402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd     = 0.0;
185502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up        = 0;
185602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    timed_out       = 0;
185702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
185802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
185902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffers with the requested alignment and offset. */
186002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since this is a request/response test, default the send_width and */
186102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* recv_width to 1 and not two raj 7/94 */
186202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
186302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 1;
186402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) recv_width = 1;
186502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
186602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
186702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
186802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       req_size,
186902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
187002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
187102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
187202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
187302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
187402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
187502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       rsp_size,
187602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
187702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
187802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
187902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
188002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
188102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_xti_endpoint(loc_xti_device);
188202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
188302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
188402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_xti_tcp_rr: tcp stream data socket");
188502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
188602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
188702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
188802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
188902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_xti_tcp_rr: send_socket obtained...\n");
189002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
189102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it would seem that with XTI, there is no implicit bind on a */
189302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect, so we have to make a call to t_bind. this is not */
189402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* terribly convenient, but I suppose that "standard is better */
189502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* than better" :) raj 2/95 */
189602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_bind(send_socket, NULL, NULL) == SOCKET_ERROR) {
189802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      t_error("send_xti_tcp_stream: t_bind");
189902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
190002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
190102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
190202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
190302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
190402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
190502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
190602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
190702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back.*/
190802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
190902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
191002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
191102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
191202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the socket */
191402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* paramters on the other side at this point, hence the reason for */
191502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the values being passed in the setup message. If the user did */
191602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not specify any of the parameters, they will be passed as 0, which */
191702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will indicate to the remote that no changes beyond the system's */
191802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default should be used. Alignment is the exception, it will */
191902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default to 8, which will be no alignment alterations. */
192002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
192102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type	=	DO_XTI_TCP_RR;
192202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->recv_buf_size	=	rsr_size;
192302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->send_buf_size	=	rss_size;
192402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->recv_alignment  =	remote_recv_align;
192502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->recv_offset	=	remote_recv_offset;
192602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->send_alignment  =	remote_send_align;
192702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->send_offset	=	remote_send_offset;
192802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->request_size	=	req_size;
192902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->response_size	=	rsp_size;
193002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->no_delay	=	rem_nodelay;
193102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->measure_cpu	=	remote_cpu_usage;
193202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->cpu_rate	=	remote_cpu_rate;
193302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->so_rcvavoid	=	rem_rcvavoid;
193402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_request->so_sndavoid	=	rem_sndavoid;
193502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
193602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      xti_tcp_rr_request->test_length	=	test_time;
193702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
193802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
193902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      xti_tcp_rr_request->test_length	=	test_trans * -1;
194002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
194102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(xti_tcp_rr_request->xti_device, rem_xti_device);
194302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
194502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ok - even on a DEC box, strings are strings. I didn't really want */
194702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to ntohl the words of a string. since I don't want to teach the */
194802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_ and recv_ _request and _response routines about the types, */
194902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
195002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* solution would be to use XDR, but I am still leary of being able */
195102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to find XDR libs on all platforms I want running netperf. raj */
195202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
195302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *charword;
195402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *initword;
195502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *lastword;
195602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      initword = (int *) xti_tcp_rr_request->xti_device;
195802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lastword = initword + ((strlen(rem_xti_device) + 3) / 4);
195902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (charword = initword;
196102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   charword < lastword;
196202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   charword++) {
196302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	*charword = ntohl(*charword);
196502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
196602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
196702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
196802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
197002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_xti_tcp_rr: requesting TCP rr test\n");
197102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
197202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
197402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant 	*/
197602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket parameters for this test type. We will put them back into */
197702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the variables here so they can be displayed if desired.  The	*/
197802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote will have calibrated CPU if necessary, and will have done	*/
197902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the needed set-up we will have calibrated the cpu locally	*/
198002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before sending the request, and will grab the counter value right*/
198102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the connect returns. The remote will grab the counter right*/
198202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the accept call. This saves the hassle of extra messages	*/
198302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* being sent for the TCP tests.					*/
198402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
198602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
198802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
198902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote listen done.\n");
199002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size          = xti_tcp_rr_response->recv_buf_size;
199102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size          = xti_tcp_rr_response->send_buf_size;
199202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay       = xti_tcp_rr_response->no_delay;
199302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage  = xti_tcp_rr_response->measure_cpu;
199402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate   = xti_tcp_rr_response->cpu_rate;
199502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* make sure that port numbers are in network order */
199602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_port   = (short)xti_tcp_rr_response->data_port_number;
199702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_port   = htons(server.sin_port);
199802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
199902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
200002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
200102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: remote error");
200202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
200402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
200502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
200702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    memset (&server_call, 0, sizeof(server_call));
200802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server_call.addr.maxlen = sizeof(struct sockaddr_in);
200902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server_call.addr.len    = sizeof(struct sockaddr_in);
201002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server_call.addr.buf    = (char *)&server;
201102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_connect(send_socket,
201302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &server_call,
201402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  NULL) == INVALID_SOCKET){
201502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      t_error("netperf: send_xti_tcp_rr: data socket connect failed");
201602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf(" port: %d\n",ntohs(server.sin_port));
201702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
201802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
201902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either the */
202102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect would have failed, or the previous response would have */
202202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indicated a problem. I failed to see the value of the extra */
202302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* message after the accept on the remote. If it failed, we'll see it */
202402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here. If it didn't, we might as well start pumping data. */
202502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a request/response test, they */
202702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can be either time or transaction based. */
202802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
203002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
203102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
203202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = 0;
203302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
203402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
203502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
203602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
203702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = test_bytes;
203802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
203902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
204002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
204102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
204202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
204302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
204402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
204502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
204602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
204702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
204802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) || (demo_mode)) {
204902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the */
205002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer, unless we are in demo_mode */
205102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate);
205202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
205302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst;
205402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */
205502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
205602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
205702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "send_xti_tcp_rr: unable to get sigmask errno %d\n",
205802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
205902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
206002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
206102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
206202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
206302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
206502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
206602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
206702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
206802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. I think I */
206902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* just arbitrarily decrement trans_remaining for the timed test, but */
207002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will not do that just yet... One other question is whether or not */
207102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the send buffer and the receive buffer should be the same buffer. */
207202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (trans_remaining > 0)) {
207402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send the request. we assume that if we use a blocking socket, */
207502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the request will be sent at one shot. */
207602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
207802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before our call to send, and then again just */
207902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* after the receive raj 8/94 */
208002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
208102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
208202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((len=t_snd(send_socket,
208402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_ring->buffer_ptr,
208502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    req_size,
208602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    0)) != req_size) {
208702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((errno == EINTR) || (errno == 0)) {
208802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we hit the end of a */
208902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* timed test. */
209002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
209102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
209202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
209302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
209402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"send_xti_tcp_rr: t_snd: errno %d t_errno %d t_look 0x%.4x\n",
209502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno,
209602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_errno,
209702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_look(send_socket));
209802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
209902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit(1);
210002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
210102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
210202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
210302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* receive the response */
210402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_left = rsp_size;
210502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_message_ptr  = recv_ring->buffer_ptr;
210602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while(rsp_bytes_left > 0) {
210702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if((rsp_bytes_recvd=t_rcv(send_socket,
210802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				  temp_message_ptr,
210902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				  rsp_bytes_left,
211002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				  &xti_flags)) == SOCKET_ERROR) {
211102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if (errno == EINTR) {
211202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* We hit the end of a timed test. */
211302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
211402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
211502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
211602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
211702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "send_xti_tcp_rr: t_rcv: errno %d t_errno %d t_look 0x%x\n",
211802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  errno,
211902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  t_errno,
212002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  t_look(send_socket));
212102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
212202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
212302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
212402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_bytes_left -= rsp_bytes_recvd;
212502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += rsp_bytes_recvd;
212602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
212702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
212802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (timed_out) {
213002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we may have been in a nested while loop - we need */
213102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* another call to break. */
213202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
213302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
213402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
213602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_two);
213702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_add(time_hist,delta_micro(&time_one,&time_two));
213802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
213902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
214002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
214102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	units_this_tick += 1;
214202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
214302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter */
214402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to decide to sleep for a little bit */
214502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) {
214602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* call sigsuspend and wait for the interval timer to get us */
214702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* out */
214802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
214902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"about to suspend\n");
215002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
215102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
215202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sigsuspend(&signal_set) == EFAULT) {
215302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
215402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "send_xti_udp_rr: fault with signal set!\n");
215502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
215602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
215702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
215802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	interval_count = interval_burst;
215902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
216002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
216102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
216202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
216302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
216402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
216502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
216602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
216702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
216802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((nummessages % 100) == 0) {
216902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
217002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "Transaction %d completed\n",
217102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  nummessages);
217202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
217302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
217402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
217502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
217602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
217702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
217802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
217902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
218002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
218202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured? how long */
218302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* did we really run? */
218402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
218602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated service demand and all those interesting things. If it */
218702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wasn't supposed to care, it will return obvious values. */
218802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
219002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
219102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
219202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
219302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
219402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
219502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
219602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: remote error");
219702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
219802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
219902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
220002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our thruput was for the test. */
220202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
220402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= nummessages/elapsed_time;
220502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
220702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
220802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
220902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
221002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
221102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
221202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
221302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization = calc_cpu_util(0.0);
221402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
221502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
221602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
221702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand  = calc_service_demand((double) nummessages*1024,
221802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
221902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
222002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0);
222102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
222202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
222302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= -1.0;
222402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= -1.0;
222502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
222602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
222802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = xti_tcp_rr_result->cpu_util;
222902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
223002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
223102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
223202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand = calc_service_demand((double) nummessages*1024,
223302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
223402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    remote_cpu_utilization,
223502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    xti_tcp_rr_result->num_cpus);
223602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
223702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
223802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = -1.0;
223902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = -1.0;
224002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
224102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
224202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
224302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
224402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
224502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
224602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= -1.0;
224702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= -1.0;
224802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = -1.0;
224902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = -1.0;
225002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
225102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
225302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
225402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
225502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
225702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
225802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
225902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
226002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
226102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
226202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
226302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
226602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are now done with the socket, so close it */
226802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    t_close(send_socket);
226902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
227102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
227302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
227402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
227502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
227602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
227702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
227802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
228002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
228102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
228202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
228302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
228402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
228502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
228602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
228702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
228902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
229002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
229102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
229202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
229302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
229402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
229602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
229702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(xti_tcp_rr_result->cpu_method);
229802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
230002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
230102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
230202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
230302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
230402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
230502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
230602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
230702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
230802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
230902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
231002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
231102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
231202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
231302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
231402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
231502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
231602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
231702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
231802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
231902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
232002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
232102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
232202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
232402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
232502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
232602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
232702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
232802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
232902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
233002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
233102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
233202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
233302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
233402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
233502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
233602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
233702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
233802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
233902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
234002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
234102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
234202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
234302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
234402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
234602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
234702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
234802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
234902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
235002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
235102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
235202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
235302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
235402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
235502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
235602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
235802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
235902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
236002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
236102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
236202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
236302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
236402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
236502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
236602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
236702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
236802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
236902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
237102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
237202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
237302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
237502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
237602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
237702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
237802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
237902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how to handle the verbose information in the presence of */
238102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence intervals is yet to be determined... raj 11/94 */
238202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
238302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
238402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
238502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
238602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
238702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
238902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
239002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
239102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
239202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
239302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset);
239402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
239502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
239602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
239702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
239802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
239902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
240002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
240202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
240402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
240602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_xti_udp_stream(char remote_host[])
240702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
240802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /**********************************************************************/
240902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*									*/
241002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*               	UDP Unidirectional Send Test                    */
241102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*									*/
241202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /**********************************************************************/
241302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
241402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket  Message  Elapsed      Messages                \n\
241502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize    Size     Time         Okay Errors   Throughput\n\
241602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes   bytes    secs            #      #   %s/sec\n\n";
241702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
241902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
242002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 = "\
242202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d  %6d   %-7.2f   %7d %6d    %7.2f\n\
242302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d           %-7.2f   %7d           %7.2f\n\n";
242402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
242702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket  Message  Elapsed      Messages                   CPU      Service\n\
242802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize    Size     Time         Okay Errors   Throughput   Util     Demand\n\
242902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes   bytes    secs            #      #   %s/sec %% %c%c     us/KB\n\n";
243002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
243202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.2f %c\n";
243302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 = "\
243502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d  %6d   %-7.2f   %7d %6d    %7.1f     %-6.2f   %-6.3f\n\
243602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d           %-7.2f   %7d           %7.1f     %-6.2f   %-6.3f\n\n";
243702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	messages_recvd;
243902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int 	messages_sent;
244002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	failed_sends;
244102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time,
244302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        recv_elapsed,
244402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        local_cpu_utilization,
244502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        remote_cpu_utilization;
244602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	 local_service_demand, remote_service_demand;
244802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double local_thruput, remote_thruput;
244902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double bytes_sent;
245002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double bytes_recvd;
245102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
245402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	*message_int_ptr;
245502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
245602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET data_socket;
245702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int sum_messages_sent;
245902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int sum_messages_recvd;
246002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int sum_failed_sends;
246102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double sum_local_thruput;
246202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
246302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
246402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	interval_count;
246502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigset_t signal_set;
246602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
246702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
246802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct   hostent     *hp;
246902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct   sockaddr_in server;
247002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int         addr;
247102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_unitdata unitdata;
247302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_udp_stream_request_struct	*xti_udp_stream_request;
247502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_udp_stream_response_struct	*xti_udp_stream_response;
247602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_udp_stream_results_struct	*xti_udp_stream_results;
247702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_request  =
247902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_stream_request_struct *)netperf_request.content.test_specific_data;
248002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response =
248102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_stream_response_struct *)netperf_response.content.test_specific_data;
248202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_results  =
248302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_stream_results_struct *)netperf_response.content.test_specific_data;
248402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
248502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
248602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_hist = HIST_new();
248702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
248802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
248902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
249002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
249102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
249202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
249302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&server,
249502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(server));
249602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would seem that while HP-UX will allow an IP address (as a */
249802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* string) in a call to gethostbyname, other, less enlightened */
249902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
250002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* order changed to check for IP address first. raj 7/96 */
250102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
250302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was not an IP address, try it as a name */
250402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((hp = gethostbyname(remote_host)) == NULL) {
250502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have no idea what it is */
250602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
250702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "establish_control: could not resolve the destination %s\n",
250802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_host);
250902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
251002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
251102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
251202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
251302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it was a valid remote_host */
251402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bcopy(hp->h_addr,
251502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (char *)&server.sin_addr,
251602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    hp->h_length);
251702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_family = hp->h_addrtype;
251802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
251902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
252002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
252102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was a valid IP address */
252202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_addr.s_addr = addr;
252302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_family = AF_INET;
252402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
252502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
252602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
252702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"UDP UNIDIRECTIONAL SEND TEST");
252802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," to %s", remote_host);
252902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
253002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
253102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      " : +/-%3.1f%% @ %2d%% conf.",
253202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      interval/0.02,
253302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      confidence_level);
253402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
253502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_sndavoid ||
253602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	loc_rcvavoid ||
253702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_sndavoid ||
253802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_rcvavoid) {
253902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where," : copy avoidance");
254002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
254102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
254202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : histogram");
254302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
254402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
254502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : interval");
254602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
254702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
254802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : dirty data");
254902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
255002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n");
255102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
255202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring            = NULL;
255402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
255502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
255602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_messages_sent    = 0;
255702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_messages_recvd   = 0;
255802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_failed_sends     = 0;
255902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sum_local_thruput    = 0.0;
256002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
256102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
256202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
256302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
256402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
256502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
256602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
256702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
256802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
256902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
257002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
257202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
257302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_sent  = 0;
257402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_recvd = 0;
257502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    failed_sends   = 0;
257602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 0;
257702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket			*/
257902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_socket = create_xti_endpoint(loc_xti_device);
258002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
258102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (data_socket == INVALID_SOCKET) {
258202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_xti_udp_stream: create_xti_endpoint");
258302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
258402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
258502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
258602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_bind(data_socket, NULL, NULL) == SOCKET_ERROR) {
258702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      t_error("send_xti_udp_stream: t_bind");
258802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
258902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
259002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
259102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* now, we want to see if we need to set the send_size */
259202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_size == 0) {
259302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lss_size > 0) {
259402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = lss_size;
259502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
259602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
259702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = 4096;
259802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
259902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
260002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer with the requested alignment and offset, */
260202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* most of the numbers here are just a hack to pick something nice */
260302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and big in an attempt to never try to send a buffer a second time */
260402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before it leaves the node...unless the user set the width */
260502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* explicitly. */
260602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 32;
260702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL ) {
260902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
261002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       send_size,
261102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
261202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
261302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
261402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
261502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
261602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if the user supplied a cpu rate, this call will complete rather */
261702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* quickly, otherwise, the cpu rate will be retured to us for */
261802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* possible display. The Library will keep it's own copy of this data */
261902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* for use elsewhere. We will only display it. (Does that make it */
262002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "opaque" to us?) */
262102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage)
262302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
262402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to set up the data connection. The server */
262602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sends back the port number and alters the socket parameters there. */
262702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Of course this is a datagram service so no connection is actually */
262802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set up, the server just sets up the socket and binds it. */
262902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type      = DO_XTI_UDP_STREAM;
263102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->recv_buf_size  = rsr_size;
263202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->message_size   = send_size;
263302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->recv_alignment = remote_recv_align;
263402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->recv_offset    = remote_recv_offset;
263502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->measure_cpu    = remote_cpu_usage;
263602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->cpu_rate       = remote_cpu_rate;
263702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->test_length    = test_time;
263802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->so_rcvavoid    = rem_rcvavoid;
263902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->so_sndavoid    = rem_sndavoid;
264002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(xti_udp_stream_request->xti_device, rem_xti_device);
264202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
264402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ok - even on a DEC box, strings are strings. I didn't really want */
264602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to ntohl the words of a string. since I don't want to teach the */
264702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_ and recv_ _request and _response routines about the types, */
264802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
264902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* solution would be to use XDR, but I am still leary of being able */
265002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to find XDR libs on all platforms I want running netperf. raj */
265102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
265202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *charword;
265302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *initword;
265402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *lastword;
265502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
265602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      initword = (int *) xti_udp_stream_request->xti_device;
265702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lastword = initword + ((strlen(rem_xti_device) + 3) / 4);
265802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
265902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (charword = initword;
266002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   charword < lastword;
266102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   charword++) {
266202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	*charword = ntohl(*charword);
266402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
266502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
266602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
266702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
266902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
267002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
267102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
267202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
267302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
267402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"send_xti_udp_stream: remote data connection done.\n");
267502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
267602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
267702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
267802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_xti_udp_stream: error on remote");
267902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
268002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
268102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
268202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Place the port number returned by the remote into the sockaddr */
268302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* structure so our sends can be sent to the correct place. Also get */
268402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* some of the returned socket buffer information for user display. */
268502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
268602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* make sure that port numbers are in the proper order */
268702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_port = (short)xti_udp_stream_response->data_port_number;
268802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_port = htons(server.sin_port);
268902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsr_size        = xti_udp_stream_response->recv_buf_size;
269002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rss_size        = xti_udp_stream_response->send_buf_size;
269102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_rate = xti_udp_stream_response->cpu_rate;
269202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it would seem that XTI does not allow the expedient of */
269402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "connecting" a UDP end-point the way BSD does. so, we will do */
269502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* everything with t_sndudata and t_rcvudata. Our "virtual" */
269602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect here will be to assign the destination portion of the */
269702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* t_unitdata struct here, where we would have otherwise called */
269802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* t_connect() raj 3/95 */
269902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    memset (&unitdata, 0, sizeof(unitdata));
270102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.addr.maxlen = sizeof(struct sockaddr_in);
270202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.addr.len    = sizeof(struct sockaddr_in);
270302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.addr.buf    = (char *)&server;
270402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we don't use any options, so might as well set that part here */
270602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* too */
270702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.opt.maxlen = 0;
270902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.opt.len    = 0;
271002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.opt.buf    = NULL;
271102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we need to initialize the send buffer for the first time as */
271302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* well since we move to the next pointer after the send call. */
271402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.udata.maxlen = send_size;
271602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.udata.len    = send_size;
271702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.udata.buf    = send_ring->buffer_ptr;
271802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set up the timer to call us after test_time. one of these days, */
272002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it might be nice to figure-out a nice reliable way to have the */
272102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* test controlled by a byte count as well, but since UDP is not */
272202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* reliable, that could prove difficult. so, in the meantime, we */
272302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* only allow a XTI_UDP_STREAM test to be a timed test. */
272402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
272502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
272602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
272702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
272802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
272902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
273002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"Sorry, XTI_UDP_STREAM tests must be timed.\n");
273102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
273202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
273302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
273402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the start count for the idle counter and the start time */
273602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
273802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
274002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) || (demo_mode)) {
274102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the */
274202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer, unless we are in demo_mode */
274302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate);
274402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
274502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst;
274602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */
274702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
274802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
274902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "send_xti_udp_stream: unable to get sigmask errno %d\n",
275002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
275102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
275202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
275302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
275402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
275502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
275602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Send datagrams like there was no tomorrow. at somepoint it might */
275702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* be nice to set this up so that a quantity of bytes could be sent, */
275802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but we still need some sort of end of test trigger on the receive */
275902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* side. that could be a select with a one second timeout, but then */
276002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if there is a test where none of the data arrives for awile and */
276102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* then starts again, we would end the test too soon. something to */
276202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* think about... */
276302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while (!times_up) {
276402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
276502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
276602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to dirty some number of consecutive integers in the buffer */
276702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we are about to send. we may also want to bring some number of */
276802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* them cleanly into the cache. The clean ones will follow any dirty */
276902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* ones into the cache. */
277002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      access_buffer(send_ring->buffer_ptr,
277202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_size,
277302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_dirty_count,
277402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_clean_count);
277502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
277702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
277902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
278002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
278102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
278202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((t_sndudata(data_socket,
278302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      &unitdata))  != 0) {
278402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR)
278502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
278602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == ENOBUFS) {
278702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  failed_sends++;
278802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  continue;
278902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
279002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("xti_udp_send: data send error");
279102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	t_error("xti_udp_send: data send error");
279202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
279302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
279402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      messages_sent++;
279502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
279602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
279702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...and update the unitdata structure */
279802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
279902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring          = send_ring->next;
280002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      unitdata.udata.buf = send_ring->buffer_ptr;
280102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
280202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
280302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* get the second timestamp */
280402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_two);
280502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_add(time_hist,delta_micro(&time_one,&time_two));
280602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
280702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
280802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
280902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	units_this_tick += send_size;
281002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
281102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter */
281202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to decide to sleep for a little bit */
281302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) {
281402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* call sigsuspend and wait for the interval timer to get us */
281502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* out */
281602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
281702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"about to suspend\n");
281802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
281902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
282002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sigsuspend(&signal_set) == EFAULT) {
282102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
282202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "send_xti_udp_stream: fault with signal set!\n");
282302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
282402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
282502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
282602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	interval_count = interval_burst;
282702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
282802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
282902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
283102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This is a timed test, so the remote will be returning to us after */
283302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a time. We should not need to send any "strange" messages to tell */
283402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the remote that the test is completed, unless we decide to add a */
283502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* number of messages to the test. */
283602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the test is over, so get stats and stuff */
283802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,
283902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &elapsed_time);
284002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end	*/
284202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
284302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
284402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
284502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"send_xti_udp_stream: remote results obtained\n");
284602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
284702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
284802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
284902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_xti_udp_stream: error on remote");
285002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
285102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
285202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
285302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent    = (double) send_size * (double) messages_sent;
285402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_thruput = calc_thruput(bytes_sent);
285502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
285602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_recvd = xti_udp_stream_results->messages_recvd;
285702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_recvd    = (double) send_size * (double) messages_recvd;
285802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
285902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we asume that the remote ran for as long as we did */
286002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_thruput = calc_thruput(bytes_recvd);
286202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* print the results for this socket and message size */
286402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
286602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
286702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) We pass zeros for the local */
286802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* cpu utilization and elapsed time to tell the routine to use */
286902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the libraries own values for those. */
287002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
287102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
287202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* shouldn't this really be based on bytes_recvd, since that is */
287302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the effective throughput of the test? I think that it should, */
287402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* so will make the change raj 11/94 */
287502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_recvd,
287602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
287702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
287802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
287902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
288002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
288102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= -1.0;
288202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= -1.0;
288302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
288402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
288502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The local calculations could use variables being kept by */
288602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the local netlib routines. The remote calcuations need to */
288702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have a few things passed to them. */
288802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
288902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= xti_udp_stream_results->cpu_util;
289002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_recvd,
289102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
289202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
289302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      xti_udp_stream_results->num_cpus);
289402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
289502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
289602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= -1.0;
289702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= -1.0;
289802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
289902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
290002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
290102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
290202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
290302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization  = -1.0;
290402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand   = -1.0;
290502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = -1.0;
290602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = -1.0;
290702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
290802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
290902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
291002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
291102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
291202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
291302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
291402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
291502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_thruput,
291602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
291702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
291802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
291902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
292002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
292102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since the routine calculate_confidence is rather generic, and */
292202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we have a few other parms of interest, we will do a little work */
292302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here to caclulate their average. */
292402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sum_messages_sent  += messages_sent;
292502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sum_messages_recvd += messages_recvd;
292602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sum_failed_sends   += failed_sends;
292702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sum_local_thruput  += local_thruput;
292802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
292902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
293002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
293102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this datapoint is done, so we don't need the socket any longer */
293202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(data_socket);
293302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
293402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
293502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
293602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we should reach this point once the test is finished */
293702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
293802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
293902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_thruput,
294002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
294102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
294202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
294302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
294402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
294502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* some of the interesting values aren't covered by the generic */
294602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence routine */
294702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  messages_sent    = sum_messages_sent / (confidence_iteration -1);
294802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  messages_recvd   = sum_messages_recvd / (confidence_iteration -1);
294902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  failed_sends     = sum_failed_sends / (confidence_iteration -1);
295002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_thruput    = sum_local_thruput / (confidence_iteration -1);
295102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
295302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
295402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
295502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
295602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
295702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
295802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
295902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
296002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
296302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
296402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
296502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
296602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
296702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
296802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
297002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
297102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(xti_udp_stream_results->cpu_method);
297202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
297302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
297402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
297502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
297602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
297702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
297802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
297902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
298002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
298102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
298202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
298302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
298402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
298502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
298602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
298702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
298802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
298902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
299002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
299102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
299202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
299302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
299402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
299502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
299602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
299702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
299902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
300002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
300102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
300202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
300302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_sent,
300402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      failed_sends,
300502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput, 		/* what was the xfer rate */
300602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
300702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
300802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,
300902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,
301002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_recvd,
301102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_thruput,
301202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
301302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
301402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
301502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
301602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
301702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
301802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
301902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
302002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
302102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
302202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
302302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput);
302402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
302502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
302602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
302702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
302802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
302902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
303002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
303102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
303202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size, 		/* local sendbuf size */
303302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
303402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
303502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_sent,
303602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      failed_sends,
303702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput,
303802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size, 		/* remote recvbuf size */
303902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,
304002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_recvd,
304102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_thruput);
304202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
304302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
304402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
304502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
304702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
304802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
304902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of time spent in send() call\n");
305002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
305102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
305202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
305302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
305402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
305602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive side (netserver) of the */
305902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* XTI_UDP_STREAM performance test. */
306002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
306102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
306202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_xti_udp_stream()
306302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
306402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
306502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
306602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_bind bind_req, bind_resp;
306702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_unitdata unitdata;
306802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	            flags = 0;
306902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in myaddr_in;
307102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in fromaddr_in;
307202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET s_data;
307402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	addrlen;
307502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	bytes_received = 0;
307602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
307702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	message_size;
307902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	messages_recvd = 0;
308002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_udp_stream_request_struct	*xti_udp_stream_request;
308202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_udp_stream_response_struct	*xti_udp_stream_response;
308302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct xti_udp_stream_results_struct	*xti_udp_stream_results;
308402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_request  =
308602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_stream_request_struct *)netperf_request.content.test_specific_data;
308702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response =
308802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_stream_response_struct *)netperf_response.content.test_specific_data;
308902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_results  =
309002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_stream_results_struct *)netperf_response.content.test_specific_data;
309102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
309302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_xti_udp_stream: entered...\n");
309402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
309502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
309602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
309802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
309902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
310002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
310102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
310202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
310302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
310402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
310602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
310702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
310802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
310902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
311102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_stream: setting the response type...\n");
311202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
311302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
311402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = XTI_UDP_STREAM_RESPONSE;
311602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 2) {
311802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_stream: the response type is set...\n");
311902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
312002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
312102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
312302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
312402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
312602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_stream: requested alignment of %d\n",
312702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_udp_stream_request->recv_alignment);
312802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
312902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
313002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
313202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
313402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_stream_request->message_size,
313502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_stream_request->recv_alignment,
313602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_stream_request->recv_offset);
313702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
313902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_stream: receive alignment and offset set...\n");
314002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
314102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
314202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
314402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can put in OUR values !-) At some point, we may want to nail this */
314502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket to a particular network-level address, but for now, */
314602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* INADDR_ANY should be just fine. */
314702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&myaddr_in,
314902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(myaddr_in));
315002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_family      = AF_INET;
315102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_addr.s_addr = INADDR_ANY;
315202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_port        = 0;
315302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
315502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
315702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_stream: grabbing a socket...\n");
315802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
315902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
316002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_xti_endpoint expects to find some things in the global */
316202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
316302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
316402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
316502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size = xti_udp_stream_request->recv_buf_size;
316602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = xti_udp_stream_request->so_rcvavoid;
316702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = xti_udp_stream_request->so_sndavoid;
316802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
317002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
317202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
317302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
317402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
317502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
317602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
317702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
317802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
317902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
318002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
318102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) xti_udp_stream_request->xti_device;
318302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((xti_udp_stream_request->dev_name_len + 3) / 4);
318402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
318602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
318702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
318802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = htonl(*charword);
319002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
319102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
319202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
319402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_data = create_xti_endpoint(xti_udp_stream_request->xti_device);
319602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_data == INVALID_SOCKET) {
319802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
319902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
320002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
320102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
320202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's get an address assigned to this socket so we can tell the */
320402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator how to reach the data socket. There may be a desire to */
320502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nail this socket to a specific IP address in a multi-homed, */
320602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multi-connection situation, but for now, we'll ignore the issue */
320702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and concentrate on single connection testing. */
320802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.maxlen = sizeof(struct sockaddr_in);
321002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.len    = sizeof(struct sockaddr_in);
321102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.buf    = (char *)&myaddr_in;
321202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.qlen        = 1;
321302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
321402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.maxlen = sizeof(struct sockaddr_in);
321502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.len    = sizeof(struct sockaddr_in);
321602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.buf    = (char *)&myaddr_in;
321702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.qlen        = 1;
321802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
321902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_bind(s_data,
322002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &bind_req,
322102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &bind_resp) == SOCKET_ERROR) {
322202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = t_errno;
322302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
322402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
322602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
322702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response->test_length =
322902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_request->test_length;
323002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
323202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
323302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
323402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response->data_port_number =
323602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (int) ntohs(myaddr_in.sin_port);
323702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
323802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
324002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
324102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
324202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
324302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
324402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response->cpu_rate    = 0.0; /* assume no cpu */
324602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response->measure_cpu = 0;
324702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_udp_stream_request->measure_cpu) {
324802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We will pass the rate into the calibration routine. If the */
324902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user did not specify one, it will be 0.0, and we will do a */
325002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "real" calibration. Otherwise, all it will really do is */
325102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* store it away... */
325202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_response->measure_cpu = 1;
325302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_response->cpu_rate =
325402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(xti_udp_stream_request->cpu_rate);
325502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
325602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_size	= xti_udp_stream_request->message_size;
325802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  test_time	= xti_udp_stream_request->test_length;
325902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
326002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
326102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
326202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response->send_buf_size = lss_size;
326302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response->recv_buf_size = lsr_size;
326402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response->so_rcvavoid = loc_rcvavoid;
326502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_response->so_sndavoid = loc_sndavoid;
326602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
326702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are going to call t_rcvudata() instead of t_rcv() we */
326802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* need to init the unitdata structure raj 3/95 */
326902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.addr.maxlen = sizeof(fromaddr_in);
327102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.addr.len    = sizeof(fromaddr_in);
327202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.addr.buf    = (char *)&fromaddr_in;
327302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.opt.maxlen = 0;
327502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.opt.len    = 0;
327602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.opt.buf    = NULL;
327702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.udata.maxlen = xti_udp_stream_request->message_size;
327902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.udata.len    = xti_udp_stream_request->message_size;
328002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unitdata.udata.buf    = recv_ring->buffer_ptr;
328102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
328302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
328502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
328602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(xti_udp_stream_request->measure_cpu);
328802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the timer pops, or if we happen to recv a */
329002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* message of less than send_size bytes... */
329102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
329202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up = 0;
329302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  start_timer(test_time + PAD_TIME);
329402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
329502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
329602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_stream: about to enter inner sanctum.\n");
329702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
329802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
329902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (!times_up) {
330102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef RAJ_DEBUG
330202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
330302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"t_rcvudata, errno %d, t_errno %d",
330402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno,
330502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      t_errno);
330602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where," after %d messages\n",messages_recvd);
330702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"addrmax %d addrlen %d addrbuf %x\n",
330802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.addr.maxlen,
330902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.addr.len,
331002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.addr.buf);
331102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"optmax %d optlen %d optbuf %x\n",
331202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.opt.maxlen,
331302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.opt.len,
331402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.opt.buf);
331502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"udatamax %d udatalen %d udatabuf %x\n",
331602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.udata.maxlen,
331702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.udata.len,
331802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      unitdata.udata.buf);
331902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
332002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
332102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* RAJ_DEBUG */
332202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_rcvudata(s_data,
332302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   &unitdata,
332402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   &flags) != 0) {
332502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == TNODATA) {
332602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	continue;
332702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
332802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno != EINTR) {
332902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = t_errno;
333002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
333102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
333202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
333302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
333402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
333502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_recvd++;
333602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
333702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unitdata.udata.buf = recv_ring->buffer_ptr;
333802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
333902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
334102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_stream: got %d messages.\n",messages_recvd);
334202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
334302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
334402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due timer or < send_size bytes received. */
334702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(xti_udp_stream_request->measure_cpu,&elapsed_time);
334902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (times_up) {
335102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended on a timer, subtract the PAD_TIME */
335202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= (float)PAD_TIME;
335302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
335402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
335502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    stop_timer();
335602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
335702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
335902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_stream: test ended in %f seconds.\n",elapsed_time);
336002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
336102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
336202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_received = (messages_recvd * message_size);
336402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
336602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
336802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
336902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_udp_stream: got %d bytes\n",
337002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
337102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
337202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
337302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type	= XTI_UDP_STREAM_RESULTS;
337502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_results->bytes_received	= bytes_received;
337602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_results->messages_recvd	= messages_recvd;
337702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_results->elapsed_time	= elapsed_time;
337802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_stream_results->cpu_method        = cpu_method;
337902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_udp_stream_request->measure_cpu) {
338002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_results->cpu_util	= calc_cpu_util(elapsed_time);
338102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
338202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
338302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_stream_results->cpu_util	= -1.0;
338402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
338502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
338702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
338802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_udp_stream: test complete, sending results.\n");
338902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
339002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
339102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
339302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
339502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid send_xti_udp_rr(char remote_host[])
339702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
339802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
340002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
340102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
340202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
340302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
340402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
340502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
340602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
340702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
340802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
340902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
341002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
341102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
341202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
341302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
341402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
341502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
341602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
341702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
341802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
341902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
342002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
342102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
342302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f   %-6.2f %-6.2f %-6.3f  %-6.3f\n";
342402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
342602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
342702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
342902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
343002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
343102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
343202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
343302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
343602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
343802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
343902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_bind bind_req, bind_resp;
344102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_unitdata unitdata;
344202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_unitdata send_unitdata;
344302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_unitdata recv_unitdata;
344402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	            flags = 0;
344502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
344702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
344802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET send_socket;
344902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
345002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_xferd;
345102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
345302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
345502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
345602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
345702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
345802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double thruput;
345902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	hostent	        *hp;
346102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in	server, myaddr_in;
346202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned      int             addr;
346302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	                        addrlen;
346402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_udp_rr_request_struct	*xti_udp_rr_request;
346602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_udp_rr_response_struct	*xti_udp_rr_response;
346702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_udp_rr_results_struct	*xti_udp_rr_result;
346802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
347002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	interval_count;
347102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigset_t signal_set;
347202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
347302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
347402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_request  =
347502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_rr_request_struct *)netperf_request.content.test_specific_data;
347602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response =
347702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_rr_response_struct *)netperf_response.content.test_specific_data;
347802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_result	 =
347902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_rr_results_struct *)netperf_response.content.test_specific_data;
348002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
348202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_hist = HIST_new();
348302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
348402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
348602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
348702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
348802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
348902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&server,
349102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(server));
349202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would seem that while HP-UX will allow an IP address (as a */
349402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* string) in a call to gethostbyname, other, less enlightened */
349502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
349602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* order changed to check for IP address first. raj 7/96 */
349702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
349902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was not an IP address, try it as a name */
350002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((hp = gethostbyname(remote_host)) == NULL) {
350102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have no idea what it is */
350202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
350302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "establish_control: could not resolve the destination %s\n",
350402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_host);
350502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
350602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
350702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
350802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
350902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it was a valid remote_host */
351002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bcopy(hp->h_addr,
351102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (char *)&server.sin_addr,
351202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    hp->h_length);
351302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_family = hp->h_addrtype;
351402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
351502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
351602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
351702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was a valid IP address */
351802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_addr.s_addr = addr;
351902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_family = AF_INET;
352002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
352102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
352202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
352302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"XTI UDP REQUEST/RESPONSE TEST");
352402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where," to %s", remote_host);
352502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
352602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
352702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      " : +/-%3.1f%% @ %2d%% conf.",
352802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      interval/0.02,
352902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      confidence_level);
353002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
353102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (loc_sndavoid ||
353202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	loc_rcvavoid ||
353302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_sndavoid ||
353402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_rcvavoid) {
353502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where," : copy avoidance");
353602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
353702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
353802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : histogram");
353902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
354002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
354102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : interval");
354202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
354302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
354402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where," : dirty data");
354502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
354602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n");
354702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
354802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
354902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
355002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
355102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring     = NULL;
355202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring     = NULL;
355302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	= 0;
355402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	= 0;
355502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 0;
355602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
355702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
355802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
355902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
356102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
356202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
356302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
356402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
356502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
356602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
356802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
356902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages     = 0;
357102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd     = 0.0;
357202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up        = 0;
357302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
357402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffers with the requested alignment and offset */
357602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 1;
357802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) recv_width = 1;
357902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
358102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
358202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       req_size,
358302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
358402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
358502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
358602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
358802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
358902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       rsp_size,
359002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
359102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
359202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
359302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
359402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are going to call t_rcvudata() instead of t_rcv() we */
359502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* need to init the unitdata structure raj 8/95 */
359602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
359702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    memset (&recv_unitdata, 0, sizeof(recv_unitdata));
359802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.addr.maxlen = sizeof(struct sockaddr_in);
359902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.addr.len    = sizeof(struct sockaddr_in);
360002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.addr.buf    = (char *)&server;
360102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
360202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.opt.maxlen = 0;
360302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.opt.len    = 0;
360402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.opt.buf    = NULL;
360502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
360602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.udata.maxlen = rsp_size;
360702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.udata.len    = rsp_size;
360802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.udata.buf    = recv_ring->buffer_ptr;
360902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since we are going to call t_sndudata() instead of t_snd() we */
361102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* need to init the unitdata structure raj 8/95 */
361202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    memset (&send_unitdata, 0, sizeof(send_unitdata));
361402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.addr.maxlen = sizeof(struct sockaddr_in);
361502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.addr.len    = sizeof(struct sockaddr_in);
361602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.addr.buf    = (char *)&server;
361702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.opt.maxlen = 0;
361902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.opt.len    = 0;
362002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.opt.buf    = NULL;
362102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.udata.maxlen = req_size;
362302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.udata.len    = req_size;
362402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.udata.buf    = send_ring->buffer_ptr;
362502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
362702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_xti_endpoint(loc_xti_device);
362802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
363002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_xti_udp_rr: udp rr data socket");
363102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
363202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
363302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
363502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_xti_udp_rr: send_socket obtained...\n");
363602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
363702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it would seem that with XTI, there is no implicit bind  */
363902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* so we have to make a call to t_bind. this is not */
364002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* terribly convenient, but I suppose that "standard is better */
364102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* than better" :) raj 2/95 */
364202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_bind(send_socket, NULL, NULL) == SOCKET_ERROR) {
364402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      t_error("send_xti_tcp_stream: t_bind");
364502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
364602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
364702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
364902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
365002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
365102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
365202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
365302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. If */
365402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there is no idle counter in the kernel idle loop, the */
365502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local_cpu_rate will be set to -1. */
365602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
365702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
365802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
365902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
366002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the socket */
366202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* paramters on the other side at this point, hence the reason for */
366302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the values being passed in the setup message. If the user did */
366402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not specify any of the parameters, they will be passed as 0, which */
366502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will indicate to the remote that no changes beyond the system's */
366602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default should be used. Alignment is the exception, it will */
366702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default to 8, which will be no alignment alterations. */
366802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type	= DO_XTI_UDP_RR;
367002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->recv_buf_size	= rsr_size;
367102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->send_buf_size	= rss_size;
367202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->recv_alignment  = remote_recv_align;
367302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->recv_offset	= remote_recv_offset;
367402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->send_alignment  = remote_send_align;
367502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->send_offset	= remote_send_offset;
367602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->request_size	= req_size;
367702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->response_size	= rsp_size;
367802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->measure_cpu	= remote_cpu_usage;
367902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->cpu_rate	= remote_cpu_rate;
368002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->so_rcvavoid	= rem_rcvavoid;
368102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->so_sndavoid	= rem_sndavoid;
368202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
368302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      xti_udp_rr_request->test_length	= test_time;
368402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
368502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
368602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      xti_udp_rr_request->test_length	= test_trans * -1;
368702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
368802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
368902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(xti_udp_rr_request->xti_device, rem_xti_device);
369002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
369202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ok - even on a DEC box, strings are strings. I didn't really want */
369402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to ntohl the words of a string. since I don't want to teach the */
369502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_ and recv_ _request and _response routines about the types, */
369602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
369702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* solution would be to use XDR, but I am still leary of being able */
369802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to find XDR libs on all platforms I want running netperf. raj */
369902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
370002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *charword;
370102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *initword;
370202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int *lastword;
370302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      initword = (int *) xti_udp_rr_request->xti_device;
370502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lastword = initword + ((strlen(rem_xti_device) + 3) / 4);
370602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (charword = initword;
370802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   charword < lastword;
370902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   charword++) {
371002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	*charword = ntohl(*charword);
371202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
371302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
371402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
371502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
371702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_xti_udp_rr: requesting UDP r/r test\n");
371802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
371902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
372102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant 	*/
372302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket parameters for this test type. We will put them back into */
372402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the variables here so they can be displayed if desired.  The	*/
372502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote will have calibrated CPU if necessary, and will have done	*/
372602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the needed set-up we will have calibrated the cpu locally	*/
372702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before sending the request, and will grab the counter value right*/
372802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the connect returns. The remote will grab the counter right*/
372902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the accept call. This saves the hassle of extra messages	*/
373002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* being sent for the UDP tests.					*/
373102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
373202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
373302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
373402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
373502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
373602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote listen done.\n");
373702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size	       =	xti_udp_rr_response->recv_buf_size;
373802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size	       =	xti_udp_rr_response->send_buf_size;
373902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage =	xti_udp_rr_response->measure_cpu;
374002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate  = 	xti_udp_rr_response->cpu_rate;
374102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* port numbers in proper order */
374202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_port  =	(short)xti_udp_rr_response->data_port_number;
374302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_port  = 	htons(server.sin_port);
374402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
374502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
374602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
374702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: remote error");
374802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
374902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
375002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
375102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
375202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either the */
375302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect would have failed, or the previous response would have */
375402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indicated a problem. I failed to see the value of the extra */
375502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* message after the accept on the remote. If it failed, we'll see it */
375602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here. If it didn't, we might as well start pumping data. */
375702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
375802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a request/response test, they */
375902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can be either time or transaction based. */
376002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
376102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
376202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
376302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
376402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = 0;
376502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
376602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
376702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
376802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
376902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = test_bytes;
377002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
377102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
377202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
377302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
377402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
377502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
377602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
377702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
377802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
377902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
378002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) || (demo_mode)) {
378102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the */
378202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer, unless we are in demo_mode */
378302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate);
378402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
378502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst;
378602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */
378702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
378802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
378902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "send_xti_udp_rr: unable to get sigmask errno %d\n",
379002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
379102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
379202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
379302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
379402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
379502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
379702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return */
379802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* false. When the test is controlled by byte count, the time test */
379902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will always return false. When the test is finished, the whole */
380002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. I think */
380102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I just arbitrarily decrement trans_remaining for the timed */
380202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* test, but will not do that just yet... One other question is */
380302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* whether or not the send buffer and the receive buffer should be */
380402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the same buffer. */
380502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
380602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (trans_remaining > 0)) {
380702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send the request */
380802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
380902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
381002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
381102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((t_sndudata(send_socket,
381202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &send_unitdata)) != 0) {
381302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR) {
381402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* We likely hit */
381502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* test-end time. */
381602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
381702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
381802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
381902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"send_xti_udp_rr: t_sndudata: errno %d t_errno %d t_look 0x%.4x\n",
382002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno,
382102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_errno,
382202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_look(send_socket));
382302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
382402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
382502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
382602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
382702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
382802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* receive the response. with UDP we will get it all, or nothing */
382902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
383002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((t_rcvudata(send_socket,
383102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &recv_unitdata,
383202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &flags)) != 0) {
383302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == TNODATA) {
383402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  continue;
383502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
383602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR) {
383702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* Again, we have likely hit test-end time */
383802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
383902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
384002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
384102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"send_xti_udp_rr: t_rcvudata: errno %d t_errno %d t_look 0x%x\n",
384202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno,
384302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_errno,
384402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_look(send_socket));
384502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
384602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_unitdata.udata.buf %x\n",recv_unitdata.udata.buf);
384702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
384802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_unitdata.udata.maxlen %x\n",recv_unitdata.udata.maxlen);
384902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
385002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_unitdata.udata.len %x\n",recv_unitdata.udata.len);
385102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
385202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_unitdata.addr.buf %x\n",recv_unitdata.addr.buf);
385302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
385402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_unitdata.addr.maxlen %x\n",recv_unitdata.addr.maxlen);
385502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
385602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_unitdata.addr.len %x\n",recv_unitdata.addr.len);
385702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
385802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
385902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
386002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
386102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
386202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
386302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_two);
386402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_add(time_hist,delta_micro(&time_one,&time_two));
386502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
386602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* at this point, we may wish to sleep for some period of */
386702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* time, so we see how long that last transaction just took, */
386802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* and sleep for the difference of that and the interval. We */
386902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* will not sleep if the time would be less than a */
387002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* millisecond.  */
387102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
387202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
387302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
387402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	units_this_tick += 1;
387502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
387602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter */
387702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to decide to sleep for a little bit */
387802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) {
387902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* call sigsuspend and wait for the interval timer to get us */
388002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* out */
388102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
388202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"about to suspend\n");
388302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
388402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
388502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sigsuspend(&signal_set) == EFAULT) {
388602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
388702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "send_xti_udp_rr: fault with signal set!\n");
388802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
388902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
389002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
389102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	interval_count = interval_burst;
389202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
389302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
389402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
389502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
389602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
389702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
389802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
389902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
390102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((nummessages % 100) == 0) {
390202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"Transaction %d completed\n",nummessages);
390302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
390402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
390502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
390602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
390802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
391002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
391102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
391202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
391302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured? how long */
391402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* did we really run? */
391502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
391602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
391702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated service demand and all those interesting things. If */
391802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it wasn't supposed to care, it will return obvious values. */
391902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
392002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
392102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
392202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
392302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
392402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
392502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
392602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
392702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: remote error");
392802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
392902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
393002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
393102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
393202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our thruput was for the test. In the */
393302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* future, we may want to include a calculation of the thruput */
393402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* measured by the remote, but it should be the case that for a */
393502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* UDP rr test, that the two numbers should be *very* close... */
393602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We calculate bytes_sent regardless of the way the test length */
393702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* was controlled.  */
393802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
393902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
394002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= nummessages / elapsed_time;
394102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
394202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
394302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
394402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
394502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) Of course, some of the */
394602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* information might be bogus because there was no idle counter */
394702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in the kernel(s). We need to make a note of this for the */
394802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* user's benefit by placing a code for the metod used in the */
394902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* test banner */
395002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
395102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
395202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization = calc_cpu_util(0.0);
395302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
395402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
395502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
395602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
395702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
395802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand  = calc_service_demand((double) nummessages*1024,
395902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
396002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
396102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0);
396202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
396302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
396402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= -1.0;
396502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= -1.0;
396602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
396702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
396802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
396902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = xti_udp_rr_result->cpu_util;
397002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
397202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
397302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
397402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = calc_service_demand((double) nummessages*1024,
397602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						     0.0,
397702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						     remote_cpu_utilization,
397802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						     xti_udp_rr_result->num_cpus);
397902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
398002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
398102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = -1.0;
398202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = -1.0;
398302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
398402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
398502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
398602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
398702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
398802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= -1.0;
398902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= -1.0;
399002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = -1.0;
399102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = -1.0;
399202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
399302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
399402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
399502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
399602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
399702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
399802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
399902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
400002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
400102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
400202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
400302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
400402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
400502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
400602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
400702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
400802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
400902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are done with the socket */
401002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    t_close(send_socket);
401102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
401202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
401302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have made all the iterations we are going to */
401402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* make. */
401502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
401602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
401702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
401802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
401902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
402002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
402102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
402202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
402302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
402402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
402502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
402602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
402702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
402802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
402902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
403002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
403102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
403202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
403302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
403402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
403502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
403602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
403702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
403802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
403902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
404002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(xti_udp_rr_result->cpu_method);
404102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
404202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
404302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
404402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
404502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
404602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
404702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
404802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
404902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
405002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
405102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
405202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
405302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
405402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
405502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
405602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
405702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
405802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
405902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
406002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
406102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
406202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
406302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
406402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
406502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
406602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
406702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
406802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
406902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
407002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
407102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
407202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
407302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time,
407402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
407502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
407602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
407702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
407802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
407902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
408002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
408102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
408202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
408302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
408402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
408502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
408602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
408702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
408802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
408902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
409002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
409102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
409202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
409302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
409402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
409502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
409602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
409702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
409802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
409902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
410002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
410102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
410202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
410302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
410402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
410502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
410602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
410702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
410802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
410902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
411002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
411102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
411202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
411302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
411402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
411502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
411602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
411702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
411802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
411902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
412002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
412102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
412202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
412302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how to handle the verbose information in the presence of */
412402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence intervals is yet to be determined... raj 11/94 */
412502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
412602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
412702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
412802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
412902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* UDP statistics, the alignments of the sends and receives */
413002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
413102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
413202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
413302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/reponse times.\n");
413402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
413502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
413602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
413702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
413802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
413902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
414002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive side (netserver) of a XTI_UDP_RR */
414102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test. */
414202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
414302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_xti_udp_rr()
414402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
414502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
414602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
414702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
414802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
414902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_bind bind_req, bind_resp;
415002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_unitdata send_unitdata;
415102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_unitdata recv_unitdata;
415202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	            flags = 0;
415302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
415402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in myaddr_in, peeraddr_in;
415502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET s_data;
415602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	addrlen;
415702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
415802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
415902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
416002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
416102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_udp_rr_request_struct	*xti_udp_rr_request;
416202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_udp_rr_response_struct	*xti_udp_rr_response;
416302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_udp_rr_results_struct	*xti_udp_rr_results;
416402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
416502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
416602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* a little variable initialization */
416702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  memset (&myaddr_in, 0, sizeof(struct sockaddr_in));
416802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_family      = AF_INET;
416902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_addr.s_addr = INADDR_ANY;
417002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_port        = 0;
417102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  memset (&peeraddr_in, 0, sizeof(struct sockaddr_in));
417202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
417302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and some not so paranoid :) */
417402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_request  =
417502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_rr_request_struct *)netperf_request.content.test_specific_data;
417602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response =
417702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_rr_response_struct *)netperf_response.content.test_specific_data;
417802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_results  =
417902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_udp_rr_results_struct *)netperf_response.content.test_specific_data;
418002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
418102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
418202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_xti_udp_rr: entered...\n");
418302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
418402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
418502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
418602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
418702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
418802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
418902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
419002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
419102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
419202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
419302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
419402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
419502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
419602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
419702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
419802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
419902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
420002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_rr: setting the response type...\n");
420102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
420202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
420302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
420402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = XTI_UDP_RR_RESPONSE;
420502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
420602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
420702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_rr: the response type is set...\n");
420802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
420902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
421002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
421102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variables to be at the desired */
421202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignments with the desired offsets. */
421302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
421402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
421502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_rr: requested recv alignment of %d offset %d\n",
421602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_udp_rr_request->recv_alignment,
421702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_udp_rr_request->recv_offset);
421802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_rr: requested send alignment of %d offset %d\n",
421902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_udp_rr_request->send_alignment,
422002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_udp_rr_request->send_offset);
422102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
422202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
422302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
422402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
422502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
422602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
422702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
422802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_rr_request->request_size,
422902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_rr_request->recv_alignment,
423002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_rr_request->recv_offset);
423102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
423202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
423302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_rr_request->response_size,
423402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_rr_request->send_alignment,
423502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_udp_rr_request->send_offset);
423602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
423702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
423802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_rr: receive alignment and offset set...\n");
423902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
424002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
424102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
424202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_xti_endpoint expects to find some things in the global */
424302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
424402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
424502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
424602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size = xti_udp_rr_request->send_buf_size;
424702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size = xti_udp_rr_request->recv_buf_size;
424802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = xti_udp_rr_request->so_rcvavoid;
424902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = xti_udp_rr_request->so_sndavoid;
425002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
425102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
425202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
425302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
425402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
425502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
425602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
425702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
425802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
425902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
426002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
426102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
426202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
426302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
426402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) xti_udp_rr_request->xti_device;
426502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((xti_udp_rr_request->dev_name_len + 3) / 4);
426602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
426702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
426802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
426902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
427002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
427102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = htonl(*charword);
427202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
427302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
427402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
427502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
427602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
427702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_data = create_xti_endpoint(xti_udp_rr_request->xti_device);
427802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
427902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_data == INVALID_SOCKET) {
428002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
428102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
428202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
428302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
428402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
428502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
428602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_udp_rr: endpoint created...\n");
428702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
428802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
428902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
429002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's get an address assigned to this socket so we can tell the */
429102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator how to reach the data socket. There may be a desire to */
429202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nail this socket to a specific IP address in a multi-homed, */
429302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multi-connection situation, but for now, we'll ignore the issue */
429402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and concentrate on single connection testing. */
429502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
429602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.maxlen = sizeof(struct sockaddr_in);
429702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.len    = sizeof(struct sockaddr_in);
429802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.buf    = (char *)&myaddr_in;
429902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.qlen        = 1;
430002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
430102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.maxlen = sizeof(struct sockaddr_in);
430202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.len    = sizeof(struct sockaddr_in);
430302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.buf    = (char *)&myaddr_in;
430402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.qlen        = 1;
430502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
430602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_bind(s_data,
430702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &bind_req,
430802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &bind_resp) == SOCKET_ERROR) {
430902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
431002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
431102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_xti_udp_rr: t_bind failed, t_errno %d errno %d\n",
431202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      t_errno,
431302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
431402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
431502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
431602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
431702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = t_errno;
431802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
431902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
432002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
432102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
432202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
432302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
432402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
432502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_udp_rr: endpoint bound to port %d...\n",
432602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ntohs(myaddr_in.sin_port));
432702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
432802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
432902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
433002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response->test_length =
433102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_request->test_length;
433202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
433302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
433402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
433502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
433602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
433702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
433802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
433902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
434002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
434102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,"recv port number %d\n",myaddr_in.sin_port);
434202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
434302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
434402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
434502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
434602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
434702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
434802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
434902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
435002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response->cpu_rate    = 0.0; 	/* assume no cpu */
435102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response->measure_cpu = 0;
435202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_udp_rr_request->measure_cpu) {
435302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_response->measure_cpu = 1;
435402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_response->cpu_rate =
435502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(xti_udp_rr_request->cpu_rate);
435602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
435702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
435802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
435902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
436002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response->send_buf_size = lss_size;
436102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response->recv_buf_size = lsr_size;
436202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response->so_rcvavoid   = loc_rcvavoid;
436302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_response->so_sndavoid   = loc_sndavoid;
436402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
436502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are going to call t_rcvudata() instead of t_rcv() we */
436602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* need to init the unitdata structure raj 3/95 */
436702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
436802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  memset (&recv_unitdata, 0, sizeof(recv_unitdata));
436902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.addr.maxlen = sizeof(struct sockaddr_in);
437002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.addr.len    = sizeof(struct sockaddr_in);
437102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.addr.buf    = (char *)&peeraddr_in;
437202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
437302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.opt.maxlen = 0;
437402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.opt.len    = 0;
437502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.opt.buf    = NULL;
437602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
437702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.udata.maxlen = xti_udp_rr_request->request_size;
437802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.udata.len    = xti_udp_rr_request->request_size;
437902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_unitdata.udata.buf    = recv_ring->buffer_ptr;
438002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
438102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are going to call t_sndudata() instead of t_snd() we */
438202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* need to init the unitdata structure raj 8/95 */
438302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
438402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  memset (&send_unitdata, 0, sizeof(send_unitdata));
438502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.addr.maxlen = sizeof(struct sockaddr_in);
438602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.addr.len    = sizeof(struct sockaddr_in);
438702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.addr.buf    = (char *)&peeraddr_in;
438802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
438902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.opt.maxlen = 0;
439002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.opt.len    = 0;
439102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.opt.buf    = NULL;
439202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
439302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.udata.maxlen = xti_udp_rr_request->response_size;
439402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.udata.len    = xti_udp_rr_request->response_size;
439502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_unitdata.udata.buf    = send_ring->buffer_ptr;
439602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
439702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
439802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
439902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
440002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
440102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
440202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
440302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(xti_udp_rr_request->measure_cpu);
440402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
440502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_udp_rr_request->test_length > 0) {
440602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
440702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
440802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(xti_udp_rr_request->test_length + PAD_TIME);
440902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
441002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
441102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
441202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = xti_udp_rr_request->test_length * -1;
441302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
441402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
441502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
441602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&peeraddr_in, addrlen);
441702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
441802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
441902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
442002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
442102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
442202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the request from the other side */
442302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_rcvudata(s_data,
442402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   &recv_unitdata,
442502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   &flags) != 0) {
442602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == TNODATA) {
442702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	continue;
442802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
442902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
443002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we must have hit the end of test time. */
443102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
443202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
443302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
443402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
443502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_xti_udp_rr: t_rcvudata failed, t_errno %d errno %d\n",
443602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_errno,
443702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno);
443802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
443902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
444002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = t_errno;
444102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
444202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
444302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
444402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
444502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_unitdata.udata.buf = recv_ring->buffer_ptr;
444602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
444702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
444802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (t_sndudata(s_data,
444902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   &send_unitdata) != 0) {
445002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
445102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we have hit end of test time. */
445202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
445302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
445402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
445502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
445602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_xti_udp_rr: t_sndudata failed, t_errno %d errno %d\n",
445702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_errno,
445802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno);
445902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
446002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
446102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
446202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
446302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
446402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
446502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
446602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_unitdata.udata.buf = send_ring->buffer_ptr;
446702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
446802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
446902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
447002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
447102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
447202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
447302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
447402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
447502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_xti_udp_rr: Transaction %d complete.\n",
447602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
447702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
447802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
447902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
448002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
448102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
448202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
448302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
448402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
448502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
448602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(xti_udp_rr_request->measure_cpu,&elapsed_time);
448702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
448802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (times_up) {
448902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
449002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
449102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
449202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
449302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
449402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
449502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
449602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
449702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
449802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_udp_rr: got %d transactions\n",
449902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
450002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
450102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
450202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
450302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_results->bytes_received = (trans_received *
450402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    (xti_udp_rr_request->request_size +
450502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     xti_udp_rr_request->response_size));
450602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_results->trans_received = trans_received;
450702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_results->elapsed_time	 = elapsed_time;
450802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_udp_rr_results->cpu_method     = cpu_method;
450902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_udp_rr_request->measure_cpu) {
451002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_udp_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
451102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
451202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
451302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
451402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
451502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_udp_rr: test complete, sending results.\n");
451602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
451702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
451802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
451902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
452002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
452102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are done with the socket now */
452202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
452302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
452402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
452502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
452602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive (netserver) side of a XTI_TCP_RR */
452702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test */
452802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
452902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_xti_tcp_rr()
453002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
453102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
453202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
453302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
453402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
453502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in  myaddr_in,  peeraddr_in;
453602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_bind bind_req, bind_resp;
453702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct t_call call_req;
453802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
453902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET s_listen,s_data;
454002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	addrlen;
454102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
454202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
454302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
454402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
454502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_recvd;
454602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
454702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
454802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
454902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
455002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_rr_request_struct	*xti_tcp_rr_request;
455102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_rr_response_struct	*xti_tcp_rr_response;
455202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_rr_results_struct	*xti_tcp_rr_results;
455302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
455402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_request =
455502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_rr_request_struct *)netperf_request.content.test_specific_data;
455602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response =
455702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_rr_response_struct *)netperf_response.content.test_specific_data;
455802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_results =
455902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_rr_results_struct *)netperf_response.content.test_specific_data;
456002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
456102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
456202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_xti_tcp_rr: entered...\n");
456302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
456402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
456502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
456602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
456702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
456802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
456902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
457002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
457102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
457202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
457302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
457402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
457502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
457602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
457702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
457802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
457902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
458002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_rr: setting the response type...\n");
458102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
458202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
458302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
458402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = XTI_TCP_RR_RESPONSE;
458502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
458602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
458702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_rr: the response type is set...\n");
458802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
458902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
459002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
459102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* allocate the recv and send rings with the requested alignments */
459202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and offsets. raj 7/94 */
459302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
459402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_rr: requested recv alignment of %d offset %d\n",
459502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_rr_request->recv_alignment,
459602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_rr_request->recv_offset);
459702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_rr: requested send alignment of %d offset %d\n",
459802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_rr_request->send_alignment,
459902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_rr_request->send_offset);
460002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
460102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
460202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
460302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at some point, these need to come to us from the remote system */
460402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
460502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
460602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
460702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
460802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_tcp_rr_request->response_size,
460902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_tcp_rr_request->send_alignment,
461002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_tcp_rr_request->send_offset);
461102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
461202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
461302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_tcp_rr_request->request_size,
461402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_tcp_rr_request->recv_alignment,
461502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   xti_tcp_rr_request->recv_offset);
461602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
461702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
461802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
461902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can put in OUR values !-) At some point, we may want to nail this */
462002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket to a particular network-level address, but for now, */
462102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* INADDR_ANY should be just fine. */
462202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
462302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&myaddr_in,
462402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(myaddr_in));
462502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_family      = AF_INET;
462602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_addr.s_addr = INADDR_ANY;
462702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_port        = 0;
462802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
462902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
463002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
463102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
463202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_rr: grabbing a socket...\n");
463302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
463402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
463502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
463602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_xti_endpoint expects to find some things in the global */
463702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
463802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
463902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
464002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size = xti_tcp_rr_request->send_buf_size;
464102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size = xti_tcp_rr_request->recv_buf_size;
464202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = xti_tcp_rr_request->no_delay;
464302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = xti_tcp_rr_request->so_rcvavoid;
464402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = xti_tcp_rr_request->so_sndavoid;
464502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
464602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
464702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
464802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
464902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
465002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
465102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
465202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
465302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
465402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
465502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
465602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
465702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
465802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
465902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) xti_tcp_rr_request->xti_device;
466002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((xti_tcp_rr_request->dev_name_len + 3) / 4);
466102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
466202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
466302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
466402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
466502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
466602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = htonl(*charword);
466702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
466802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
466902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
467102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_xti_endpoint(xti_tcp_rr_request->xti_device);
467302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
467502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
467602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
467702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
467902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
468002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
468102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's get an address assigned to this socket so we can tell the */
468202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator how to reach the data socket. There may be a desire to */
468302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nail this socket to a specific IP address in a multi-homed, */
468402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multi-connection situation, but for now, we'll ignore the issue */
468502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and concentrate on single connection testing. */
468602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
468702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.maxlen = sizeof(struct sockaddr_in);
468802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.len    = sizeof(struct sockaddr_in);
468902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.addr.buf    = (char *)&myaddr_in;
469002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req.qlen        = 1;
469102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
469202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.maxlen = sizeof(struct sockaddr_in);
469302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.len    = sizeof(struct sockaddr_in);
469402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.addr.buf    = (char *)&myaddr_in;
469502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_resp.qlen        = 1;
469602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
469702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_bind(s_listen,
469802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &bind_req,
469902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &bind_resp) == SOCKET_ERROR) {
470002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = t_errno;
470102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
470202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
470302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
470402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
470502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
470602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
470702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
470802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
470902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_rr: t_bind complete port %d\n",
471002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ntohs(myaddr_in.sin_port));
471102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
471202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
471302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
471402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
471502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
471602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
471702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
471802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
471902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
472002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
472102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
472202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
472302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
472402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
472502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
472602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
472702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->cpu_rate = 0.0; 	/* assume no cpu */
472802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->measure_cpu = 0;
472902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
473002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_rr_request->measure_cpu) {
473102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_response->measure_cpu = 1;
473202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_response->cpu_rate = calibrate_local_cpu(xti_tcp_rr_request->cpu_rate);
473302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
473402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
473502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
473602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
473702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
473802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->send_buf_size = lss_size;
473902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->recv_buf_size = lsr_size;
474002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->no_delay = loc_nodelay;
474102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->so_rcvavoid = loc_rcvavoid;
474202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->so_sndavoid = loc_sndavoid;
474302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_response->test_length = xti_tcp_rr_request->test_length;
474402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
474502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
474602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections. for xti, */
474702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the t_listen call is blocking by default - this is different */
474802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* semantics from BSD - probably has to do with being able to reject */
474902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* a call before an accept */
475002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.addr.maxlen = sizeof(struct sockaddr_in);
475102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.addr.len    = sizeof(struct sockaddr_in);
475202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.addr.buf    = (char *)&peeraddr_in;
475302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.opt.maxlen  = 0;
475402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.opt.len     = 0;
475502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.opt.buf     = NULL;
475602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.udata.maxlen= 0;
475702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.udata.len   = 0;
475802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  call_req.udata.buf   = 0;
475902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
476002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_listen(s_listen, &call_req) == -1) {
476102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
476202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_rr: t_listen: errno %d t_errno %d\n",
476302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
476402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_errno);
476502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
476602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = t_errno;
476702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
476802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
476902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
477002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
477102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
477202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
477302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
477402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_rr: t_listen complete t_look 0x%.4x\n",
477502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_look(s_listen));
477602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
477702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
477802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
477902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now just rubber stamp the thing. we want to use the same fd? so */
478002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we will just equate s_data with s_listen. this seems a little */
478102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* hokey to me, but then I'm a BSD biggot still. raj 2/95 */
478202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_data = s_listen;
478302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (t_accept(s_listen,
478402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       s_data,
478502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &call_req) == -1) {
478602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
478702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_rr: t_accept: errno %d t_errno %d\n",
478802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
478902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_errno);
479002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
479102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
479202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
479302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
479402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
479502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
479602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
479702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_rr: t_accept complete t_look 0x%.4x",
479802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    t_look(s_data));
479902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
480002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    " remote is %s port %d\n",
480102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    inet_ntoa(*(struct in_addr *)&peeraddr_in.sin_addr),
480202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ntohs(peeraddr_in.sin_port));
480302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
480402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
480502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
480602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
480702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
480802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
480902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(xti_tcp_rr_request->measure_cpu);
481002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
481102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_rr_request->test_length > 0) {
481202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
481302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
481402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(xti_tcp_rr_request->test_length + PAD_TIME);
481502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
481602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
481702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
481802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = xti_tcp_rr_request->test_length * -1;
481902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
482002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
482102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
482202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
482302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
482402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr = recv_ring->buffer_ptr;
482502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining	= xti_tcp_rr_request->request_size;
482602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(request_bytes_remaining > 0) {
482702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((request_bytes_recvd=t_rcv(s_data,
482802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    temp_message_ptr,
482902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    request_bytes_remaining,
483002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    &xti_flags)) == SOCKET_ERROR) {
483102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR) {
483202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* the timer popped */
483302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
483402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
483502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
483602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
483702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"recv_xti_tcp_rr: t_rcv: errno %d t_errno %d len %d",
483802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno,
483902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_errno,
484002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		request_bytes_recvd);
484102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
484202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		" t_look 0x%x",
484302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		t_look(s_data));
484402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
484502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = t_errno;
484602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
484702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
484802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
484902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
485002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_bytes_remaining -= request_bytes_recvd;
485102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += request_bytes_recvd;
485202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
485302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
485402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
485502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
485602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
485702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
485802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
485902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
486002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
486102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo5\n");
486202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
486302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
486402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
486502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
486602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
486702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
486802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((bytes_sent=t_snd(s_data,
486902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 send_ring->buffer_ptr,
487002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 xti_tcp_rr_request->response_size,
487102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 0)) == -1) {
487202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
487302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
487402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
487502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
487602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"yo6\n");
487702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
487802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
487902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
488002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
488102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
488202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_xti_tcp_rr: t_rcv: errno %d t_errno %d len %d",
488302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno,
488402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      t_errno,
488502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      bytes_sent);
488602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
488702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      " t_look 0x%x",
488802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      t_look(s_data));
488902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
489002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = t_errno;
489102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
489202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
489302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
489402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
489502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
489602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
489702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
489802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
489902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
490002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
490102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
490202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
490302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
490402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
490502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
490602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
490702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(xti_tcp_rr_request->measure_cpu,&elapsed_time);
490802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
490902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  stop_timer(); /* this is probably unnecessary, but it shouldn't hurt */
491002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
491102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
491202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
491302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
491402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
491502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
491602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
491702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
491802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
491902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
492002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
492102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
492202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_rr: got %d transactions\n",
492302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
492402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
492502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
492602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
492702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_results->bytes_received = (trans_received *
492802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					(xti_tcp_rr_request->request_size +
492902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					 xti_tcp_rr_request->response_size));
493002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_results->trans_received = trans_received;
493102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_results->elapsed_time   = elapsed_time;
493202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_rr_results->cpu_method     = cpu_method;
493302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_rr_request->measure_cpu) {
493402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
493502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
493602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
493702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
493802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
493902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_rr: test complete, sending results.\n");
494002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
494102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
494202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
494302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are done with the socket, free it */
494402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  t_close(s_data);
494502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
494602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
494702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
494802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
494902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
495002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
495102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
495202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this test is intended to test the performance of establishing a */
495302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* connection, exchanging a request/response pair, and repeating. it */
495402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* is expected that this would be a good starting-point for */
495502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* comparision of T/TCP with classic TCP for transactional workloads. */
495602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* it will also look (can look) much like the communication pattern */
495702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* of http for www access. */
495802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
495902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
496002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_xti_tcp_conn_rr(char remote_host[])
496102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
496202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
496302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
496402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
496502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
496602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
496702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
496802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
496902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
497002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
497102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
497202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
497302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
497402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
497502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
497602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
497702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
497802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
497902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
498002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
498102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %%      %%      us/Tr   us/Tr\n\n";
498202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
498302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
498402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f\n";
498502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
498602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
498702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f   %-6.2f %-6.2f %-6.3f  %-6.3f\n";
498802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
498902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
499002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
499102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
499202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
499302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
499402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
499502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
499602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
499702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
499802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
499902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 			one = 1;
500002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
500102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
500202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
500302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
500402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
500502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
500602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
500702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
500802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET send_socket;
500902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
501002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
501102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	sock_opt_len = sizeof(int);
501202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
501302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
501402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
501502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
501602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
501702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
501802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
501902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
502002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
502102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	hostent	        *hp;
502202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in	server;
502302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct        sockaddr_in     *myaddr;
502402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned      int             addr;
502502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int                           myport;
502602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
502702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_conn_rr_request_struct	*xti_tcp_conn_rr_request;
502802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_conn_rr_response_struct	*xti_tcp_conn_rr_response;
502902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_conn_rr_results_struct	*xti_tcp_conn_rr_result;
503002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
503102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request =
503202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_conn_rr_request_struct *)netperf_request.content.test_specific_data;
503302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response =
503402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_conn_rr_response_struct *)netperf_response.content.test_specific_data;
503502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_result =
503602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_conn_rr_results_struct *)netperf_response.content.test_specific_data;
503702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
503802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
503902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
504002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
504102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
504202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
504302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in));
504402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (myaddr == NULL) {
504502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", sizeof(struct sockaddr_in));
504602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
504702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
504802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
504902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&server,
505002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(server));
505102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)myaddr,
505202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(struct sockaddr_in));
505302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr->sin_family = AF_INET;
505402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
505502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would seem that while HP-UX will allow an IP address (as a */
505602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* string) in a call to gethostbyname, other, less enlightened */
505702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* systems do not. fix from awjacks@ca.sandia.gov raj 10/95 */
505802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* order changed to check for IP address first. raj 7/96 */
505902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
506002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((addr = inet_addr(remote_host)) == SOCKET_ERROR) {
506102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was not an IP address, try it as a name */
506202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((hp = gethostbyname(remote_host)) == NULL) {
506302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have no idea what it is */
506402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
506502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "establish_control: could not resolve the destination %s\n",
506602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_host);
506702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
506802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
506902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
507002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
507102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it was a valid remote_host */
507202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bcopy(hp->h_addr,
507302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (char *)&server.sin_addr,
507402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    hp->h_length);
507502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      server.sin_family = hp->h_addrtype;
507602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
507702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
507802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
507902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it was a valid IP address */
508002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_addr.s_addr = addr;
508102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_family = AF_INET;
508202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
508302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
508402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
508502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"TCP Connect/Request/Response Test\n");
508602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage)
508702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,cpu_title,format_units());
508802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else
508902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,tput_title,format_units());
509002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
509102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
509202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
509302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
509402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	=	0;
509502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	=	0.0;
509602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 	0;
509702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
509802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffers with the requested alignment and offset */
509902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
510002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
510102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
510202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
510302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   req_size,
510402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_send_align,
510502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_send_offset);
510602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
510702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
510802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   rsp_size,
510902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_recv_align,
511002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_recv_offset);
511102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
511202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
511302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
511402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_xti_tcp_conn_rr: send_socket obtained...\n");
511502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
511602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
511702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user has requested cpu utilization measurements, we must */
511802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate the cpu(s). We will perform this task within the tests */
511902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* themselves. If the user has specified the cpu rate, then */
512002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate_local_cpu will return rather quickly as it will have */
512102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nothing to do. If local_cpu_rate is zero, then we will go through */
512202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the "normal" calibration stuff and return the rate back.*/
512302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
512402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage) {
512502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
512602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
512702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
512802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Tell the remote end to do a listen. The server alters the socket */
512902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* paramters on the other side at this point, hence the reason for */
513002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the values being passed in the setup message. If the user did */
513102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not specify any of the parameters, they will be passed as 0, which */
513202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will indicate to the remote that no changes beyond the system's */
513302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default should be used. Alignment is the exception, it will */
513402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default to 8, which will be no alignment alterations. */
513502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
513602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.request_type	        =	DO_XTI_TCP_CRR;
513702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->recv_buf_size	=	rsr_size;
513802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->send_buf_size	=	rss_size;
513902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->recv_alignment	=	remote_recv_align;
514002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->recv_offset	=	remote_recv_offset;
514102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->send_alignment	=	remote_send_align;
514202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->send_offset	=	remote_send_offset;
514302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->request_size	=	req_size;
514402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->response_size	=	rsp_size;
514502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->no_delay	        =	rem_nodelay;
514602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->measure_cpu	=	remote_cpu_usage;
514702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->cpu_rate	        =	remote_cpu_rate;
514802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->so_rcvavoid	=	rem_rcvavoid;
514902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request->so_sndavoid	=	rem_sndavoid;
515002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
515102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_conn_rr_request->test_length	=	test_time;
515202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
515302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
515402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_conn_rr_request->test_length	=	test_trans * -1;
515502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
515602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
515702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
515802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: send_xti_tcp_conn_rr: requesting TCP crr test\n");
515902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
516002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
516102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_request();
516202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
516302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The response from the remote will contain all of the relevant 	*/
516402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket parameters for this test type. We will put them back into 	*/
516502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the variables here so they can be displayed if desired.  The	*/
516602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote will have calibrated CPU if necessary, and will have done	*/
516702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the needed set-up we will have calibrated the cpu locally	*/
516802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before sending the request, and will grab the counter value right	*/
516902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the connect returns. The remote will grab the counter right	*/
517002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the accept call. This saves the hassle of extra messages	*/
517102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* being sent for the TCP tests.					*/
517202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
517302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
517402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
517502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
517602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsr_size	=	xti_tcp_conn_rr_response->recv_buf_size;
517702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rss_size	=	xti_tcp_conn_rr_response->send_buf_size;
517802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rem_nodelay	=	xti_tcp_conn_rr_response->no_delay;
517902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_usage=	xti_tcp_conn_rr_response->measure_cpu;
518002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_rate = 	xti_tcp_conn_rr_response->cpu_rate;
518102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* make sure that port numbers are in network order */
518202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_port	=	(short)xti_tcp_conn_rr_response->data_port_number;
518302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    server.sin_port =	htons(server.sin_port);
518402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
518502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote listen done.\n");
518602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote port is %d\n",ntohs(server.sin_port));
518702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
518802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
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    perror("netperf: remote error");
519302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
519402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
519502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
519602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
519702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Set-up the test end conditions. For a request/response test, they */
519802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can be either time or transaction based. */
519902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
520002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
520102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to end the test after a period of time. */
520202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
520302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
520402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(test_time);
520502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
520602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
520702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester wanted to send a number of bytes. */
520802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = test_bytes;
520902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
521002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
521102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
521202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The cpu_start routine will grab the current time and possibly */
521302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* value of the idle counter for later use in measuring cpu */
521402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* utilization and/or service demand and thruput. */
521502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
521602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(local_cpu_usage);
521702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
521802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We use an "OR" to control test execution. When the test is */
521902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* controlled by time, the byte count check will always return false. */
522002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* When the test is controlled by byte count, the time test will */
522102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* always return false. When the test is finished, the whole */
522202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* expression will go false and we will stop sending data. I think I */
522302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just arbitrarily decrement trans_remaining for the timed test, but */
522402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will not do that just yet... One other question is whether or not */
522502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the send buffer and the receive buffer should be the same buffer. */
522602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
522702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just for grins, start the port numbers at 65530. this should */
522802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* quickly flush-out those broken implementations of TCP which treat */
522902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the port number as a signed 16 bit quantity. */
523002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myport = 65530;
523102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr->sin_port = htons(myport);
523202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
523302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
523402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
523502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set up the data socket */
523602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_xti_endpoint(loc_xti_device);
523702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
523802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET) {
523902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_xti_tcp_conn_rr: tcp stream data socket");
524002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
524102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
524202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
524302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we set SO_REUSEADDR on the premis that no unreserved port */
524402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* number on the local system is going to be already connected to */
524502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the remote netserver's port number. we might still have a */
524602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* problem if there is a port in the unconnected state. In that */
524702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* case, we might want to throw-in a goto to the point where we */
524802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* increment the port number by one and try again. of course, this */
524902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* could lead to a big load of spinning. one thing that I might */
525002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* try later is to have the remote actually allocate a couple of */
525102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* port numbers and cycle through those as well. depends on if we */
525202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can get through all the unreserved port numbers in less than */
525302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the length of the TIME_WAIT state raj 8/94 */
525402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    one = 1;
525502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(setsockopt(send_socket, SOL_SOCKET, SO_REUSEADDR,
525602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (char *)&one, sock_opt_len) == SOCKET_ERROR) {
525702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_xti_tcp_conn_rr: so_reuseaddr");
525802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
525902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
526002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
526102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to bind our socket to a particular port number. */
526202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (bind(send_socket,
526302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     (struct sockaddr *)myaddr,
526402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
526502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("netperf: send_xti_tcp_conn_rr: tried to bind to port %d\n",
526602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     ntohs(myaddr->sin_port));
526702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_xti_tcp_conn_rr: bind");
526802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
526902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
527002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
527102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Connect up to the remote port on the data socket  */
527202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
527302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		(struct sockaddr *)&server,
527402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		sizeof(server)) == INVALID_SOCKET){
527502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
527602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we hit the end of a */
527702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timed test. */
527802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
527902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
528002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
528102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: data socket connect failed");
528202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("\tattempted to connect on socket %d to port %d",
528302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     send_socket,
528402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     ntohs(server.sin_port));
528502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf(" from port %d \n",ntohs(myaddr->sin_port));
528602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
528702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
528802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
528902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send the request */
529002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((len=send(send_socket,
529102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 send_ring->buffer_ptr,
529202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 req_size,
529302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 0)) != req_size) {
529402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
529502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we hit the end of a */
529602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timed test. */
529702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
529802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
529902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
530002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_xti_tcp_conn_rr: data send error");
530102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
530202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
530302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
530402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
530502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the response */
530602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsp_bytes_left = rsp_size;
530702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr  = recv_ring->buffer_ptr;
530802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(rsp_bytes_left > 0) {
530902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((rsp_bytes_recvd=recv(send_socket,
531002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       temp_message_ptr,
531102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       rsp_bytes_left,
531202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       0)) == SOCKET_ERROR) {
531302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR) {
531402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* We hit the end of a timed test. */
531502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
531602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
531702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
531802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("send_xti_tcp_conn_rr: data recv error");
531902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
532002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
532102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_left -= rsp_bytes_recvd;
532202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_message_ptr  += rsp_bytes_recvd;
532302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
532402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
532502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
532602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
532702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we may have been in a nested while loop - we need */
532802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* another call to break. */
532902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
533002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
533102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
533202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
533302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
533402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages++;
533502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
533602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
533702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
533802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
533902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 3) {
534002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
534102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "Transaction %d completed on local port %d\n",
534202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages,
534302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ntohs(myaddr->sin_port));
534402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
534502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
534602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
534702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnewport:
534802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* pick a new port number */
534902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport = ntohs(myaddr->sin_port);
535002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myport++;
535102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we do not want to use the port number that the server is */
535202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sitting at - this would cause us to fail in a loopback test */
535302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
535402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (myport == ntohs(server.sin_port)) myport++;
535502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
535602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wrap the port number when we get to 65535. NOTE, some broken */
535702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP's might treat the port number as a signed 16 bit quantity. */
535802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we aren't interested in testing such broekn implementations :) */
535902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* raj 8/94  */
536002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (myport == 65535) {
536102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      myport = 5000;
536202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
536302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    myaddr->sin_port = htons(myport);
536402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
536502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
536602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((myport % 1000) == 0) {
536702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	printf("port %d\n",myport);
536802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
536902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
537002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
537102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
537202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
537302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this call will always give us the elapsed time for the test, and */
537402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will also store-away the necessaries for cpu utilization */
537502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
537602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being measured? */
537702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how long did we really run? */
537802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
537902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Get the statistics from the remote end. The remote will have */
538002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculated service demand and all those interesting things. If it */
538102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* wasn't supposed to care, it will return obvious values. */
538202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
538302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
538402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
538502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
538602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote results obtained\n");
538702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
538802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
538902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
539002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: remote error");
539102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
539202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
539302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
539402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
539502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now calculate what our thruput was for the test. In the future, */
539602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we may want to include a calculation of the thruput measured by */
539702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote, but it should be the case that for a TCP stream test, */
539802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the two numbers should be *very* close... We calculate */
539902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bytes_sent regardless of the way the test length was controlled. */
540002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If it was time, we needed to, and if it was by bytes, the user may */
540102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* have specified a number of bytes that wasn't a multiple of the */
540202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_size, so we really didn't send what he asked for ;-) We use */
540302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
540402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 1024. A future enhancement *might* be to choose from a couple of */
540502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* unit selections. */
540602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
540702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
540802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  thruput	= calc_thruput(bytes_xferd);
540902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
541002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
541102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We must now do a little math for service demand and cpu */
541202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization for the system(s) */
541302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Of course, some of the information might be bogus because */
541402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was no idle counter in the kernel(s). We need to make */
541502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a note of this for the user's benefit...*/
541602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
541702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_rate == 0.0) {
541802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"WARNING WARNING WARNING  WARNING WARNING WARNING  WARNING!\n");
541902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Local CPU usage numbers based on process information only!\n");
542002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
542102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
542202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization = calc_cpu_util(0.0);
542302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
542402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
542502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
542602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand  = calc_service_demand((double) nummessages*1024,
542702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
542802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
542902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0);
543002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
543102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
543202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= -1.0;
543302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= -1.0;
543402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
543502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
543602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (remote_cpu_usage) {
543702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_rate == 0.0) {
543802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"DANGER  DANGER  DANGER    DANGER  DANGER  DANGER    DANGER!\n");
543902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Remote CPU usage numbers based on process information only!\n");
544002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
544102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
544202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = xti_tcp_conn_rr_result->cpu_util;
544302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
544402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
544502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
544602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand = calc_service_demand((double) nummessages*1024,
544702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
544802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  remote_cpu_utilization,
544902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  xti_tcp_conn_rr_result->num_cpus);
545002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
545102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
545202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = -1.0;
545302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = -1.0;
545402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
545502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
545602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
545702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
545802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
545902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
546002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
546102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
546202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
546302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
546402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
546502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
546602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
546702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
546802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
546902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
547002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand);
547102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
547202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
547302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
547402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
547502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand);
547602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
547702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
547802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
547902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
548002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
548102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
548202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
548302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
548402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
548502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
548602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time,
548702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
548802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
548902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
549002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
549102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
549202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
549302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
549402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
549502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
549602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
549702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
549802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
549902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
550002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
550102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
550202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
550302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
550402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
550502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
550602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
550702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
550802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
550902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
551002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
551102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
551202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
551302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
551402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
551502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
551602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
551702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
551802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
551902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
552002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
552102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
552202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
552302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
552402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
552502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
552602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
552702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
552802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
552902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
553002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
553102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
553202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
553302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
553402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
553502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
553602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
553702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt);
553802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
553902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
554002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
554102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
554202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
554302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
554402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_xti_tcp_conn_rr()
554502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
554602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
554702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  *message;
554802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in        myaddr_in,
554902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  peeraddr_in;
555002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET s_listen,s_data;
555102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	addrlen;
555202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*recv_message_ptr;
555302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*send_message_ptr;
555402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
555502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
555602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
555702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
555802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_recvd;
555902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
556002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
556102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
556202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
556302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_conn_rr_request_struct	*xti_tcp_conn_rr_request;
556402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_conn_rr_response_struct	*xti_tcp_conn_rr_response;
556502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	xti_tcp_conn_rr_results_struct	*xti_tcp_conn_rr_results;
556602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
556702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_request =
556802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_conn_rr_request_struct *)netperf_request.content.test_specific_data;
556902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response =
557002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_conn_rr_response_struct *)netperf_response.content.test_specific_data;
557102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_results =
557202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct xti_tcp_conn_rr_results_struct *)netperf_response.content.test_specific_data;
557302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
557402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
557502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_xti_tcp_conn_rr: entered...\n");
557602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
557702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
557802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
557902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
558002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
558102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
558202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
558302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
558402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
558502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
558602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
558702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
558802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
558902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
559002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
559102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
559202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
559302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_conn_rr: setting the response type...\n");
559402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
559502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
559602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
559702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = XTI_TCP_CRR_RESPONSE;
559802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
559902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
560002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_conn_rr: the response type is set...\n");
560102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
560202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
560302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
560402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset */
560502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(DATABUFFERLEN);
560602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
560702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", DATABUFFERLEN);
560802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
560902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
561002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
561102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variables to be at the desired */
561202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignments with the desired offsets. */
561302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
561402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
561502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
561602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_conn_rr: requested recv alignment of %d offset %d\n",
561702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_conn_rr_request->recv_alignment,
561802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_conn_rr_request->recv_offset);
561902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
562002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_conn_rr: requested send alignment of %d offset %d\n",
562102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_conn_rr_request->send_alignment,
562202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_conn_rr_request->send_offset);
562302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
562402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
562502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
562602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = ALIGN_BUFFER(message, xti_tcp_conn_rr_request->recv_alignment, xti_tcp_conn_rr_request->recv_offset);
562702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
562802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = ALIGN_BUFFER(message, xti_tcp_conn_rr_request->send_alignment, xti_tcp_conn_rr_request->send_offset);
562902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
563002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
563102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_conn_rr: receive alignment and offset set...\n");
563202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
563302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
563402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
563502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
563602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can put in OUR values !-) At some point, we may want to nail this */
563702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket to a particular network-level address, but for now, */
563802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* INADDR_ANY should be just fine. */
563902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
564002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bzero((char *)&myaddr_in,
564102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sizeof(myaddr_in));
564202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_family      = AF_INET;
564302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_addr.s_addr = INADDR_ANY;
564402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  myaddr_in.sin_port        = 0;
564502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
564602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
564702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
564802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
564902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_xti_tcp_conn_rr: grabbing a socket...\n");
565002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
565102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
565202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
565302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_xti_endpoint expects to find some things in the global */
565402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
565502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
565602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
565702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size = xti_tcp_conn_rr_request->send_buf_size;
565802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size = xti_tcp_conn_rr_request->recv_buf_size;
565902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = xti_tcp_conn_rr_request->no_delay;
566002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = xti_tcp_conn_rr_request->so_rcvavoid;
566102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = xti_tcp_conn_rr_request->so_sndavoid;
566202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
566302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_xti_endpoint(loc_xti_device);
566402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
566502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
566602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
566702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
566802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
566902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not create data socket\n");
567002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
567102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
567202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
567302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
567402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
567502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's get an address assigned to this socket so we can tell the */
567602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator how to reach the data socket. There may be a desire to */
567702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nail this socket to a specific IP address in a multi-homed, */
567802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multi-connection situation, but for now, we'll ignore the issue */
567902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and concentrate on single connection testing. */
568002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
568102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (bind(s_listen,
568202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   (struct sockaddr *)&myaddr_in,
568302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   sizeof(myaddr_in)) == SOCKET_ERROR) {
568402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
568502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
568602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
568702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
568802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not bind\n");
568902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
569002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
569102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
569202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
569302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
569402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
569502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
569602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
569702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
569802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
569902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
570002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not listen\n");
570102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
570202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
570302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
570402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
570502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
570602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
570702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
570802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
570902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
571002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
571102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
571202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
571302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
571402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
571502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"could not geetsockname\n");
571602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
571702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
571802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
571902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
572002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
572102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
572202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
572302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
572402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
572502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
572602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
572702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"telling the remote to call me at %d\n",
572802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    xti_tcp_conn_rr_response->data_port_number);
572902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
573002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
573102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
573202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
573302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
573402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
573502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
573602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
573702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
573802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
573902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response->cpu_rate = 0.0; 	/* assume no cpu */
574002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_conn_rr_request->measure_cpu) {
574102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_conn_rr_response->measure_cpu = 1;
574202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_conn_rr_response->cpu_rate =
574302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(xti_tcp_conn_rr_request->cpu_rate);
574402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
574502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
574602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
574702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
574802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
574902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
575002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response->send_buf_size = lss_size;
575102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response->recv_buf_size = lsr_size;
575202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response->no_delay = loc_nodelay;
575302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response->so_rcvavoid = loc_rcvavoid;
575402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_response->so_sndavoid = loc_sndavoid;
575502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
575602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
575702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
575802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
575902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
576002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
576102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
576202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
576302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(xti_tcp_conn_rr_request->measure_cpu);
576402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
576502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
576602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
576702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
576802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_conn_rr_request->test_length > 0) {
576902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
577002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
577102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(xti_tcp_conn_rr_request->test_length + PAD_TIME);
577202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
577302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
577402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
577502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = xti_tcp_conn_rr_request->test_length * -1;
577602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
577702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
577802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
577902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
578002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
578102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
578202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* accept a connection from the remote */
578302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((s_data=accept(s_listen,
578402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       (struct sockaddr *)&peeraddr_in,
578502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       &addrlen)) == INVALID_SOCKET) {
578602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
578702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the timer popped */
578802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
578902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
579002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
579102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_xti_tcp_conn_rr: accept: errno = %d\n",errno);
579202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
579302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      close(s_listen);
579402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
579502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
579602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
579702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
579802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
579902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_xti_tcp_conn_rr: accepted data connection.\n");
580002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
580102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
580202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
580302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr	= recv_message_ptr;
580402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining	= xti_tcp_conn_rr_request->request_size;
580502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
580602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the request from the other side */
580702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(request_bytes_remaining > 0) {
580802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((request_bytes_recvd=recv(s_data,
580902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   temp_message_ptr,
581002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   request_bytes_remaining,
581102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   0)) == SOCKET_ERROR) {
581202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR) {
581302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* the timer popped */
581402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
581502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
581602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
581702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = errno;
581802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
581902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
582002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
582102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
582202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_bytes_remaining -= request_bytes_recvd;
582302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += request_bytes_recvd;
582402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
582502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
582602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
582702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
582802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
582902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
583002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"yo5\n");
583102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
583202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
583302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
583402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
583502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
583602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((bytes_sent=send(s_data,
583702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_message_ptr,
583802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			xti_tcp_conn_rr_request->response_size,
583902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			0)) == SOCKET_ERROR) {
584002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
584102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
584202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
584302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo6\n");
584402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
584502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
584602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
584702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 99;
584802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
584902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
585002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
585102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
585202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
585302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
585402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
585502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
585602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
585702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
585802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
585902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_xti_tcp_conn_rr: Transaction %d complete\n",
586002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
586102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
586202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
586302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
586402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* close the connection */
586502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_data);
586602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
586702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
586802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
586902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
587002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
587102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
587202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
587302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(xti_tcp_conn_rr_request->measure_cpu,&elapsed_time);
587402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
587502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
587602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
587702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
587802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
587902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
588002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
588102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
588202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
588302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
588402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
588502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_conn_rr: got %d transactions\n",
588602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
588702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
588802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
588902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
589002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_results->bytes_received	= (trans_received *
589102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					   (xti_tcp_conn_rr_request->request_size +
589202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					    xti_tcp_conn_rr_request->response_size));
589302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_results->trans_received	= trans_received;
589402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  xti_tcp_conn_rr_results->elapsed_time	= elapsed_time;
589502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (xti_tcp_conn_rr_request->measure_cpu) {
589602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    xti_tcp_conn_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
589702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
589802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
589902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
590002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
590102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_xti_tcp_conn_rr: test complete, sending results.\n");
590202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
590302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
590402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
590502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
590602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
590702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
590802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
590902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
591002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_xti_usage()
591102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
591202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
591302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fwrite(xti_usage, sizeof(char), strlen(xti_usage), stdout);
591402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(1);
591502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
591602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
591702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
591802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
591902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectscan_xti_args(int argc, char *argv[])
592002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
592102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define XTI_ARGS "Dhm:M:r:s:S:Vw:W:X:"
592202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  extern int	optind, opterrs;  /* index of first unused arg 	*/
592302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  extern char	*optarg;	  /* pointer to option string	*/
592402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
592502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int		c;
592602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
592702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char
592802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    arg1[BUFSIZ],  /* argument holders		*/
592902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    arg2[BUFSIZ];
593002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
593102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (no_control) {
593202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
593302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "The XTI tests do not know how to run with no control connection\n");
593402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
593502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
593602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
593702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Go through all the command line arguments and break them */
593802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* out. For those options that take two parms, specifying only */
593902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the first will set both to that value. Specifying only the */
594002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* second will leave the first untouched. To change only the */
594102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first, use the form "first," (see the routine break_args.. */
594202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
594302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((c= getopt(argc, argv, XTI_ARGS)) != EOF) {
594402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (c) {
594502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '?':
594602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'h':
594702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      print_xti_usage();
594802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
594902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'D':
595002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the TCP nodelay flag */
595102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_nodelay = 1;
595202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay = 1;
595302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
595402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 's':
595502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set local socket sizes */
595602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
595702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
595802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lss_size = convert(arg1);
595902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
596002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lsr_size = convert(arg2);
596102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
596202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'S':
596302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set remote socket sizes */
596402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
596502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
596602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size = convert(arg1);
596702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
596802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size = convert(arg2);
596902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
597002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'r':
597102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the request/response sizes */
597202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
597302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
597402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	req_size = convert(arg1);
597502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
597602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_size = convert(arg2);
597702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
597802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'm':
597902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the send size */
598002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = convert(optarg);
598102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
598202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'M':
598302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the recv size */
598402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = convert(optarg);
598502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
598602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'W':
598702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the "width" of the user space data */
598802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* buffer. This will be the number of */
598902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send_size buffers malloc'd in the */
599002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* *_STREAM test. It may be enhanced to set */
599102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* both send and receive "widths" but for now */
599202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it is just the sending *_STREAM. */
599302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_width = convert(optarg);
599402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
599502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'V' :
599602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to do copy avoidance and will set */
599702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it for everything, everywhere, if we really */
599802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* can. of course, we don't know anything */
599902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* about the remote... */
600002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_SND_COPYAVOID
600102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 1;
600202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
600302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 0;
600402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Local send copy avoidance not available.\n");
600502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
600602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_RCV_COPYAVOID
600702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 1;
600802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
600902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 0;
601002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Local recv copy avoidance not available.\n");
601102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
601202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid = 1;
601302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid = 1;
601402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
601502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'X':
601602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the xti device file name(s) */
601702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
601802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
601902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strcpy(loc_xti_device,arg1);
602002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
602102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strcpy(rem_xti_device,arg2);
602202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
602302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
602402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
602502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
602602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_XTI */
6027