102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	nettest_dlpi.c						*/
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	the actual test routines...				*/
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_dlpi_co_stream()	perform a CO DLPI stream test	*/
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_dlpi_co_stream()					*/
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_dlpi_co_rr()	perform a CO DLPI req/res	*/
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_dlpi_co_rr()					*/
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_dlpi_cl_stream()	perform a CL DLPI stream test	*/
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_dlpi_cl_stream()					*/
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_dlpi_cl_rr()	perform a CL DLPI req/res	*/
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_dlpi_cl_rr()					*/
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_CONFIG_H
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "config.h"
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DLPI
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar	nettest_dlpi_id[]="\
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)nettest_dlpi.c (c) Copyright 1993,1995,2004 Hewlett-Packard Co. Version 2.4.3";
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <fcntl.h>
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <signal.h>
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <string.h>
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <time.h>
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <malloc.h>
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/stream.h>
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/stropts.h>
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/poll.h>
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __osf__
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/dlpihdr.h>
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* __osf__ */
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/dlpi.h>
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __hpux__
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/dlpi_ext.h>
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __hpux__ */
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __osf__ */
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "nettest_dlpi.h"
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* these are some variables global to all the DLPI tests. declare */
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* them static to make them global only to this file */
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rsw_size,		/* remote send window size	*/
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rrw_size,		/* remote recv window size	*/
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsw_size,		/* local  send window size 	*/
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lrw_size,		/* local  recv window size 	*/
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  req_size = 100,	/* request size                   	*/
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rsp_size = 200,	/* response size			*/
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_size,		/* how big are individual sends		*/
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_size;		/* how big are individual receives	*/
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_ppa = 4,          /* the ppa for the local interface, */
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* as shown as the NM Id in lanscan */
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_ppa = 4,          /* the ppa for the remote interface */
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_sap = 84;        /* which 802.2 SAP should we use?   */
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar loc_dlpi_device[32] = "/dev/dlpi";
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar rem_dlpi_device[32] = "/dev/dlpi";
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar dlpi_usage[] = "\n\
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectUsage: netperf [global options] -- [test options] \n\
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectCO/CL DLPI Test Options:\n\
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -D dev[,dev]      Set the local/remote DLPI device file name\n\
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -h                Display this text\n\
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -M bytes          Set the recv size (DLCO_STREAM, DLCL_STREAM)\n\
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -m bytes          Set the send size (DLCO_STREAM, DLCL_STREAM)\n\
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -p loc[,rem]      Set the local/remote PPA for the test\n\
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -R bytes          Set response size (DLCO_RR, DLCL_RR)\n\
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -r bytes          Set request size (DLCO_RR, DLCL_RR)\n\
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -s sap            Set the 802.2 sap for the test\n\
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -W send[,recv]    Set remote send/recv window sizes\n\
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -w send[,recv]    Set local send/recv window sizes\n\
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectFor those options taking two parms, at least one must be specified;\n\
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectspecifying one value without a comma will set both parms to that\n\
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvalue, specifying a value with a leading comma will set just the second\n\
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectparm, a value with a trailing comma will set just the first. To set\n\
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecteach parm to unique values, specify both and separate them with a\n\
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcomma.\n";
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the CO unidirectional data transfer test */
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* (a.k.a. stream) for the sockets interface. It receives its */
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* parameters via global variables from the shell and writes its */
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* output to the standard output. */
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_dlpi_co_stream()
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectWindow Window  Message  Elapsed              \n\
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectframes frames  bytes    secs.    %s/sec  \n\n";
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%5d  %5d  %6d    %-6.2f   %7.2f   \n";
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization    Service Demand\n\
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectWindow Window  Message  Elapsed              Send   Recv    Send    Recv\n\
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local  remote  local   remote\n\
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectframes frames  bytes    secs.    %-8.8s/s  %%      %%       us/KB   us/KB\n\n";
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f\n";
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%5d  %5d  %6d    %-6.2f     %7.2f   %-6.2f %-6.2f  %-6.3f  %-6.3f\n";
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Sends   %-8.8s Recvs\n\
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv             Send (avg)          Recv (avg)\n\
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f     %6d %6.2f   %6d\n";
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int interval_count;
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-size greater than our send window. this will insure that we */
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*message;
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*message_ptr;
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf send_message;
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  dlsap[BUFSIZ];
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   dlsap_len;
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	*message_int_ptr;
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	message_offset;
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	malloc_size;
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	send_descriptor;
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_remaining;
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can send > 32 bits worth of bytes */
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) */
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent;
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	i;
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_stream_request_struct	*dlpi_co_stream_request;
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_stream_response_struct	*dlpi_co_stream_response;
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_stream_results_struct	*dlpi_co_stream_result;
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request	=
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_co_stream_request_struct *)netperf_request.content.test_specific_data;
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_response	=
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_co_stream_response_struct *)netperf_response.content.test_specific_data;
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_result	        =
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_co_stream_results_struct *)netperf_response.content.test_specific_data;
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"DLPI CO STREAM TEST\n");
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage)
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,cpu_title,format_units());
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,tput_title,format_units());
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	=	0;
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_sent	=	0.0;
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 	0;
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*set up the data descriptor                        */
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_descriptor = dl_open(loc_dlpi_device,loc_ppa);
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_descriptor < 0){
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: send_dlpi_co_stream: dlpi stream data descriptor");
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bind the puppy and get the assigned dlsap */
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlsap_len = BUFSIZ;
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dl_bind(send_descriptor,
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              dlpi_sap, DL_CODLS, dlsap, &dlsap_len) != 0) {
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_co_rr: bind failure\n");
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_co_stream: send_descriptor obtained...\n");
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DL_HP_SET_LOCAL_WIN_REQ
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lsw_size > 0) {
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_dlpi_co_stream: window send size altered from system default...\n");
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"                          send: %d\n",lsw_size);
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lrw_size > 0) {
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: send_dlpi_co_stream: window recv size altered from system default...\n");
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"                          recv: %d\n",lrw_size);
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will find-out what the size actually became, and report */
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that back to the user. If the call fails, we will just report a -1 */
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* back to the initiator for the recv buffer size. */
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: send_dlpi_co_stream: window sizes determined...\n");
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"         send: %d recv: %d\n",lsw_size,lrw_size);
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ffluch(where);
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* DL_HP_SET_LOCAL_WIN_REQ */
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsw_size = -1;
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lrw_size = -1;
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DL_HP_SET_LOCAL_WIN_REQ */
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we should pick a default send_size, it should not be larger than */
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the min of the two interface MTU's, and should perhaps default to */
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the Interface MTU, but for now, we will default it to 1024... if */
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* someone wants to change this, the should change the corresponding */
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* lines in the recv_dlpi_co_stream routine */
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_size == 0) {
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_size = 1024;
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset. */
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* After we have calculated the proper starting address, we want to */
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* put that back into the message variable so we go back to the */
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* proper place. note that this means that only the first send is */
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* guaranteed to be at the alignment specified by the -a parameter. I */
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* think that this is a little more "real-world" than what was found */
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* in previous versions. note also that we have allocated a quantity */
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of memory that is at least one send-size greater than our socket */
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* buffer size. We want to be sure that there are at least two */
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* buffers allocated - this can be a bit of a problem when the */
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_size is bigger than the socket size, so we must check... the */
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user may have wanted to explicitly set the "width" of our send */
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* buffers, we should respect that wish... */
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) {
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_width = (lsw_size/send_size) + 1;
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 1) send_width++;
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   send_size,
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_send_align,
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   local_send_offset);
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.maxlen = send_size;
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.len = send_size;
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.buf = send_ring->buffer_ptr;
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user has requested cpu utilization measurements, we must */
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate the cpu(s). We will perform this task within the tests */
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* themselves. If the user has specified the cpu rate, then */
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate_local_cpu will return rather quickly as it will have */
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nothing to do. If local_cpu_rate is zero, then we will go through */
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the "normal" calibration stuff and return the rate back.*/
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage) {
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Tell the remote end to do a listen. The server alters the socket */
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* paramters on the other side at this point, hence the reason for */
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the values being passed in the setup message. If the user did */
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not specify any of the parameters, they will be passed as 0, which */
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will indicate to the remote that no changes beyond the system's */
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default should be used. */
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.request_type	 =	DO_DLPI_CO_STREAM;
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->send_win_size =	rsw_size;
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->recv_win_size =	rrw_size;
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->receive_size	 =	recv_size;
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->recv_alignment=	remote_recv_align;
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->recv_offset	 =	remote_recv_offset;
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->measure_cpu	 =	remote_cpu_usage;
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->cpu_rate	 =	remote_cpu_rate;
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->ppa           =      rem_ppa;
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->sap           =      dlpi_sap;
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->dev_name_len  =      strlen(rem_dlpi_device);
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strcpy(dlpi_co_stream_request->dlpi_device,
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 rem_dlpi_device);
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I didn't really want */
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) dlpi_co_stream_request->dlpi_device;
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((strlen(rem_dlpi_device) + 3) / 4);
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = ntohl(*charword);
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_stream_request->test_length	=	test_time;
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_stream_request->test_length	=	test_bytes;
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->dirty_count       =       rem_dirty_count;
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request->clean_count       =       rem_clean_count;
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: send_dlpi_co_stream: requesting DLPI CO stream test\n");
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_request();
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The response from the remote will contain all of the relevant 	*/
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters for this test type. We will put them back into 	*/
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the variables here so they can be displayed if desired.  The	*/
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote will have calibrated CPU if necessary, and will have done	*/
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the needed set-up we will have calibrated the cpu locally	*/
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before sending the request, and will grab the counter value right	*/
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the connect returns. The remote will grab the counter right	*/
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the accept call. This saves the hassle of extra messages	*/
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* being sent for the TCP tests.					*/
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote listen done.\n");
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rrw_size	=	dlpi_co_stream_response->recv_win_size;
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsw_size	=	dlpi_co_stream_response->send_win_size;
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_usage=	dlpi_co_stream_response->measure_cpu;
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_rate = 	dlpi_co_stream_response->cpu_rate;
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: remote error");
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Connect up to the remote port on the data descriptor */
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if(dl_connect(send_descriptor,
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		dlpi_co_stream_response->station_addr,
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		dlpi_co_stream_response->station_addr_len) != 0) {
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_stream: connect failure\n");
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Data Socket set-up is finished. If there were problems, either the */
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* connect would have failed, or the previous response would have */
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* indicated a problem. I failed to see the value of the extra */
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* message after the accept on the remote. If it failed, we'll see it */
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* here. If it didn't, we might as well start pumping data. */
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Set-up the test end conditions. For a stream test, they can be */
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* either time or byte-count based. */
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to end the test after a period of time. */
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_remaining = 0;
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(test_time);
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester wanted to send a number of bytes. */
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_remaining = test_bytes;
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The cpu_start routine will grab the current time and possibly */
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* value of the idle counter for later use in measuring cpu */
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* utilization and/or service demand and thruput. */
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(local_cpu_usage);
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We use an "OR" to control test execution. When the test is */
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* controlled by time, the byte count check will always return false. */
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* When the test is controlled by byte count, the time test will */
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* always return false. When the test is finished, the whole */
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* expression will go false and we will stop sending data. */
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize the random number generator for putting dirty stuff */
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* into the send buffer. raj */
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  srand((int) getpid());
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (bytes_remaining > 0)) {
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to dirty some number of consecutive integers in the buffer */
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are about to send. we may also want to bring some number of */
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* them cleanly into the cache. The clean ones will follow any dirty */
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ones into the cache. */
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr = (int *)message_ptr;
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < loc_dirty_count; i++) {
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *message_int_ptr = rand();
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < loc_clean_count; i++) {
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_dirty_count = *message_int_ptr;
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((putmsg(send_descriptor,
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0,
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &send_message,
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0)) != 0) {
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR)
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: data send error");
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_message.buf = send_ring->buffer_ptr;
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (interval_count = 0;
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 interval_count < interval_wate;
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 interval_count++);
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 4) {
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_clpi_co_stream: putmsg called ");
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"len is %d\n",send_message.len);
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages++;
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (bytes_remaining) {
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining -= send_size;
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test is over. Flush the buffers to the remote end. We do a */
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* graceful release to insure that all data has been taken by the */
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote. this needs a little work - there is no three-way */
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* handshake with type two as there is with TCP, so there really */
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* should be a message exchange here. however, we will finesse it by */
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* saying that the tests shoudl run for a while. */
49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"sending test end signal \n");
50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.len = (send_size - 1);
50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_message.len == 0) send_message.len = 2;
50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if((putmsg(send_descriptor,
50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     0,
50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     &send_message,
51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     0)) != 0) {
51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: data send error");
51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this call will always give us the elapsed time for the test, and */
51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will also store-away the necessaries for cpu utilization */
51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being measured? */
51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how long did we really run? */
52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Get the statistics from the remote end. The remote will have */
52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculated service demand and all those interesting things. If it */
52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* wasn't supposed to care, it will return obvious values. */
52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote results obtained\n");
52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: remote error");
53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now calculate what our thruput was for the test. In the future, */
53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we may want to include a calculation of the thruput measured by */
53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote, but it should be the case that for a TCP stream test, */
54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the two numbers should be *very* close... We calculate */
54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bytes_sent regardless of the way the test length was controlled. */
54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If it was time, we needed to, and if it was by bytes, the user may */
54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* have specified a number of bytes that wasn't a multiple of the */
54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_size, so we really didn't send what he asked for ;-) */
54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_sent	= ((double) send_size * (double) nummessages) + (double) len;
54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  thruput		= calc_thruput(bytes_sent);
54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We must now do a little math for service demand and cpu */
55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization for the system(s) */
55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Of course, some of the information might be bogus because */
55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was no idle counter in the kernel(s). We need to make */
55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a note of this for the user's benefit...*/
55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_rate == 0.0) {
55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"WARNING WARNING WARNING  WARNING WARNING WARNING  WARNING!\n");
55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
56002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"Local CPU usage numbers based on process information only!\n");
56102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
56202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
56302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= calc_cpu_util(0.0);
56402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= calc_service_demand(bytes_sent,
56502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
56602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
56702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
56802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
56902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
57002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= -1.0;
57102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= -1.0;
57202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
57302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (remote_cpu_usage) {
57502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_rate == 0.0) {
57602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
57702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"DANGER   DANGER  DANGER   DANGER   DANGER  DANGER   DANGER!\n");
57802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
57902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"Remote CPU usage numbers based on process information only!\n");
58002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
58102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
58202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization	= dlpi_co_stream_result->cpu_util;
58302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand	= calc_service_demand(bytes_sent,
58402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
58502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
58602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      dlpi_co_stream_result->num_cpus);
58702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
58802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
58902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = -1.0;
59002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = -1.0;
59102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
59202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
59402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
59502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
59602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
59702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
59802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
59902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
60002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
60102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
60302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
60402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
60502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
60602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
60702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand);
60802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
60902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
61002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
61102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
61202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand);
61302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
61402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
61502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
61602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
61702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
61802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
61902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rrw_size,		/* remote recvbuf size */
62002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsw_size,		/* local sendbuf size */
62102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
62202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
62302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		/* what was the xfer rate */
62402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
62502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
62602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
62702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
62802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
62902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
63002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
63102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
63202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
63302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
63402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
63502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
63602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
63702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
63802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
63902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
64002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
64102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
64202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
64302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rrw_size, 		/* remote recvbuf size */
64402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsw_size, 		/* local sendbuf size */
64502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
64602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
64702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);/* how fast did it go */
64802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
64902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
65002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
65102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
65302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
65402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
65502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
65602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
65702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
65902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
66002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
66102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
66202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
66302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
66502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
66602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
66702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
66802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
66902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
67002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
67102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
67202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
67302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
67402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
67502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
67602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)dlpi_co_stream_result->recv_calls,
67702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_co_stream_result->recv_calls);
67802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
67902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
68102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This is the server-side routine for the tcp stream test. It is */
68402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* implemented as one routine. I could break things-out somewhat, but */
68502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* didn't feel it was necessary. */
68602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
68802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_dlpi_co_stream()
68902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
69002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	data_descriptor;
69202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	flags = 0;
69302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	measure_cpu;
69402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_received;
69502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	receive_calls;
69602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
69702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
69902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*message_ptr;
70002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*message;
70102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   *message_int_ptr;
70202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf recv_message;
70302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   dirty_count;
70402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   clean_count;
70502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   i;
70602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
70702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_stream_request_struct	*dlpi_co_stream_request;
70802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_stream_response_struct	*dlpi_co_stream_response;
70902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_stream_results_struct	*dlpi_co_stream_results;
71002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_request	= (struct dlpi_co_stream_request_struct *)netperf_request.content.test_specific_data;
71202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_response	= (struct dlpi_co_stream_response_struct *)netperf_response.content.test_specific_data;
71302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_results	= (struct dlpi_co_stream_results_struct *)netperf_response.content.test_specific_data;
71402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
71602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_dlpi_co_stream: entered...\n");
71702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
71802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
71902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
72102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
72202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
72302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
72402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
72502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
72602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
72702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
72902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
73002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
73102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
73202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = DLPI_CO_STREAM_RESPONSE;
73402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
73602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
73702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
73902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_stream: requested alignment of %d\n",
74002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_co_stream_request->recv_alignment);
74102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
74202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
74302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a descriptor to listen on, and then listen on it. */
74602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
74802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_stream: grabbing a descriptor...\n");
74902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
75002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
75102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
75202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
75302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
75402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
75502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
75602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
75702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
75802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
75902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
76002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
76102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
76202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
76302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
76402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
76502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
76602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
76702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) dlpi_co_stream_request->dlpi_device;
76802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((dlpi_co_stream_request->dev_name_len + 3) / 4);
76902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
77102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
77202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
77302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = htonl(*charword);
77502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
77602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
77702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
77802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_descriptor = dl_open(dlpi_co_stream_request->dlpi_device,
78002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    dlpi_co_stream_request->ppa);
78102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (data_descriptor < 0) {
78202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
78302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
78402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
78502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
78602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
78702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's get an address assigned to this descriptor so we can tell the */
78802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator how to reach the data descriptor. There may be a desire to */
78902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nail this descriptor to a specific address in a multi-homed, */
79002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multi-connection situation, but for now, we'll ignore the issue */
79102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and concentrate on single connection testing. */
79202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
79302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bind the sap and retrieve the dlsap assigned by the system  */
79402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_response->station_addr_len = 14; /* arbitrary */
79502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dl_bind(data_descriptor,
79602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      dlpi_co_stream_request->sap,
79702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      DL_CODLS,
79802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      (char *)dlpi_co_stream_response->station_addr,
79902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      &dlpi_co_stream_response->station_addr_len) != 0) {
80002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_stream: bind failure\n");
80102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
80202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
80302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
80402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
80502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The initiator may have wished-us to modify the socket buffer */
80602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizes. We should give it a shot. If he didn't ask us to change the */
80702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizes, we should let him know what sizes were in use at this end. */
80802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If none of this code is compiled-in, then we will tell the */
80902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator that we were unable to play with the socket buffer by */
81002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* setting the size in the response to -1. */
81102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
81202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DL_HP_SET_LOCAL_WIN_REQ
81302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
81402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_stream_request->recv_win_size) {
81502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
81602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will find-out what the size actually became, and report */
81702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that back to the user. If the call fails, we will just report a -1 */
81802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* back to the initiator for the recv buffer size. */
81902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* the system won't let us play with the buffers */
82102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_response->recv_win_size	= -1;
82302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DL_HP_SET_LOCAL_WIN_REQ */
82502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what sort of sizes did we end-up with? */
82702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this bit of code whould default to the Interface MTU */
82802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_stream_request->receive_size == 0) {
82902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_size = 1024;
83002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
83102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
83202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_size = dlpi_co_stream_request->receive_size;
83302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
83402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
83502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* tell the other fellow what our receive size became */
83602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_response->receive_size = recv_size;
83702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
83802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just a little prep work for when we may have to behave like the */
83902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sending side... */
84002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(recv_size * 2);
84102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
84202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", recv_size * 2);
84302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
84402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
84502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_ptr = ALIGN_BUFFER(message, dlpi_co_stream_request->recv_alignment, dlpi_co_stream_request->recv_offset);
84702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.maxlen = recv_size;
84802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.len = 0;
84902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.buf = message_ptr;
85002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
85202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
85302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_stream: receive alignment and offset set...\n");
85402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
85502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
85602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
85802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
86002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
86102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
86202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
86302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
86402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_response->cpu_rate = 0.0; 	/* assume no cpu */
86602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_stream_request->measure_cpu) {
86702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_stream_response->measure_cpu = 1;
86802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_stream_response->cpu_rate =
86902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(dlpi_co_stream_request->cpu_rate);
87002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
87102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
87302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* accept a connection on this file descriptor. at some point, */
87502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* dl_accept will "do the right thing" with the last two parms, but */
87602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* for now it ignores them, so we will pass zeros. */
87702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if(dl_accept(data_descriptor, 0, 0) != 0) {
87902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
88002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_stream: error in accept, errno %d\n",
88102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
88202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
88302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
88402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
88502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
88602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
88702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
88802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
88902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver:recv_dlpi_co_stream: connection accepted\n");
89002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
89102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
89202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
89402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
89502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(dlpi_co_stream_request->measure_cpu);
89702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
89902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to dirty some number of consecutive integers in the buffer */
90002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are about to recv. we may also want to bring some number of */
90102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* them cleanly into the cache. The clean ones will follow any dirty */
90202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ones into the cache. */
90302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dirty_count = dlpi_co_stream_request->dirty_count;
90502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  clean_count = dlpi_co_stream_request->clean_count;
90602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_int_ptr = (int *)message_ptr;
90702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < dirty_count; i++) {
90802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *message_int_ptr = rand();
90902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr++;
91002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
91102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < clean_count; i++) {
91202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dirty_count = *message_int_ptr;
91302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr++;
91402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
91502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
91602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
91702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.len = recv_size;
91802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (recv_message.len == recv_size) {
91902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (getmsg(data_descriptor,
92002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0,
92102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &recv_message,
92202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &flags) != 0) {
92302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
92402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
92502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
92602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
92702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_received += recv_message.len;
92802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    receive_calls++;
92902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
93102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
93202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netserver:recv_dlpi_co_stream: getmsg accepted %d bytes\n",
93302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      recv_message.len);
93402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
93502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
93602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
93902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr = (int *)message_ptr;
94002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < dirty_count; i++) {
94102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *message_int_ptr = rand();
94202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
94302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
94402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < clean_count; i++) {
94502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      dirty_count = *message_int_ptr;
94602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
94702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
94802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
94902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
95002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
95102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
95202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to zero bytes received. */
95302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* should perform a disconnect to signal the sender that */
95402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have received all the data sent. */
95502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
95602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (close(data_descriptor) == -1) {
95702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
95802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
95902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
96002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
96102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(dlpi_co_stream_request->measure_cpu,&elapsed_time);
96302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
96502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
96702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
96802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_stream: got %d bytes\n",
96902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
97002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
97102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_stream: got %d recvs\n",
97202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
97302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
97402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
97502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_results->bytes_received	= bytes_received;
97702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_results->elapsed_time	= elapsed_time;
97802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_stream_results->recv_calls		= receive_calls;
97902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_stream_request->measure_cpu) {
98102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_stream_results->cpu_util	= calc_cpu_util(0.0);
98202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
98302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
98502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
98602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_stream: test complete, sending results.\n");
98702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
98802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
98902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
99102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
99202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*********************************/
99402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint send_dlpi_co_rr(char remote_host[])
99602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
99702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
99902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Local /Remote\n\
100002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Window Size   Request  Resp.   Elapsed  Trans.\n\
100102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Send   Recv   Size     Size    Time     Rate         \n\
100202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project frames frames bytes    bytes   secs.    per sec   \n\n";
100302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
100502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
100602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
100802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project %-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
100902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
101002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project %-6d %-6d\n";
101102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
101302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Local /Remote\n\
101402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Window Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
101502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Send   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
101602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project frames frames bytes   bytes  secs.   per sec  %%      %%      us/Tr   us/Tr\n\n";
101702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
101902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f\n";
102002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
102202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project %-6d %-6d %-6d  %-6d %-6.2f  %-6.2f   %-6.2f %-6.2f %-6.3f  %-6.3f\n";
102302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
102502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project %-6d %-6d\n";
102602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
102802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Alignment      Offset\n\
102902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Local  Remote  Local  Remote\n\
103002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project Send   Recv    Send   Recv\n\
103102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project %5d  %5d   %5d  %5d\n";
103202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
103502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
103602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	    dlsap_len;
103702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char      dlsap[BUFSIZ];
103802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   flags = 0;
104002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*send_message_ptr;
104102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*recv_message_ptr;
104202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
104302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf send_message;
104402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf recv_message;
104502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
104602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
104702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	send_descriptor;
104802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
104902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
105002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
105202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we assume that station adresses fit within two ints */
105402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int   remote_address[1];
105502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
105702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
105802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
105902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
106002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
106102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_rr_request_struct	*dlpi_co_rr_request;
106302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_rr_response_struct	*dlpi_co_rr_response;
106402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_rr_results_struct	*dlpi_co_rr_result;
106502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request	=
106702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_co_rr_request_struct *)netperf_request.content.test_specific_data;
106802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_response	=
106902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_co_rr_response_struct *)netperf_response.content.test_specific_data;
107002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_result	=
107102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_co_rr_results_struct *)netperf_response.content.test_specific_data;
107202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
107302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
107402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
107502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
107602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
107702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
107802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
107902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"DLPI CO REQUEST/RESPONSE TEST\n");
108002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage)
108102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,cpu_title,format_units());
108202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else
108302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,tput_title,format_units());
108402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
108502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
108602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
108702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
108802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	=	0;
108902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	=	0.0;
109002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 	0;
109102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffers with the requested alignment and offset */
109302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_message_ptr = (char *)malloc(req_size+MAXALIGNMENT+MAXOFFSET);
109402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (temp_message_ptr == NULL) {
109502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", req_size+MAXALIGNMENT+MAXOFFSET);
109602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
109702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
109802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = (char *)(( (long) temp_message_ptr +
109902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       (long) local_send_align - 1) &
110002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      ~((long) local_send_align - 1));
110102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = send_message_ptr + local_send_offset;
110202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.maxlen = req_size+MAXALIGNMENT+MAXOFFSET;
110302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.len    = req_size;
110402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.buf    = send_message_ptr;
110502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
110602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_message_ptr = (char *)malloc(rsp_size+MAXALIGNMENT+MAXOFFSET);
110702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (temp_message_ptr == NULL) {
110802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", rsp_size+MAXALIGNMENT+MAXOFFSET);
110902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
111002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
111102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = (char *)(( (long) temp_message_ptr +
111202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       (long) local_recv_align - 1) &
111302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      ~((long) local_recv_align - 1));
111402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = recv_message_ptr + local_recv_offset;
111502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.maxlen = rsp_size+MAXALIGNMENT+MAXOFFSET;
111602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.len    = 0;
111702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.buf    = send_message_ptr;
111802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*set up the data socket                        */
112002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_descriptor = dl_open(loc_dlpi_device,loc_ppa);
112202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_descriptor < 0){
112302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: send_dlpi_co_rr: tcp stream data descriptor");
112402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
112502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
112602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
112802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_co_rr: send_descriptor obtained...\n");
112902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
113002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bind the puppy and get the assigned dlsap */
113202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlsap_len = BUFSIZ;
113402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dl_bind(send_descriptor,
113502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      dlpi_sap, DL_CODLS, dlsap, &dlsap_len) != 0) {
113602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_co_rr: bind failure\n");
113702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
113802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
113902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
114002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
114102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Modify the local socket size. The reason we alter the send buffer */
114202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* size here rather than when the connection is made is to take care */
114302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of decreases in buffer size. Decreasing the window size after */
114402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* connection establishment is a TCP no-no. Also, by setting the */
114502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* buffer (window) size before the connection is established, we can */
114602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control the TCP MSS (segment size). The MSS is never more that 1/2 */
114702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the minimum receive buffer size at each half of the connection. */
114802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* This is why we are altering the receive buffer size on the sending */
114902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* size of a unidirectional transfer. If the user has not requested */
115002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the socket buffers be altered, we will try to find-out what */
115102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* their values are. If we cannot touch the socket buffer in any way, */
115202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we will set the values to -1 to indicate that.  */
115302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
115402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DL_HP_SET_LOCAL_WIN_REQ
115502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lsw_size > 0) {
115602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
115702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_dlpi_co_rr: socket send size altered from system default...\n");
115802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"                          send: %d\n",lsw_size);
115902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
116002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
116102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lrw_size > 0) {
116202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
116302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_dlpi_co_rr: socket recv size altered from system default...\n");
116402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"                          recv: %d\n",lrw_size);
116502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
116602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
116702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
116802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
116902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will find-out what the size actually became, and report */
117002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that back to the user. If the call fails, we will just report a -1 */
117102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* back to the initiator for the recv buffer size. */
117202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
117302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
117402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
117502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: send_dlpi_co_rr: socket sizes determined...\n");
117602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"         send: %d recv: %d\n",lsw_size,lrw_size);
117702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
117802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
117902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* DL_HP_SET_LOCAL_WIN_REQ */
118002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
118102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsw_size = -1;
118202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lrw_size = -1;
118302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
118402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DL_HP_SET_LOCAL_WIN_REQ */
118502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
118602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user has requested cpu utilization measurements, we must */
118702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate the cpu(s). We will perform this task within the tests */
118802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* themselves. If the user has specified the cpu rate, then */
118902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate_local_cpu will return rather quickly as it will have */
119002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nothing to do. If local_cpu_rate is zero, then we will go through */
119102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the "normal" calibration stuff and return the rate back.*/
119202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
119302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage) {
119402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
119502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
119602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
119702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Tell the remote end to do a listen. The server alters the socket */
119802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* paramters on the other side at this point, hence the reason for */
119902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the values being passed in the setup message. If the user did */
120002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not specify any of the parameters, they will be passed as 0, which */
120102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will indicate to the remote that no changes beyond the system's */
120202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default should be used. Alignment is the exception, it will */
120302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default to 8, which will be no alignment alterations. */
120402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.request_type	        =	DO_DLPI_CO_RR;
120602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->recv_win_size	=	rrw_size;
120702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->send_win_size	=	rsw_size;
120802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->recv_alignment	=	remote_recv_align;
120902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->recv_offset	=	remote_recv_offset;
121002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->send_alignment	=	remote_send_align;
121102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->send_offset	=	remote_send_offset;
121202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->request_size	=	req_size;
121302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->response_size	=	rsp_size;
121402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->measure_cpu	=	remote_cpu_usage;
121502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->cpu_rate	        =	remote_cpu_rate;
121602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->ppa               =       rem_ppa;
121702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->sap               =       dlpi_sap;
121802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request->dev_name_len      =       strlen(rem_dlpi_device);
121902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strcpy(dlpi_co_rr_request->dlpi_device,
122002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 rem_dlpi_device);
122102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
122202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
122302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
122402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
122502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
122602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
122702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
122802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
122902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
123002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
123102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
123202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
123302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) dlpi_co_rr_request->dlpi_device;
123502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((strlen(rem_dlpi_device) + 3) / 4);
123602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
123802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
123902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
124002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = ntohl(*charword);
124202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
124302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
124402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
124502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
124702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_request->test_length	=	test_time;
124802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
124902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
125002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_request->test_length	=	test_trans * -1;
125102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
125202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
125402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: send_dlpi_co_rr: requesting TCP stream test\n");
125502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
125602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_request();
125802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The response from the remote will contain all of the relevant 	*/
126002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket parameters for this test type. We will put them back into 	*/
126102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the variables here so they can be displayed if desired.  The	*/
126202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote will have calibrated CPU if necessary, and will have done	*/
126302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the needed set-up we will have calibrated the cpu locally	*/
126402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before sending the request, and will grab the counter value right	*/
126502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the connect returns. The remote will grab the counter right	*/
126602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the accept call. This saves the hassle of extra messages	*/
126702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* being sent for the TCP tests.					*/
126802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
127002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
127202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
127302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote listen done.\n");
127402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rrw_size	=	dlpi_co_rr_response->recv_win_size;
127502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsw_size	=	dlpi_co_rr_response->send_win_size;
127602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_usage=	dlpi_co_rr_response->measure_cpu;
127702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_rate = 	dlpi_co_rr_response->cpu_rate;
127802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
128002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
128102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
128202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: remote error");
128302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
128502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
128602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*Connect up to the remote port on the data descriptor  */
128802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if(dl_connect(send_descriptor,
129002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		dlpi_co_rr_response->station_addr,
129102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		dlpi_co_rr_response->station_addr_len) != 0) {
129202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_co_rr: connect failure\n");
129302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
129402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
129502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
129602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Data Socket set-up is finished. If there were problems, either the */
129802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* connect would have failed, or the previous response would have */
129902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* indicated a problem. I failed to see the value of the extra */
130002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* message after the accept on the remote. If it failed, we'll see it */
130102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* here. If it didn't, we might as well start pumping data. */
130202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Set-up the test end conditions. For a request/response test, they */
130402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can be either time or transaction based. */
130502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
130702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to end the test after a period of time. */
130802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
130902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
131002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(test_time);
131102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
131202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
131302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester wanted to send a number of bytes. */
131402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = test_bytes;
131502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
131602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
131702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The cpu_start routine will grab the current time and possibly */
131902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* value of the idle counter for later use in measuring cpu */
132002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* utilization and/or service demand and thruput. */
132102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(local_cpu_usage);
132302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We use an "OR" to control test execution. When the test is */
132502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* controlled by time, the byte count check will always return false. */
132602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* When the test is controlled by byte count, the time test will */
132702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* always return false. When the test is finished, the whole */
132802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* expression will go false and we will stop sending data. I think I */
132902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just arbitrarily decrement trans_remaining for the timed test, but */
133002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will not do that just yet... One other question is whether or not */
133102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the send buffer and the receive buffer should be the same buffer. */
133202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
133402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send the request */
133502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((putmsg(send_descriptor,
133602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0,
133702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &send_message,
133802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0)) != 0) {
133902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
134002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we hit the end of a */
134102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timed test. */
134202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
134302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
134402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
134502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_dlpi_co_rr: putmsg error");
134602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
134702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
134802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
134902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
135002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_message.len %d\n",recv_message.len);
135102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_message.len %d\n",send_message.len);
135202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
135302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
135402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the response */
135602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this needs some work with streams buffers if we are going to */
135702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* support requests and responses larger than the MTU of the */
135802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* network, but this can wait until later */
135902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsp_bytes_left = rsp_size;
136002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_message.len = rsp_size;
136102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(rsp_bytes_left > 0) {
136202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((getmsg(send_descriptor,
136302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 0,
136402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 &recv_message,
136502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 &flags)) < 0) {
136602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR) {
136702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* We hit the end of a timed test. */
136802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
136902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
137002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
137102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("send_dlpi_co_rr: data recv error");
137202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
137302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
137402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_left -= recv_message.len;
137502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
137602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
137802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we may have been in a nested while loop - we need */
137902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* another call to break. */
138002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
138102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
138202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages++;
138402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
138502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
138602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
138702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 3) {
138902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
139002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "Transaction %d completed\n",
139102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages);
139202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
139302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
139402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
139502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* At this point we used to call shutdown onthe data socket to be */
139702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sure all the data was delivered, but this was not germane in a */
139802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* request/response test, and it was causing the tests to "hang" when */
139902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* they were being controlled by time. So, I have replaced this */
140002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* shutdown call with a call to close that can be found later in the */
140102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* procedure. */
140202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this call will always give us the elapsed time for the test, and */
140402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will also store-away the necessaries for cpu utilization */
140502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being measured? */
140702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how long did we really run? */
140802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Get the statistics from the remote end. The remote will have */
141002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculated service demand and all those interesting things. If it */
141102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* wasn't supposed to care, it will return obvious values. */
141202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
141402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
141502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
141602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote results obtained\n");
141702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
141802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
141902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
142002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: remote error");
142102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
142202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
142302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
142402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
142502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now calculate what our thruput was for the test. In the future, */
142602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we may want to include a calculation of the thruput measured by */
142702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote, but it should be the case that for a TCP stream test, */
142802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the two numbers should be *very* close... We calculate */
142902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bytes_sent regardless of the way the test length was controlled. */
143002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If it was time, we needed to, and if it was by bytes, the user may */
143102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* have specified a number of bytes that wasn't a multiple of the */
143202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_size, so we really didn't send what he asked for ;-) We use */
143302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Kbytes/s as the units of thruput for a TCP stream test, where K = */
143402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 1024. A future enhancement *might* be to choose from a couple of */
143502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* unit selections. */
143602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
143702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
143802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  thruput		= calc_thruput(bytes_xferd);
143902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
144102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We must now do a little math for service demand and cpu */
144202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization for the system(s) */
144302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Of course, some of the information might be bogus because */
144402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was no idle counter in the kernel(s). We need to make */
144502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a note of this for the user's benefit...*/
144602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
144702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_rate == 0.0) {
144802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"WARNING WARNING WARNING  WARNING WARNING WARNING  WARNING!\n");
144902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Local CPU usage numbers based on process information only!\n");
145002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
145102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
145202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization = calc_cpu_util(0.0);
145302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
145402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
145502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
145602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand  = calc_service_demand((double) nummessages*1024,
145702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
145802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
145902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0);
146002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
146102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
146202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= -1.0;
146302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= -1.0;
146402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
146502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
146602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (remote_cpu_usage) {
146702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_rate == 0.0) {
146802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"DANGER  DANGER  DANGER    DANGER  DANGER  DANGER    DANGER!\n");
146902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Remote CPU usage numbers based on process information only!\n");
147002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
147102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
147202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = dlpi_co_rr_result->cpu_util;
147302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
147402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
147502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
147602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand = calc_service_demand((double) nummessages*1024,
147702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
147802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  remote_cpu_utilization,
147902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  dlpi_co_rr_result->num_cpus);
148002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
148102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
148202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = -1.0;
148302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = -1.0;
148402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
148502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
148602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
148702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
148802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
148902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
149002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
149102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
149202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
149302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
149402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
149602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
149702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
149802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
149902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
150002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand);
150102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
150202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
150302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
150402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
150502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand);
150602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
150702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
150802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
150902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
151002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
151102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsw_size,		/* local sendbuf size */
151202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lrw_size,
151302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
151402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
151502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
151602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time,
151702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
151802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
151902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
152002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
152102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
152202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
152302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsw_size,
152402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rrw_size);
152502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
152602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
152702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
152802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
152902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
153002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
153102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
153202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
153302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
153402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
153502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
153602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
153702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
153802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
153902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsw_size,
154002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lrw_size,
154102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
154202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
154302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
154402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
154502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
154602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
154702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsw_size, 		/* remote recvbuf size */
154802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rrw_size);
154902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
155102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
155202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
155302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
155502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
155602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
155702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
155802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
155902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
156102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
156202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
156302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
156402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
156502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
156702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt);
156802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
156902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test is over. Kill the data descriptor */
157002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (close(send_descriptor) == -1) {
157202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("send_dlpi_co_rr: cannot shutdown tcp stream descriptor");
157302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
157402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
157602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
157802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_dlpi_cl_stream(char remote_host[])
157902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
158002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /************************************************************************/
158102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*									*/
158202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*               	UDP Unidirectional Send Test                    */
158302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*									*/
158402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /************************************************************************/
158502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title =
158602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "Window  Message  Elapsed      Messages                \n\
158702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize    Size     Time         Okay Errors   Throughput\n\
158802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectframes  bytes    secs            #      #   %s/sec\n\n";
158902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
159102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
159202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
159402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%5d   %5d    %-7.2f   %7d %6d    %7.2f\n\
159502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d            %-7.2f   %7d           %7.2f\n\n";
159602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title =
159902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "Window  Message  Elapsed      Messages                   CPU     Service\n\
160002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize    Size     Time         Okay Errors   Throughput   Util    Demand\n\
160102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectframes  bytes    secs            #      #   %s/sec   %%       us/KB\n\n";
160202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
160402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.2f\n";
160502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
160702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%5d   %5d    %-7.2f   %7d %6d    %7.1f      %-6.2f  %-6.3f\n\
160802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d            %-7.2f   %7d           %7.1f      %-6.2f  %-6.3f\n\n";
160902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
161002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	messages_recvd;
161102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time,
161202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_cpu_utilization,
161302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  remote_cpu_utilization;
161402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
161502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand, remote_service_demand;
161602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	local_thruput, remote_thruput;
161702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent;
161802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_recvd;
161902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	*message_int_ptr;
162202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*message_ptr;
162302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*message;
162402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  sctl_data[BUFSIZ];
162502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf send_message;
162602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf sctl_message;
162702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_unitdata_req_t *data_req = (dl_unitdata_req_t *)sctl_data;
162802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char dlsap[BUFSIZ];
163002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int  dlsap_len;
163102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	message_offset;
163202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	message_max_offset;
163302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	failed_sends;
163402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	failed_cows;
163502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	messages_sent;
163602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	data_descriptor;
163702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
164002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	interval_count;
164102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
164202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
164302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	i;
164402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
164502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_stream_request_struct	*dlpi_cl_stream_request;
164702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_stream_response_struct	*dlpi_cl_stream_response;
164802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_stream_results_struct	*dlpi_cl_stream_results;
164902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request	= (struct dlpi_cl_stream_request_struct *)netperf_request.content.test_specific_data;
165102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_response	= (struct dlpi_cl_stream_response_struct *)netperf_response.content.test_specific_data;
165202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_results	= (struct dlpi_cl_stream_results_struct *)netperf_response.content.test_specific_data;
165302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
165502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("DLPI CL UNIDIRECTIONAL SEND TEST\n");
165602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage)
165702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf(cpu_title,format_units());
165802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else
165902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf(tput_title,format_units());
166002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
166102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  failed_sends	= 0;
166302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  messages_sent	= 0;
166402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up	= 0;
166502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*set up the data descriptor			*/
166702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_descriptor = dl_open(loc_dlpi_device,loc_ppa);
166902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (data_descriptor < 0){
167002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("send_dlpi_cl_stream: data descriptor");
167102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
167202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
167302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bind the puppy and get the assigned dlsap */
167502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlsap_len = BUFSIZ;
167602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dl_bind(data_descriptor,
167702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              dlpi_sap, DL_CLDLS, dlsap, &dlsap_len) != 0) {
167802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_cl_stream: bind failure\n");
167902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
168002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
168102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
168202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Modify the local socket size (SNDBUF size)    */
168402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DL_HP_SET_LOCAL_WIN_REQ
168602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lsw_size > 0) {
168702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
168802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_dlpi_cl_stream: descriptor send size altered from system default...\n");
168902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"                          send: %d\n",lsw_size);
169002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
169102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
169202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lrw_size > 0) {
169302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
169402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_dlpi_cl_stream: descriptor recv size altered from system default...\n");
169502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"                          recv: %d\n",lrw_size);
169602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
169702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
169802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will find-out what the size actually became, and report */
170102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that back to the user. If the call fails, we will just report a -1 */
170202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* back to the initiator for the recv buffer size. */
170302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* DL_HP_SET_LOCAL_WIN_REQ */
170502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsw_size = -1;
170702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lrw_size = -1;
170802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DL_HP_SET_LOCAL_WIN_REQ */
171002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now, we want to see if we need to set the send_size */
171202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_size == 0) {
171302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_size = 1024;
171402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
171502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset, */
171802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* most of the numbers here are just a hack to pick something nice */
171902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and big in an attempt to never try to send a buffer a second time */
172002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before it leaves the node...unless the user set the width */
172102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* explicitly. */
172202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 32;
172302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(send_size * (send_width + 1) + local_send_align + local_send_offset);
172402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
172502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", send_size * (send_width + 1) + local_send_align + local_send_offset);
172602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
172702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
172802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_ptr = (char *)(( (long) message +
172902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			  (long) local_send_align - 1) &
173002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 ~((long) local_send_align - 1));
173102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_ptr = message_ptr + local_send_offset;
173202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = message_ptr;
173302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.maxlen = send_size;
173402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.len = send_size;
173502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.buf = message;
173602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.maxlen = BUFSIZ;
173802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.len    = 0;
173902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.buf    = sctl_data;
174002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* if the user supplied a cpu rate, this call will complete rather */
174202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* quickly, otherwise, the cpu rate will be retured to us for */
174302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* possible display. The Library will keep it's own copy of this data */
174402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* for use elsewhere. We will only display it. (Does that make it */
174502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "opaque" to us?) */
174602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage)
174802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
174902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
175002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Tell the remote end to set up the data connection. The server */
175102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sends back the port number and alters the socket parameters there. */
175202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Of course this is a datagram service so no connection is actually */
175302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set up, the server just sets up the socket and binds it. */
175402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
175502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.request_type                 = DO_DLPI_CL_STREAM;
175602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->recv_win_size	        = rrw_size;
175702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->message_size	        = send_size;
175802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->recv_alignment	= remote_recv_align;
175902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->recv_offset		= remote_recv_offset;
176002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->measure_cpu		= remote_cpu_usage;
176102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->cpu_rate		= remote_cpu_rate;
176202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->ppa                   = rem_ppa;
176302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->sap                   = dlpi_sap;
176402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request->dev_name_len          = strlen(rem_dlpi_device);
176502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strcpy(dlpi_cl_stream_request->dlpi_device,
176602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 rem_dlpi_device);
176702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
176802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
176902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
177102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
177202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
177302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
177402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
177502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
177602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
177702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
177802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
177902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
178002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) dlpi_cl_stream_request->dlpi_device;
178202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((strlen(rem_dlpi_device) + 3) / 4);
178302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
178502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
178602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
178702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = ntohl(*charword);
178902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
179002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
179102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
179202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
179302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
179402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_stream_request->test_length	=	test_time;
179502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
179602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
179702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_stream_request->test_length	=	test_bytes * -1;
179802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
179902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_request();
180202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
180402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
180602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
180702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_dlpi_cl_stream: remote data connection done.\n");
180802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
180902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
181002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
181102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("send_dlpi_cl_stream: error on remote");
181202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
181302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
181402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
181502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* place some of the remote's addressing information into the send */
181602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* structure so our sends can be sent to the correct place. Also get */
181702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* some of the returned socket buffer information for user display. */
181802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
181902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the destination addressing control info */
182002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_req->dl_primitive = DL_UNITDATA_REQ;
182102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bcopy((char *)(dlpi_cl_stream_response->station_addr),
182202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	((char *)data_req + sizeof(dl_unitdata_req_t)),
182302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	dlpi_cl_stream_response->station_addr_len);
182402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_req->dl_dest_addr_offset = sizeof(dl_unitdata_req_t);
182502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_req->dl_dest_addr_length = dlpi_cl_stream_response->station_addr_len;
182602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* there is a dl_priority structure too, but I am ignoring it for */
182702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the time being. */
182802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* however... it is best to put some value in there lest some code
182902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     get grumpy about it - fix from Nicolas Thomas */
183002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_req->dl_priority.dl_min = DL_QOS_DONT_CARE;
183102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_req->dl_priority.dl_max = DL_QOS_DONT_CARE;
183202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.len = sizeof(dl_unitdata_req_t) +
183402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_dest_addr_length;
183502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rrw_size	        = dlpi_cl_stream_response->recv_win_size;
183702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rsw_size	        = dlpi_cl_stream_response->send_win_size;
183802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  remote_cpu_rate	= dlpi_cl_stream_response->cpu_rate;
183902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set up the timer to call us after test_time	*/
184202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  start_timer(test_time);
184302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Get the start count for the idle counter and the start time */
184502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(local_cpu_usage);
184702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
184902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  interval_count = interval_burst;
185002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
185102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
185202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Send datagrams like there was no tomorrow */
185302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (!times_up) {
185402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
185502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to dirty some number of consecutive integers in the buffer */
185602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are about to send. we may also want to bring some number of */
185702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* them cleanly into the cache. The clean ones will follow any dirty */
185802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ones into the cache. */
185902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr = (int *)message_ptr;
186002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < loc_dirty_count; i++) {
186102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *message_int_ptr = 4;
186202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
186302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
186402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < loc_clean_count; i++) {
186502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_dirty_count = *message_int_ptr;
186602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
186702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
186802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
186902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (putmsg(data_descriptor,
187002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &sctl_message,
187102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &send_message,
187202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0)  != 0) {
187302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
187402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
187502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
187602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == ENOBUFS) {
187702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we might not ever hit this with STREAMS, it would probably */
187802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* be better to do a getinfo request at the end of the test to */
187902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* get all sorts of gory statistics. in the meantime, we will */
188002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* keep this code in place. */
188102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	failed_sends++;
188202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	continue;
188302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
188402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_dlpi_cl_stream: data send error");
188502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
188602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"messages_sent %u\n",messages_sent);
188702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
188802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
188902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
189002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
189102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_sent++;
189202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* now we want to move our pointer to the next position in the */
189402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data buffer...since there was a successful send */
189502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
189802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* in this case, the interval count is the count-down couter */
189902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to decide to sleep for a little bit */
190002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) && (--interval_count == 0)) {
190102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* call the sleep routine for some milliseconds, if our */
190202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timer popped while we were in there, we want to */
190302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* break out of the loop. */
190402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (msec_sleep(interval_wate)) {
190502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
190602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
190702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      interval_count = interval_burst;
190802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
190902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
191102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
191302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* This is a timed test, so the remote will be returning to us after */
191502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* a time. We should not need to send any "strange" messages to tell */
191602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote that the test is completed, unless we decide to add a */
191702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* number of messages to the test. */
191802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the test is over, so get stats and stuff */
192002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(local_cpu_usage,
192102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   &elapsed_time);
192202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
192302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Get the statistics from the remote end	*/
192402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
192502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
192602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
192702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_dlpi_cl_stream: remote results obtained\n");
192802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
192902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
193002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
193102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("send_dlpi_cl_stream: error on remote");
193202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
193302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
193402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_sent	= send_size * messages_sent;
193602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_thruput	= calc_thruput(bytes_sent);
193702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  messages_recvd	= dlpi_cl_stream_results->messages_recvd;
193902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_recvd	= send_size * messages_recvd;
194002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we asume that the remote ran for as long as we did */
194202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  remote_thruput	= calc_thruput(bytes_recvd);
194402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* print the results for this descriptor and message size */
194602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
194802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We must now do a little math for service demand and cpu */
194902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization for the system(s) We pass zeros for the local */
195002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* cpu utilization and elapsed time to tell the routine to use */
195102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the libraries own values for those. */
195202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
195302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_rate == 0.0) {
195402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"WARNING WARNING WARNING  WARNING WARNING WARNING  WARNING!\n");
195502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Local CPU usage numbers based on process information only!\n");
195602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
195702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
195802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= calc_cpu_util(0.0);
196002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= calc_service_demand(bytes_sent,
196102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
196202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
196302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
196402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
196502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
196602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= -1.0;
196702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= -1.0;
196802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
196902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The local calculations could use variables being kept by */
197102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the local netlib routines. The remote calcuations need to */
197202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have a few things passed to them. */
197302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (remote_cpu_usage) {
197402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_rate == 0.0) {
197502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"DANGER   DANGER  DANGER   DANGER  DANGER   DANGER   DANGER!\n");
197602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"REMOTE CPU usage numbers based on process information only!\n");
197702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
197802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
197902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization	= dlpi_cl_stream_results->cpu_util;
198102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand	= calc_service_demand(bytes_recvd,
198202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
198302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
198402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      dlpi_cl_stream_results->num_cpus);
198502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
198602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
198702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization	= -1.0;
198802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand	= -1.0;
198902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
199002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
199102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
199202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
199302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
199402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
199502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
199602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
199702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
199802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
199902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
200102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
200202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
200302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
200402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
200502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand);
200602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
200702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
200802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
200902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
201002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand);
201102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
201202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
201302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
201402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
201502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
201602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsw_size,		/* local sendbuf size */
201702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
201802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
201902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_sent,
202002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      failed_sends,
202102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput, 		/* what was the xfer rate */
202202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
202302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
202402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rrw_size,
202502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,
202602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_recvd,
202702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_thruput,
202802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
202902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
203002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
203102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
203202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
203302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
203402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
203502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
203602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
203702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
203802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
203902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput);
204002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
204102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
204202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
204302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
204402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsw_size, 		/* local sendbuf size */
204502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
204602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
204702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_sent,
204802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      failed_sends,
204902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_thruput,
205002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rrw_size, 		/* remote recvbuf size */
205102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,
205202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      messages_recvd,
205302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_thruput
205402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      );
205502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
205602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
205702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
205802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
205902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
206102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_dlpi_cl_stream()
206202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
206302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  *message;
206502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	data_descriptor;
206602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
206702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*message_ptr;
206802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  rctl_data[BUFSIZ];
206902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf recv_message;
207002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf rctl_message;
207102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int flags = 0;
207202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* these are to make reading some of the DLPI control messages easier */
207302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_unitdata_ind_t *data_ind = (dl_unitdata_ind_t *)rctl_data;
207402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_uderror_ind_t  *uder_ind = (dl_uderror_ind_t *)rctl_data;
207502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_received = 0;
207702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
207802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	message_size;
208002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	messages_recvd = 0;
208102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	measure_cpu;
208202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_stream_request_struct	*dlpi_cl_stream_request;
208402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_stream_response_struct	*dlpi_cl_stream_response;
208502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_stream_results_struct	*dlpi_cl_stream_results;
208602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_request	= (struct dlpi_cl_stream_request_struct *)netperf_request.content.test_specific_data;
208802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_response	= (struct dlpi_cl_stream_response_struct *)netperf_response.content.test_specific_data;
208902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_results	= (struct dlpi_cl_stream_results_struct *)netperf_response.content.test_specific_data;
209002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
209102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
209202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_dlpi_cl_stream: entered...\n");
209302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
209402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
209502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
209602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen descriptor with all the desired */
209702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
209802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
209902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
210002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
210102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
210202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
210302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
210402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
210502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
210602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
210702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
210802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
210902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
211002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_stream: setting the response type...\n");
211102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
211202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
211302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
211402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = DLPI_CL_STREAM_RESPONSE;
211502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
211602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 2) {
211702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_stream: the response type is set...\n");
211802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
211902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
212002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset */
212202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(DATABUFFERLEN);
212302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
212402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", DATABUFFERLEN);
212502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
212602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
212702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
212902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
213002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
213202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_stream: requested alignment of %d\n",
213302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_cl_stream_request->recv_alignment);
213402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
213502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
213602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_ptr = ALIGN_BUFFER(message, dlpi_cl_stream_request->recv_alignment, dlpi_cl_stream_request->recv_offset);
213802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_stream_request->message_size > 0) {
214002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_message.maxlen = dlpi_cl_stream_request->message_size;
214102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
214202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
214302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_message.maxlen = 4096;
214402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
214502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.len    = 0;
214602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.buf    = message_ptr;
214702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
214802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.maxlen = BUFSIZ;
214902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.len    = 0;
215002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.buf    = rctl_data;
215102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
215202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
215302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
215402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_cl_stream: receive alignment and offset set...\n");
215502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
215602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
215702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
215802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
215902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_stream: grabbing a descriptor...\n");
216002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
216102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
216202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
216302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
216402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
216502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
216602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
216702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
216802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
216902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
217002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
217102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
217202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
217302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
217402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
217502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
217602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) dlpi_cl_stream_request->dlpi_device;
217702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((dlpi_cl_stream_request->dev_name_len + 3) / 4);
217802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
217902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
218002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
218102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
218202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = htonl(*charword);
218402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
218502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
218602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
218702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_descriptor = dl_open(dlpi_cl_stream_request->dlpi_device,
218902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    dlpi_cl_stream_request->ppa);
219002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (data_descriptor < 0) {
219102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
219202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
219302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
219402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
219502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
219602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The initiator may have wished-us to modify the window */
219702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizes. We should give it a shot. If he didn't ask us to change the */
219802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizes, we should let him know what sizes were in use at this end. */
219902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If none of this code is compiled-in, then we will tell the */
220002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator that we were unable to play with the sizes by */
220102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* setting the size in the response to -1. */
220202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DL_HP_SET_LOCAL_WIN_REQ
220402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_stream_request->recv_win_size) {
220602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_stream_response->recv_win_size	= -1;
220702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
220802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* the system won't let us play with the buffers */
221002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_response->recv_win_size	= -1;
221202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DL_HP_SET_LOCAL_WIN_REQ */
221402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_response->test_length = dlpi_cl_stream_request->test_length;
221602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bind the sap and retrieve the dlsap assigned by the system  */
221802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_response->station_addr_len = 14; /* arbitrary */
221902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dl_bind(data_descriptor,
222002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      dlpi_cl_stream_request->sap,
222102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      DL_CLDLS,
222202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      (char *)dlpi_cl_stream_response->station_addr,
222302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      &dlpi_cl_stream_response->station_addr_len) != 0) {
222402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_cl_stream: bind failure\n");
222502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
222602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
222702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
222802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
223002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
223102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
223202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
223302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
223402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
223502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
223602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
223702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_response->cpu_rate = 0.0; 	/* assume no cpu */
223802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_stream_request->measure_cpu) {
223902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We will pass the rate into the calibration routine. If the */
224002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user did not specify one, it will be 0.0, and we will do a */
224102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "real" calibration. Otherwise, all it will really do is */
224202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* store it away... */
224302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_stream_response->measure_cpu = 1;
224402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_stream_response->cpu_rate = calibrate_local_cpu(dlpi_cl_stream_request->cpu_rate);
224502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
224602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
224702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_size	= dlpi_cl_stream_request->message_size;
224802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  test_time	= dlpi_cl_stream_request->test_length;
224902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
225102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
225302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
225402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(dlpi_cl_stream_request->measure_cpu);
225602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the timer pops, or if we happen to recv a */
225802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* message of less than send_size bytes... */
225902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up = 0;
226102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  start_timer(test_time + PAD_TIME);
226202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
226402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_stream: about to enter inner sanctum.\n");
226502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
226602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
226702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (!times_up) {
226902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((getmsg(data_descriptor,
227002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &rctl_message,
227102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &recv_message,
227202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &flags) != 0) ||
227302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       (data_ind->dl_primitive != DL_UNITDATA_IND)) {
227402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
227502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* Again, we have likely hit test-end time */
227602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
227702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
227802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
227902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "dlpi_recv_cl_stream: getmsg failure: errno %d primitive 0x%x\n",
228002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno,
228102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      data_ind->dl_primitive);
228202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
228302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 996;
228402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
228502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
228602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
228702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    messages_recvd++;
228802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
228902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
229102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_stream: got %d messages.\n",messages_recvd);
229202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
229302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
229402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due timer or < send_size bytes received. */
229702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(dlpi_cl_stream_request->measure_cpu,&elapsed_time);
229902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (times_up) {
230102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended on a timer, subtract the PAD_TIME */
230202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= (float)PAD_TIME;
230302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
230402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
230502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    stop_timer();
230602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
230702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
230902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_stream: test ended in %f seconds.\n",elapsed_time);
231002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
231102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
231202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We will count the "off" message */
231502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_received = (messages_recvd * message_size) + len;
231602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
231802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
232002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
232102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_cl_stream: got %d bytes\n",
232202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
232302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
232402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
232502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type		= DLPI_CL_STREAM_RESULTS;
232702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_results->bytes_received	= bytes_received;
232802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_results->messages_recvd	= messages_recvd;
232902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_stream_results->elapsed_time	= elapsed_time;
233002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_stream_request->measure_cpu) {
233102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_stream_results->cpu_util	= calc_cpu_util(elapsed_time);
233202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
233302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
233402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_stream_results->cpu_util	= -1.0;
233502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
233602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
233702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
233802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
233902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_cl_stream: test complete, sending results.\n");
234002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
234102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
234202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
234402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
234602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint send_dlpi_cl_rr(char remote_host[])
234802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
234902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
235102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
235202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectWindow Size   Request  Resp.   Elapsed  Trans.\n\
235302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
235402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectframes frames bytes    bytes   secs.    per sec   \n\n";
235502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
235702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
235802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
236002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
236102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
236202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
236302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
236502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
236602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectWindow Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
236702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
236802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectframes frames bytes   bytes  secs.   per sec  %%      %%      us/Tr   us/Tr\n\n";
236902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
237102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f\n";
237202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
237402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f   %-6.2f %-6.2f %-6.3f  %-6.3f\n";
237502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
237702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
237802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
238002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
238102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
238202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
238302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
238402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
238702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   dlsap_len;
238902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   flags = 0;
239002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*send_message_ptr;
239102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*recv_message_ptr;
239202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
239302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  sctl_data[BUFSIZ];
239402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  rctl_data[BUFSIZ];
239502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  dlsap[BUFSIZ];
239602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf send_message;
239702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf recv_message;
239802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf sctl_message;
239902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf rctl_message;
240002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* these are to make reading some of the DLPI control messages easier */
240202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_unitdata_ind_t *data_ind = (dl_unitdata_ind_t *)rctl_data;
240302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_unitdata_req_t *data_req = (dl_unitdata_req_t *)sctl_data;
240402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_uderror_ind_t  *uder_ind = (dl_uderror_ind_t *)rctl_data;
240502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
240702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	send_descriptor;
240802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
240902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_xferd;
241002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
241202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
241302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
241402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
241502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double thruput;
241602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
241802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* timing stuff */
241902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define	MAX_KEPT_TIMES	1024
242002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	time_index = 0;
242102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	unused_buckets;
242202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	kept_times[MAX_KEPT_TIMES];
242302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	sleep_usecs;
242402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned	int	total_times=0;
242502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	timezone	dummy_zone;
242602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	timeval		send_time;
242702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	timeval		recv_time;
242802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	timeval		sleep_timeval;
242902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
243002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_rr_request_struct	*dlpi_cl_rr_request;
243202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_rr_response_struct	*dlpi_cl_rr_response;
243302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_rr_results_struct	*dlpi_cl_rr_result;
243402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request	=
243602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_cl_rr_request_struct *)netperf_request.content.test_specific_data;
243702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_response	=
243802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_cl_rr_response_struct *)netperf_response.content.test_specific_data;
243902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_result	=
244002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_cl_rr_results_struct *)netperf_response.content.test_specific_data;
244102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to zero out the times, so we can detect unused entries. */
244302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
244402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_index = 0;
244502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (time_index < MAX_KEPT_TIMES) {
244602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    kept_times[time_index] = 0;
244702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_index += 1;
244802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
244902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_index = 0;
245002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
245102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (print_headers) {
245302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"DLPI CL REQUEST/RESPONSE TEST\n");
245402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage)
245502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,cpu_title,format_units());
245602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else
245702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,tput_title,format_units());
245802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
245902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
246002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
246102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
246202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nummessages	=	0;
246302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	=	0;
246402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up 	= 	0;
246502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
246602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset */
246702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_message_ptr = (char *)malloc(req_size+MAXALIGNMENT+MAXOFFSET);
246802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (temp_message_ptr == NULL) {
246902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", req_size+MAXALIGNMENT+MAXOFFSET);
247002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
247102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
247202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = (char *)(( (long)temp_message_ptr +
247302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       (long) local_send_align - 1) &
247402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      ~((long) local_send_align - 1));
247502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = send_message_ptr + local_send_offset;
247602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.maxlen = req_size;
247702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.len    = req_size;
247802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.buf    = send_message_ptr;
247902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
248002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_message_ptr = (char *)malloc(rsp_size+MAXALIGNMENT+MAXOFFSET);
248102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (temp_message_ptr == NULL) {
248202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", rsp_size+MAXALIGNMENT+MAXOFFSET);
248302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
248402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
248502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = (char *)(( (long)temp_message_ptr +
248602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       (long) local_recv_align - 1) &
248702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      ~((long) local_recv_align - 1));
248802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = recv_message_ptr + local_recv_offset;
248902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.maxlen = rsp_size;
249002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.len    = 0;
249102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.buf    = recv_message_ptr;
249202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.maxlen = BUFSIZ;
249402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.len    = 0;
249502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.buf    = sctl_data;
249602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.maxlen = BUFSIZ;
249802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.len    = 0;
249902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.buf    = rctl_data;
250002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* lets get ourselves a file descriptor */
250202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_descriptor = dl_open(loc_dlpi_device,loc_ppa);
250402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_descriptor < 0){
250502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: send_dlpi_cl_rr: dlpi cl rr send descriptor");
250602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
250702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
250802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
251002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_cl_rr: send_descriptor obtained...\n");
251102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
251202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
251302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bind the sap to the descriptor and get the dlsap */
251402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlsap_len = BUFSIZ;
251502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dl_bind(send_descriptor,
251602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      dlpi_sap,
251702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      DL_CLDLS,
251802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      dlsap,
251902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      &dlsap_len) != 0) {
252002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_cl_rr: bind failure\n");
252102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
252202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
252302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
252402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
252502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Modify the local socket size. If the user has not requested that */
252602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket buffers be altered, we will try to find-out what their */
252702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* values are. If we cannot touch the socket buffer in any way, we */
252802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will set the values to -1 to indicate that.  The receive socket */
252902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must have enough space to hold addressing information so += a */
253002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizeof struct sockaddr_in to it. */
253102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
253202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is actually nothing code, and should be replaced with the */
253302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alalagous calls in the STREAM test where the window size is set */
253402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with the HP DLPI Extension. raj 8/94 */
253502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_SNDBUF
253602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lsw_size > 0) {
253702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
253802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_dlpi_cl_rr: local window size altered from system default...\n");
253902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"                          window: %d\n",lsw_size);
254002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
254102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
254202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lrw_size > 0) {
254302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
254402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_dlpi_cl_rr: remote window size altered from system default...\n");
254502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"                          remote: %d\n",lrw_size);
254602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
254702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
254802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
254902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will find-out what the size actually became, and report */
255102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that back to the user. If the call fails, we will just report a -1 */
255202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* back to the initiator for the recv buffer size. */
255302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
255502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: send_dlpi_cl_rr: socket sizes determined...\n");
255602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"         send: %d recv: %d\n",lsw_size,lrw_size);
255702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
255802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* SO_SNDBUF */
256002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
256102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsw_size = -1;
256202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lrw_size = -1;
256302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
256402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* SO_SNDBUF */
256502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
256602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If the user has requested cpu utilization measurements, we must */
256702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate the cpu(s). We will perform this task within the tests */
256802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* themselves. If the user has specified the cpu rate, then */
256902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calibrate_local_cpu will return rather quickly as it will have */
257002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* nothing to do. If local_cpu_rate is zero, then we will go through */
257102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the "normal" calibration stuff and return the rate back. If */
257202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* there is no idle counter in the kernel idle loop, the */
257302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local_cpu_rate will be set to -1. */
257402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage) {
257602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
257702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
257802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Tell the remote end to do a listen. The server alters the socket */
258002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* paramters on the other side at this point, hence the reason for */
258102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the values being passed in the setup message. If the user did */
258202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not specify any of the parameters, they will be passed as 0, which */
258302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will indicate to the remote that no changes beyond the system's */
258402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default should be used. Alignment is the exception, it will */
258502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* default to 8, which will be no alignment alterations. */
258602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
258702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.request_type	        =	DO_DLPI_CL_RR;
258802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->recv_win_size	=	rrw_size;
258902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->send_win_size	=	rsw_size;
259002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->recv_alignment	=	remote_recv_align;
259102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->recv_offset	=	remote_recv_offset;
259202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->send_alignment	=	remote_send_align;
259302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->send_offset	=	remote_send_offset;
259402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->request_size	=	req_size;
259502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->response_size	=	rsp_size;
259602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->measure_cpu	=	remote_cpu_usage;
259702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->cpu_rate	        =	remote_cpu_rate;
259802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->ppa               =       rem_ppa;
259902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->sap               =       dlpi_sap;
260002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request->dev_name_len      =       strlen(rem_dlpi_device);
260102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strcpy(dlpi_cl_rr_request->dlpi_device,
260202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 rem_dlpi_device);
260302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
260502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
260702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
260802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
260902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
261002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
261102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
261202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
261302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
261402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
261502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
261602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
261702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) dlpi_cl_rr_request->dlpi_device;
261802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((strlen(rem_dlpi_device) + 3) / 4);
261902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
262102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
262202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
262302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = ntohl(*charword);
262502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
262602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
262702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
262802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
263002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_rr_request->test_length	=	test_time;
263102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
263202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
263302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_rr_request->test_length	=	test_trans * -1;
263402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
263502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
263702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: send_dlpi_cl_rr: requesting DLPI CL request/response test\n");
263802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
263902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_request();
264102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The response from the remote will contain all of the relevant 	*/
264302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket parameters for this test type. We will put them back into 	*/
264402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the variables here so they can be displayed if desired.  The	*/
264502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote will have calibrated CPU if necessary, and will have done	*/
264602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the needed set-up we will have calibrated the cpu locally	*/
264702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before sending the request, and will grab the counter value right	*/
264802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the connect returns. The remote will grab the counter right	*/
264902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* after the accept call. This saves the hassle of extra messages	*/
265002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* being sent for the tests.                                          */
265102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
265202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
265302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
265402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
265502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
265602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote listen done.\n");
265702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rrw_size	=	dlpi_cl_rr_response->recv_win_size;
265802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rsw_size	=	dlpi_cl_rr_response->send_win_size;
265902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_usage=	dlpi_cl_rr_response->measure_cpu;
266002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_rate = 	dlpi_cl_rr_response->cpu_rate;
266102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the destination addressing control info */
266302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_primitive = DL_UNITDATA_REQ;
266402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bcopy((char *)(dlpi_cl_rr_response->station_addr),
266502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  ((char *)data_req + sizeof(dl_unitdata_req_t)),
266602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  dlpi_cl_rr_response->station_addr_len);
266702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_dest_addr_offset = sizeof(dl_unitdata_req_t);
266802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_dest_addr_length = dlpi_cl_rr_response->station_addr_len;
266902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there is a dl_priority structure too, but I am ignoring it for */
267002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the time being. */
267102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctl_message.len = sizeof(dl_unitdata_req_t) +
267202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      data_req->dl_dest_addr_length;
267302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* famous last words - some DLPI providers get unhappy if the
267402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       priority stuff is not initialized.  fix from Nicolas Thomas. */
267502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_priority.dl_min = DL_QOS_DONT_CARE;
267602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_priority.dl_max = DL_QOS_DONT_CARE;
267702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
267802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
267902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
268002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
268102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: remote error");
268202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
268302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
268402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
268502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Data Socket set-up is finished. If there were problems, either the */
268602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* connect would have failed, or the previous response would have */
268702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* indicated a problem. I failed to see the value of the extra */
268802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* message after the accept on the remote. If it failed, we'll see it */
268902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* here. If it didn't, we might as well start pumping data. */
269002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Set-up the test end conditions. For a request/response test, they */
269202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can be either time or transaction based. */
269302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time) {
269502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to end the test after a period of time. */
269602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
269702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
269802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(test_time);
269902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
270002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
270102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester wanted to send a number of bytes. */
270202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = test_bytes;
270302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
270402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
270502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The cpu_start routine will grab the current time and possibly */
270702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* value of the idle counter for later use in measuring cpu */
270802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* utilization and/or service demand and thruput. */
270902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(local_cpu_usage);
271102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We use an "OR" to control test execution. When the test is */
271302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* controlled by time, the byte count check will always return false. */
271402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* When the test is controlled by byte count, the time test will */
271502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* always return false. When the test is finished, the whole */
271602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* expression will go false and we will stop sending data. I think I */
271702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just arbitrarily decrement trans_remaining for the timed test, but */
271802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will not do that just yet... One other question is whether or not */
271902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the send buffer and the receive buffer should be the same buffer. */
272002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
272102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send the request */
272202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
272302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    gettimeofday(&send_time,&dummy_zone);
272402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
272502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(putmsg(send_descriptor,
272602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      &sctl_message,
272702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      &send_message,
272802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      0) != 0) {
272902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
273002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* We likely hit */
273102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* test-end time. */
273202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
273302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
273402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there is more we could do here, but it can wait */
273502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_dlpi_cl_rr: data send error");
273602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
273702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
273802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the response. at some point, we will need to handle */
274002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sending responses which are greater than the datalink MTU. we */
274102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* may also want to add some DLPI error checking, but for now we */
274202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will ignore that and just let errors stop the test with little */
274302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indication of what might actually be wrong. */
274402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
274502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((getmsg(send_descriptor,
274602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &rctl_message,
274702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &recv_message,
274802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &flags) != 0) ||
274902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       (data_ind->dl_primitive != DL_UNITDATA_IND)) {
275002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
275102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* Again, we have likely hit test-end time */
275202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
275302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
275402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
275502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "send_dlpi_cl_rr: recv error: errno %d primitive 0x%x\n",
275602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno,
275702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      data_ind->dl_primitive);
275802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
275902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
276002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
276102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
276202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    gettimeofday(&recv_time,&dummy_zone);
276302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
276402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* now we do some arithmatic on the two timevals */
276502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_time.tv_usec < send_time.tv_usec) {
276602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we wrapped around a second */
276702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_time.tv_usec += 1000000;
276802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_time.tv_sec  -= 1;
276902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
277002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and store it away */
277202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    kept_times[time_index] = (recv_time.tv_sec - send_time.tv_sec) * 1000000;
277302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    kept_times[time_index] += (recv_time.tv_usec - send_time.tv_usec);
277402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we may wish to sleep for some period of */
277602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* time, so we see how long that last transaction just took, */
277702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and sleep for the difference of that and the interval. We */
277802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will not sleep if the time would be less than a */
277902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* millisecond.  */
278002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (interval_usecs > 0) {
278102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sleep_usecs = interval_usecs - kept_times[time_index];
278202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (sleep_usecs > 1000) {
278302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we sleep */
278402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sleep_timeval.tv_sec = sleep_usecs / 1000000;
278502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sleep_timeval.tv_usec = sleep_usecs % 1000000;
278602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	select(0,
278702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0,
278802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0,
278902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0,
279002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &sleep_timeval);
279102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
279202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
279302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
279402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* now up the time index */
279502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_index = (time_index +1)%MAX_KEPT_TIMES;
279602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
279702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages++;
279802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
279902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
280002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
280102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
280202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 3) {
280302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"Transaction %d completed\n",nummessages);
280402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
280502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
280602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
280702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
280802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
280902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this call will always give us the elapsed time for the test, and */
281002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will also store-away the necessaries for cpu utilization */
281102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
281202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being measured? */
281302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how long did we really run? */
281402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
281502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Get the statistics from the remote end. The remote will have */
281602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculated service demand and all those interesting things. If it */
281702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* wasn't supposed to care, it will return obvious values. */
281802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
281902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response();
282002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!netperf_response.content.serv_errno) {
282102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug)
282202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"remote results obtained\n");
282302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
282402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
282502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(netperf_response.content.serv_errno);
282602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: remote error");
282702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
282802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
282902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
283002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now calculate what our thruput was for the test. In the future, */
283202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we may want to include a calculation of the thruput measured by */
283302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote, but it should be the case that for a UDP stream test, */
283402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the two numbers should be *very* close... We calculate */
283502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bytes_sent regardless of the way the test length was controlled. */
283602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If it was time, we needed to, and if it was by bytes, the user may */
283702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* have specified a number of bytes that wasn't a multiple of the */
283802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_size, so we really didn't send what he asked for ;-) We use */
283902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
284102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  thruput		= calc_thruput(bytes_xferd);
284202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
284402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We must now do a little math for service demand and cpu */
284502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization for the system(s) */
284602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Of course, some of the information might be bogus because */
284702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was no idle counter in the kernel(s). We need to make */
284802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a note of this for the user's benefit...*/
284902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
285002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_rate == 0.0) {
285102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"WARNING WARNING WARNING  WARNING WARNING WARNING  WARNING!\n");
285202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Local CPU usage numbers based on process information only!\n");
285302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
285402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
285502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization = calc_cpu_util(0.0);
285602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
285702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
285802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
285902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand  = calc_service_demand((double) nummessages*1024,
286002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
286102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0.0,
286202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						  0);
286302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
286402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
286502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= -1.0;
286602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= -1.0;
286702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
286802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (remote_cpu_usage) {
287002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_rate == 0.0) {
287102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"DANGER  DANGER  DANGER    DANGER  DANGER  DANGER    DANGER!\n");
287202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"Remote CPU usage numbers based on process information only!\n");
287302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
287402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
287502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = dlpi_cl_rr_result->cpu_util;
287602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* since calc_service demand is doing ms/Kunit we will */
287702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* multiply the number of transaction by 1024 to get */
287802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* "good" numbers */
287902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = calc_service_demand((double) nummessages*1024,
288002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						   0.0,
288102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						   remote_cpu_utilization,
288202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						   dlpi_cl_rr_result->num_cpus);
288302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
288402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
288502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = -1.0;
288602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = -1.0;
288702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
288802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
288902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We are now ready to print all the information. If the user */
289002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* has specified zero-level verbosity, we will just print the */
289102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* local service demand, or the remote service demand. If the */
289202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user has requested verbosity level 1, he will get the basic */
289302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* "streamperf" numbers. If the user has specified a verbosity */
289402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of greater than 1, we will display a veritable plethora of */
289502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* background information from outside of this block as it it */
289602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not cpu_measurement specific...  */
289702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
289802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
289902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
290002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
290102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
290202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
290302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand);
290402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
290502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
290602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
290702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
290802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand);
290902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
291002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
291102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
291202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
291302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
291402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
291502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsw_size,		/* local sendbuf size */
291602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lrw_size,
291702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
291802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
291902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
292002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time,
292102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
292202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
292302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
292402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
292502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
292602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
292702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsw_size,
292802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rrw_size);
292902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
293002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
293102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
293202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
293302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
293402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
293502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
293602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
293702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
293802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
293902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
294002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
294102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
294202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
294302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
294402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsw_size,
294502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lrw_size,
294602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
294702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
294802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
294902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      nummessages/elapsed_time);
295002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
295102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
295202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsw_size, 		/* remote recvbuf size */
295302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rrw_size);
295402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
295602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
295702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
295802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
296002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
296102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
296202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
296302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
296402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
296602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
296702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
296802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* UDP statistics, the alignments of the sends and receives */
296902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
297002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
297102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
297202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    kept_times[MAX_KEPT_TIMES] = 0;
297302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_index = 0;
297402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while (time_index < MAX_KEPT_TIMES) {
297502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (kept_times[time_index] > 0) {
297602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	total_times += kept_times[time_index];
297702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
297802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else
297902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	unused_buckets++;
298002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      time_index += 1;
298102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
298202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    total_times /= (MAX_KEPT_TIMES-unused_buckets);
298302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
298402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Average response time %d usecs\n",
298502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    total_times);
298602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
298702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
298802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
298902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
299102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_dlpi_cl_rr()
299202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
299302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  *message;
299502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	data_descriptor;
299602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   flags = 0;
299702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	measure_cpu;
299802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*recv_message_ptr;
300002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*send_message_ptr;
300102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  sctl_data[BUFSIZ];
300202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  rctl_data[BUFSIZ];
300302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  dlsap[BUFSIZ];
300402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf send_message;
300502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf recv_message;
300602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf sctl_message;
300702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf rctl_message;
300802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
300902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* these are to make reading some of the DLPI control messages easier */
301002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_unitdata_ind_t *data_ind = (dl_unitdata_ind_t *)rctl_data;
301102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_unitdata_req_t *data_req = (dl_unitdata_req_t *)sctl_data;
301202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_uderror_ind_t  *uder_ind = (dl_uderror_ind_t *)rctl_data;
301302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
301502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
301602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
301702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_rr_request_struct	*dlpi_cl_rr_request;
301902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_rr_response_struct	*dlpi_cl_rr_response;
302002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_cl_rr_results_struct	*dlpi_cl_rr_results;
302102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_request  =
302302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_cl_rr_request_struct *)netperf_request.content.test_specific_data;
302402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_response =
302502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_cl_rr_response_struct *)netperf_response.content.test_specific_data;
302602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_results  =
302702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct dlpi_cl_rr_results_struct *)netperf_response.content.test_specific_data;
302802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
303002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_dlpi_cl_rr: entered...\n");
303102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
303202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
303302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
303402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen descriptor with all the desired */
303502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
303602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
303702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the descriptor sizes cannot be changed, then we will */
303802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
303902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
304002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
304102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
304302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
304402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
304502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
304602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
304802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_rr: setting the response type...\n");
304902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
305002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
305102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = DLPI_CL_RR_RESPONSE;
305302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
305502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_rr: the response type is set...\n");
305602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
305702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
305802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset */
306002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(DATABUFFERLEN);
306102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
306202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", DATABUFFERLEN);
306302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
306402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
306502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
306602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variables to be at the desired */
306702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignments with the desired offsets. */
306802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
306902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
307002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
307102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_cl_rr: requested recv alignment of %d offset %d\n",
307202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_cl_rr_request->recv_alignment,
307302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_cl_rr_request->recv_offset);
307402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
307502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_cl_rr: requested send alignment of %d offset %d\n",
307602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_cl_rr_request->send_alignment,
307702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_cl_rr_request->send_offset);
307802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
307902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
308002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = ALIGN_BUFFER(message, dlpi_cl_rr_request->recv_alignment, dlpi_cl_rr_request->recv_offset);
308202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.maxlen = dlpi_cl_rr_request->request_size;
308302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.len    = 0;
308402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.buf    = recv_message_ptr;
308502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = ALIGN_BUFFER(message, dlpi_cl_rr_request->send_alignment, dlpi_cl_rr_request->send_offset);
308702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.maxlen = dlpi_cl_rr_request->response_size;
308802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.len    = dlpi_cl_rr_request->response_size;
308902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.buf    = send_message_ptr;
309002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.maxlen = BUFSIZ;
309202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.len    = 0;
309302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctl_message.buf    = sctl_data;
309402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.maxlen = BUFSIZ;
309602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.len    = 0;
309702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rctl_message.buf    = rctl_data;
309802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
310002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_rr: receive alignment and offset set...\n");
310102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_cl_rr: grabbing a socket...\n");
310202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
310302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
310402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
310702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
310902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
311002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
311102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
311202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
311302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
311402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
311502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
311602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
311702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
311802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) dlpi_cl_rr_request->dlpi_device;
312002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((dlpi_cl_rr_request->dev_name_len + 3) / 4);
312102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
312302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
312402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
312502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = htonl(*charword);
312702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
312802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
312902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
313002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_descriptor = dl_open(dlpi_cl_rr_request->dlpi_device,
313202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    dlpi_cl_rr_request->ppa);
313302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (data_descriptor < 0) {
313402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
313502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
313602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
313702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
313802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The initiator may have wished-us to modify the window */
314102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizes. We should give it a shot. If he didn't ask us to change the */
314202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizes, we should let him know what sizes were in use at this end. */
314302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If none of this code is compiled-in, then we will tell the */
314402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator that we were unable to play with the sizes by */
314502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* setting the size in the response to -1. */
314602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DL_HP_SET_LOCAL_WIN_REQ
314802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_rr_request->recv_win_size) {
315002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
315102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_rr_request->send_win_size) {
315302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
315402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will find-out what the sizes actually became, and report */
315602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* them back to the user. If the calls fail, we will just report a -1 */
315702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* back to the initiator for the buffer size. */
315802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* the system won't let us play with the buffers */
316002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_response->recv_win_size	= -1;
316202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_response->send_win_size	= -1;
316302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DL_HP_SET_LOCAL_WIN_REQ */
316502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bind the sap and retrieve the dlsap assigned by the system  */
316702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_response->station_addr_len = 14; /* arbitrary */
316802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dl_bind(data_descriptor,
316902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      dlpi_cl_rr_request->sap,
317002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      DL_CLDLS,
317102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      (char *)dlpi_cl_rr_response->station_addr,
317202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      &dlpi_cl_rr_response->station_addr_len) != 0) {
317302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_dlpi_cl_rr: bind failure\n");
317402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
317502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
317602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
317702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
317902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
318102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
318202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
318302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
318402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
318502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_response->cpu_rate = 0.0; 	/* assume no cpu */
318702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_rr_request->measure_cpu) {
318802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_rr_response->measure_cpu = 1;
318902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_rr_response->cpu_rate = calibrate_local_cpu(dlpi_cl_rr_request->cpu_rate);
319002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
319102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
319302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
319502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start receiving. */
319602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(dlpi_cl_rr_request->measure_cpu);
319802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_rr_request->test_length > 0) {
320002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
320102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
320202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(dlpi_cl_rr_request->test_length + PAD_TIME);
320302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
320402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectelse {
320502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up = 1;
320602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_remaining = dlpi_cl_rr_request->test_length * -1;
320702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
320802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
321002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
321102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the request from the other side. at some point we need */
321202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* to handle "logical" requests and responses which are larger */
321302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* than the data link MTU */
321402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
321502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((getmsg(data_descriptor,
321602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &rctl_message,
321702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &recv_message,
321802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &flags) != 0) ||
321902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       (data_ind->dl_primitive != DL_UNITDATA_IND)) {
322002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
322102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* Again, we have likely hit test-end time */
322202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
322302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
322402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
322502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "dlpi_recv_cl_rr: getmsg failure: errno %d primitive 0x%x\n",
322602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno,
322702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      data_ind->dl_primitive);
322802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
322902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "                 recevied %u transactions\n",
323002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
323102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
323202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 995;
323302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
323402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
323502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
323602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote. first copy the dlsap */
323802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* information from the receive to the sending control message */
323902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_dest_addr_offset = sizeof(dl_unitdata_req_t);
324102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bcopy((char *)data_ind + data_ind->dl_src_addr_offset,
324202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  (char *)data_req + data_req->dl_dest_addr_offset,
324302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  data_ind->dl_src_addr_length);
324402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_dest_addr_length = data_ind->dl_src_addr_length;
324502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_primitive = DL_UNITDATA_REQ;
324602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* be sure to initialize the priority fields. fix from Nicholas
324702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       Thomas */
324802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_priority.dl_min = DL_QOS_DONT_CARE;
324902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    data_req->dl_priority.dl_max = DL_QOS_DONT_CARE;
325002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctl_message.len = sizeof(dl_unitdata_req_t) +
325202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      data_ind->dl_src_addr_length;
325302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(putmsg(data_descriptor,
325402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      &sctl_message,
325502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      &send_message,
325602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      0) != 0) {
325702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
325802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* We likely hit */
325902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* test-end time. */
326002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
326102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
326202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there is more we could do here, but it can wait */
326302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
326402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "dlpi_recv_cl_rr: putmsg failure: errno %d\n",
326502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
326602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
326702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 993;
326802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
326902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
327002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
327102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
327302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
327402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
327502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
327602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
327802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
327902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_dlpi_cl_rr: Transaction %d complete.\n",
328002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
328102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
328202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
328302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
328502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
328802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
328902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
329002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(dlpi_cl_rr_request->measure_cpu,&elapsed_time);
329102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
329202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (times_up) {
329302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
329402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
329502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
329602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
329702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
329802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
329902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
330102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
330202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_cl_rr: got %d transactions\n",
330302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
330402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
330502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
330602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_results->bytes_received	= (trans_received *
330802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					   (dlpi_cl_rr_request->request_size +
330902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					    dlpi_cl_rr_request->response_size));
331002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_results->trans_received	= trans_received;
331102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_cl_rr_results->elapsed_time	= elapsed_time;
331202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_cl_rr_request->measure_cpu) {
331302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_cl_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
331402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
331502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
331602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
331702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
331802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_cl_rr: test complete, sending results.\n");
331902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
332002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
332102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
332302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
332502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
332702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_dlpi_co_rr()
332802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
332902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
333002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  *message;
333102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,data_descriptor;
333202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
333302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	measure_cpu;
333402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
333502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   flags = 0;
333602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*recv_message_ptr;
333702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*send_message_ptr;
333802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf send_message;
333902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf recv_message;
334002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
334202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
334302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
334402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
334502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
334602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_rr_request_struct	*dlpi_co_rr_request;
334802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_rr_response_struct	*dlpi_co_rr_response;
334902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	dlpi_co_rr_results_struct	*dlpi_co_rr_results;
335002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_request	= (struct dlpi_co_rr_request_struct *)netperf_request.content.test_specific_data;
335202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_response	= (struct dlpi_co_rr_response_struct *)netperf_response.content.test_specific_data;
335302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_results	= (struct dlpi_co_rr_results_struct *)netperf_response.content.test_specific_data;
335402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
335602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_dlpi_co_rr: entered...\n");
335702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
335802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
335902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
336102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
336202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
336302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
336402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
336502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
336602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
336702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
336902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
337002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
337102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
337202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
337402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_rr: setting the response type...\n");
337502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
337602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
337702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = DLPI_CO_RR_RESPONSE;
337902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
338102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_rr: the response type is set...\n");
338202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
338302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
338402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* set-up the data buffer with the requested alignment and offset */
338602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message = (char *)malloc(DATABUFFERLEN);
338702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (message == NULL) {
338802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("malloc(%d) failed!\n", DATABUFFERLEN);
338902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
339002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
339102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variables to be at the desired */
339302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignments with the desired offsets. */
339402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
339602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
339702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_rr: requested recv alignment of %d offset %d\n",
339802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_co_rr_request->recv_alignment,
339902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_co_rr_request->recv_offset);
340002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
340102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_rr: requested send alignment of %d offset %d\n",
340202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_co_rr_request->send_alignment,
340302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dlpi_co_rr_request->send_offset);
340402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
340502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
340602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
340702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message_ptr = ALIGN_BUFFER(message, dlpi_co_rr_request->recv_alignment, dlpi_co_rr_request->recv_offset);
340802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.maxlen = dlpi_co_rr_request->request_size;
340902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.len    = 0;
341002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_message.buf    = recv_message_ptr;
341102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
341202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message_ptr = ALIGN_BUFFER(message, dlpi_co_rr_request->send_alignment, dlpi_co_rr_request->send_offset);
341302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.maxlen = dlpi_co_rr_request->response_size;
341402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.len    = dlpi_co_rr_request->response_size;
341502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_message.buf    = send_message_ptr;
341602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
341702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
341802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_rr: receive alignment and offset set...\n");
341902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_rr: send_message.buf %x .len %d .maxlen %d\n",
342002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    send_message.buf,send_message.len,send_message.maxlen);
342102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_rr: recv_message.buf %x .len %d .maxlen %d\n",
342202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    recv_message.buf,recv_message.len,recv_message.maxlen);
342302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
342402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
342502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Let's clear-out our sockaddr for the sake of cleanlines. Then we */
342702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can put in OUR values !-) At some point, we may want to nail this */
342802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket to a particular network-level address, but for now, */
342902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* INADDR_ANY should be just fine. */
343002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
343202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
343402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_dlpi_co_rr: grabbing a socket...\n");
343502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
343602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
343702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* lets grab a file descriptor for a particular link */
343902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __alpha
344102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* ok - even on a DEC box, strings are strings. I din't really want */
344302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to ntohl the words of a string. since I don't want to teach the */
344402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send_ and recv_ _request and _response routines about the types, */
344502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I will put "anti-ntohl" calls here. I imagine that the "pure" */
344602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* solution would be to use XDR, but I am still leary of being able */
344702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to find XDR libs on all platforms I want running netperf. raj */
344802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
344902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *charword;
345002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *initword;
345102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *lastword;
345202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    initword = (int *) dlpi_co_rr_request->dlpi_device;
345402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lastword = initword + ((dlpi_co_rr_request->dev_name_len + 3) / 4);
345502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (charword = initword;
345702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword < lastword;
345802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 charword++) {
345902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *charword = htonl(*charword);
346102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
346202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
346302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __alpha */
346402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((data_descriptor = dl_open(dlpi_co_rr_request->dlpi_device,
346602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 dlpi_co_rr_request->ppa)) < 0) {
346702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
346802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
346902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
347002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
347102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
347202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* bind the file descriptor to a sap and get the resultant dlsap */
347302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_response->station_addr_len = 14; /*arbitrary needs fixing */
347402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dl_bind(data_descriptor,
347502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              dlpi_co_rr_request->sap,
347602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              DL_CODLS,
347702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (char *)dlpi_co_rr_response->station_addr,
347802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              &dlpi_co_rr_response->station_addr_len) != 0) {
347902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
348002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
348102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
348202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
348302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The initiator may have wished-us to modify the socket buffer */
348502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizes. We should give it a shot. If he didn't ask us to change the */
348602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sizes, we should let him know what sizes were in use at this end. */
348702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If none of this code is compiled-in, then we will tell the */
348802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initiator that we were unable to play with the socket buffer by */
348902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* setting the size in the response to -1. */
349002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DL_HP_SET_LOCAL_WIN_REQ
349202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_rr_request->recv_win_size) {
349402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* SMOP */
349502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
349602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_rr_request->send_win_size) {
349802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* SMOP */
349902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
350002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
350102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will find-out what the sizes actually became, and report */
350202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* them back to the user. If the calls fail, we will just report a -1 */
350302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* back to the initiator for the buffer size. */
350402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
350502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* the system won't let us play with the buffers */
350602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
350702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_response->recv_win_size	= -1;
350802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_response->send_win_size	= -1;
350902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
351002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DL_HP_SET_LOCAL_WIN_REQ */
351102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
351202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we may have been requested to enable the copy avoidance features. */
351302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* can we actually do this with DLPI, the world wonders */
351402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
351502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_rr_request->so_rcvavoid) {
351602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_RCV_COPYAVOID
351702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_response->so_rcvavoid = 0;
351802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
351902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it wasn't compiled in... */
352002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_response->so_rcvavoid = 0;
352102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
352202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
352302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
352402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_rr_request->so_sndavoid) {
352502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_SND_COPYAVOID
352602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_response->so_sndavoid = 0;
352702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
352802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it wasn't compiled in... */
352902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_response->so_sndavoid = 0;
353002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
353102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
353202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
353402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
353602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
353702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
353802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
353902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
354002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
354102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_response->cpu_rate = 0.0; 	/* assume no cpu */
354202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_rr_request->measure_cpu) {
354302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_response->measure_cpu = 1;
354402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_response->cpu_rate = calibrate_local_cpu(dlpi_co_rr_request->cpu_rate);
354502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
354602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
354702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
354802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
354902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* accept a connection on this file descriptor. at some point, */
355002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* dl_accept will "do the right thing" with the last two parms, but */
355102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* for now it ignores them, so we will pass zeros. */
355202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
355302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if(dl_accept(data_descriptor, 0, 0) != 0) {
355402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
355502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_rr: error in accept, errno %d\n",
355602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
355702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
355802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
355902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
356002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
356102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
356202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
356402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
356502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_rr: accept completes on the data connection.\n");
356602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
356702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
356802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
357002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
357102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(dlpi_co_rr_request->measure_cpu);
357302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
357502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
357602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_rr_request->test_length > 0) {
357802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
357902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
358002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(dlpi_co_rr_request->test_length + PAD_TIME);
358102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
358202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectelse {
358302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up = 1;
358402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_remaining = dlpi_co_rr_request->test_length * -1;
358502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
358602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
358802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining	= dlpi_co_rr_request->request_size;
358902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
359002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* receive the request from the other side. there needs to be some */
359102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* more login in place for handling messages larger than link mtu, */
359202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but that can wait for later */
359302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(request_bytes_remaining > 0) {
359402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((getmsg(data_descriptor,
359502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 0,
359602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 &recv_message,
359702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 &flags)) < 0) {
359802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR) {
359902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* the timer popped */
360002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
360102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
360202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
360302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
360402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (debug) {
360502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"failed getmsg call errno %d\n",errno);
360602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"recv_message.len %d\n",recv_message.len);
360702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"send_message.len %d\n",send_message.len);
360802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
360902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
361002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = errno;
361202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
361302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
361402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
361502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
361602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_bytes_remaining -= recv_message.len;
361702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
361802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
361902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
362102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets bail out of */
362202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* here now... */
362302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
362402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
362502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
362702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"recv_message.len %d\n",recv_message.len);
362802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_message.len %d\n",send_message.len);
362902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
363002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
363102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
363302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((putmsg(data_descriptor,
363402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0,
363502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &send_message,
363602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       0)) != 0) {
363702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
363802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
363902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
364002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
364102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
364202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 994;
364302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
364402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
364502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
364602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
364802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
364902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
365002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
365102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
365202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
365302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
365402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "recv_dlpi_co_rr: Transaction %d complete\n",
365502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      trans_received);
365602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
365702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
365802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
365902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
366202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
366302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(dlpi_co_rr_request->measure_cpu,&elapsed_time);
366502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
366702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
366802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
366902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
367002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
367102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
367202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
367302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
367402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
367502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
367602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_rr: got %d transactions\n",
367702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
367802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
367902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
368002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
368102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_results->bytes_received	= (trans_received *
368202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					   (dlpi_co_rr_request->request_size +
368302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					    dlpi_co_rr_request->response_size));
368402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_results->trans_received	= trans_received;
368502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dlpi_co_rr_results->elapsed_time	= elapsed_time;
368602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (dlpi_co_rr_request->measure_cpu) {
368702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dlpi_co_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
368802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
368902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
369102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
369202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_dlpi_co_rr: test complete, sending results.\n");
369302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
369402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
369502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
369702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
369902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* this routine will display the usage string for the DLPI tests */
370102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
370202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  print_dlpi_usage()
370302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
370502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fwrite(dlpi_usage, sizeof(char), strlen(dlpi_usage), stdout);
370602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
370702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* this routine will scan the command line for DLPI test arguments */
371002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
371102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  scan_dlpi_args(int argc, char *argv[])
371202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
371302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  extern int	optind, opterrs;  /* index of first unused arg 	*/
371402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  extern char	*optarg;	  /* pointer to option string	*/
371502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int		c;
371702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	arg1[BUFSIZ],  /* argument holders		*/
371902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  arg2[BUFSIZ];
372002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (no_control) {
372202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
372302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "The DLPI tests do not know how to run with no control connection\n");
372402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
372502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
372602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Go through all the command line arguments and break them */
372802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* out. For those options that take two parms, specifying only */
372902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the first will set both to that value. Specifying only the */
373002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* second will leave the first untouched. To change only the */
373102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first, use the form first, (see the routine break_args.. */
373202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
373302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DLPI_ARGS "D:hM:m:p:r:s:W:w:"
373402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
373502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((c= getopt(argc, argv, DLPI_ARGS)) != EOF) {
373602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (c) {
373702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '?':
373802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'h':
373902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      print_dlpi_usage();
374002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
374102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'D':
374202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the dlpi device file name(s) */
374302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
374402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
374502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strcpy(loc_dlpi_device,arg1);
374602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
374702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strcpy(rem_dlpi_device,arg2);
374802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
374902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'm':
375002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the send size */
375102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = atoi(optarg);
375202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
375302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'M':
375402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the recv size */
375502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = atoi(optarg);
375602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
375702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'p':
375802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the local/remote ppa */
375902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
376002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
376102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	loc_ppa = atoi(arg1);
376202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
376302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_ppa = atoi(arg2);
376402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
376502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'r':
376602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the request/response sizes */
376702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
376802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
376902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	req_size = atoi(arg1);
377002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
377102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_size = atoi(arg2);
377202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
377302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 's':
377402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the 802.2 sap for the test */
377502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      dlpi_sap = atoi(optarg);
377602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
377702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'w':
377802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set local window sizes */
377902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
378002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
378102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lsw_size = atoi(arg1);
378202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
378302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lrw_size = atoi(arg2);
378402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
378502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'W':
378602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set remote window sizes */
378702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
378802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
378902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsw_size = atoi(arg1);
379002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
379102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rrw_size = atoi(arg2);
379202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
379302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
379402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
379502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
379602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_DLPI */
3799