102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef lint
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar	nettest_sdp[]="\
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)nettest_sdp.c (c) Copyright 2007 Hewlett-Packard Co. Version 2.4.4";
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DIRTY
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define WANT_HISTOGRAM
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define WANT_INTERVALS
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* lint */
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	nettest_sdp.c						*/
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      scan_sdp_args()        get the sdp command line args  */
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	the actual test routines...				*/
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_sdp_stream()	perform a sdp stream test	*/
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_sdp_stream()					*/
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_sdp_rr()		perform a sdp request/response	*/
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_sdp_rr()						*/
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      relies on create_data_socket in nettest_bsd.c           */
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_CONFIG_H
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <config.h>
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_SDP)
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <fcntl.h>
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <signal.h>
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <string.h>
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <time.h>
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef NOSTDLIBH
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <malloc.h>
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* NOSTDLIBH */
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdlib.h>
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* NOSTDLIBH */
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if !defined(__VMS)
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/ipc.h>
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* !defined(__VMS) */
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <unistd.h>
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/socket.h>
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/in.h>
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/tcp.h>
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <arpa/inet.h>
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netdb.h>
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* would seem that not all sdp.h files define a MSG_EOF, but that
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   MSG_EOF can be the same as MSG_FIN so lets work with that
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   assumption.  initial find by Jon Pedersen. raj 2006-02-01 */
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef MSG_EOF
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef MSG_FIN
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define MSG_EOF MSG_FIN
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#error Must have either MSG_EOF or MSG_FIN defined
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* get some of the functions from nettest_bsd.c */
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "nettest_bsd.h"
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "nettest_sdp.h"
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __sgi
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/time.h>
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __sgi */
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "hist.h"
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectextern int first_burst_size;
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* these variables are specific to SDP tests. declare */
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* them static to make them global only to this file. */
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  msg_count = 0,	/* number of messages to transmit on association */
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  non_block = 0,	/* default to blocking sockets */
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  num_associations = 1; /* number of associations on the endpoint */
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  int confidence_iteration;
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  char  local_cpu_method;
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  char  remote_cpu_method;
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval time_one;
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval time_two;
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic HIST time_hist;
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar sdp_usage[] = "\n\
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectUsage: netperf [global options] -- [test options] \n\
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSDP Sockets Test Options:\n\
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -b number         Send number requests at the start of _RR tests\n\
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -D [L][,R]        Set SDP_NODELAY locally and/or remotely\n\
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -h                Display this text\n\
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -H name,fam       Use name (or IP) and family as target of data connection\n\
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -L name,fam       Use name (or IP) and family as source of data connextion\n\
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -m bytes          Set the size of each sent message\n\
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -M bytes          Set the size of each received messages\n\
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -P local[,remote] Set the local/remote port for the data socket\n\
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -r req,[rsp]      Set request/response sizes (_RR tests)\n\
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -s send[,recv]    Set local socket send/recv buffer sizes\n\
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -S send[,recv]    Set remote socket send/recv buffer sizes\n\
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -V 		      Enable copy avoidance if supported\n\
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -4                Use AF_INET (eg IPv4) on both ends of the data conn\n\
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -6                Use AF_INET6 (eg IPv6) on both ends of the data conn\n\
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectFor those options taking two parms, at least one must be specified;\n\
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectspecifying one value without a comma will set both parms to that\n\
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvalue, specifying a value with a leading comma will set just the second\n\
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectparm, a value with a trailing comma will set just the first. To set\n\
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecteach parm to unique values, specify both and separate them with a\n\
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcomma.\n";
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* This routine is intended to retrieve interesting aspects of sdp */
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for the data connection. at first, it attempts to retrieve the */
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* maximum segment size. later, it might be modified to retrieve */
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* other information, but it must be information that can be */
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* retrieved quickly as it is called during the timing of the test. */
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for that reason, a second routine may be created that can be */
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* called outside of the timing loop */
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_sdp_info(int socket, int * mss)
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef TCP_MAXSEG
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t sock_opt_len;
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_opt_len = sizeof(netperf_socklen_t);
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockopt(socket,
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 getprotobyname("tcp")->p_proto,
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 TCP_MAXSEG,
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (char *)mss,
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 &sock_opt_len) == SOCKET_ERROR) {
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "netperf: get_sdp_info: getsockopt TCP_MAXSEG: errno %d\n",
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *mss = -1;
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *mss = -1;
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* TCP_MAXSEG */
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_sdp_stream(char remote_host[])
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f %s\n";
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f   %7.2f   %s\n";
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c %s\n";
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f %s\n";
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Sends   %-8.8s Recvs\n\
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv             Send (avg)          Recv (avg)\n\
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt2 = "\n\
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-size greater than our send window. this will insure that we */
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int len;
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int nummessages = 0;
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET send_socket;
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_remaining;
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int sdp_mss = -1;  /* possibly uninitialized on printf far below */
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can send > 32 bits worth of bytes */
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) at some point, this should probably become a */
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 64bit integral type, but those are not entirely common yet */
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned long long local_bytes_sent = 0;
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent = 0.0;
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_stream_request_struct	*sdp_stream_request;
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_stream_response_struct	*sdp_stream_response;
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_stream_results_struct	*sdp_stream_result;
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_request  =
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_stream_request_struct *)netperf_request.content.test_specific_data;
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response =
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_stream_response_struct *)netperf_response.content.test_specific_data;
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_result   =
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_stream_results_struct *)netperf_response.content.test_specific_data;
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* complete_addrinfos will either succede or exit the process */
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("SDP STREAM TEST",local_res,remote_res);
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages    =	0;
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent     =	0.0;
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 	0;
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* fake things out by changing local_res->ai_family to AF_INET_SDP */
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_res->ai_family = AF_INET_SDP;
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_res->ai_protocol = 0;
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sdp_stream: sdp stream data socket");
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_sdp_stream: send_socket obtained...\n");
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have either retrieved the socket buffer sizes, */
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* or have tried to set them, so now, we may want to set the send */
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size based on that (because the user either did not use a -m */
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* option, or used one with an argument of 0). If the socket buffer */
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size is not available, we will set the send size to 4KB - no */
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular reason, just arbitrary... */
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_size == 0) {
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lss_size > 0) {
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = lss_size;
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = 4096;
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer ring with the requested alignment and offset. */
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* note also that we have allocated a quantity */
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of memory that is at least one send-size greater than our socket */
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffer size. We want to be sure that there are at least two */
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers allocated - this can be a bit of a problem when the */
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size is bigger than the socket size, so we must check... the */
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user may have wanted to explicitly set the "width" of our send */
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers, we should respect that wish... */
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) {
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_width = (lss_size/send_size) + 1;
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (send_width == 1) send_width++;
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* only allocate the send ring once. this is a networking test, */
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* not a memory allocation test. this way, we do not need a */
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* deallocate_buffer_ring() routine, and I don't feel like */
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* writing one anyway :) raj 11/94 */
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       send_size,
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. */
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Tell the remote end to do a listen. The server alters the
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket paramters on the other side at this point, hence the
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 reason for all the values being passed in the setup
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 message. If the user did not specify any of the parameters,
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 they will be passed as 0, which will indicate to the remote
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that no changes beyond the system's default should be
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 used. Alignment is the exception, it will default to 1, which
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will be no alignment alterations. */
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_request.content.request_type =	DO_SDP_STREAM;
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->send_buf_size	=	rss_size_req;
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->recv_buf_size	=	rsr_size_req;
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->receive_size	=	recv_size;
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->no_delay	=	rem_nodelay;
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->recv_alignment	=	remote_recv_align;
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->recv_offset	=	remote_recv_offset;
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->measure_cpu	=	remote_cpu_usage;
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->cpu_rate	=	remote_cpu_rate;
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (test_time) {
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sdp_stream_request->test_length	=	test_time;
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sdp_stream_request->test_length	=	test_bytes;
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->so_rcvavoid	=	rem_rcvavoid;
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->so_sndavoid	=	rem_sndavoid;
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->dirty_count     =       rem_dirty_count;
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->clean_count     =       rem_clean_count;
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->port            =    atoi(remote_data_port);
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_stream_request->ipfamily = af_to_nf(remote_res->ai_family);
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 1) {
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: send_sdp_stream: requesting SDP stream test\n");
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_request();
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The response from the remote will contain all of the relevant
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         socket parameters for this test type. We will put them back
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         into the variables here so they can be displayed if desired.
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         The remote will have calibrated CPU if necessary, and will
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         have done all the needed set-up we will have calibrated the
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         cpu locally before sending the request, and will grab the
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         counter value right after the connect returns. The remote
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         will grab the counter right after the accept call. This saves
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         the hassle of extra messages being sent for the SDP
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         tests.  */
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote listen done.\n");
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size	      =	sdp_stream_response->recv_buf_size;
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size	      =	sdp_stream_response->send_buf_size;
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_nodelay     =	sdp_stream_response->no_delay;
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_usage=	sdp_stream_response->measure_cpu;
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_rate = sdp_stream_response->cpu_rate;
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we have to make sure that the server port number is in
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   network order */
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	set_port_number(remote_res,
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			(short)sdp_stream_response->data_port_number);
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_rcvavoid	= sdp_stream_response->so_rcvavoid;
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_sndavoid	= sdp_stream_response->so_sndavoid;
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_STREAM_SETUP(lss_size,rsr_size)
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET){
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sdp_stream: data socket connect failed");
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either */
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the connect would have failed, or the previous response would */
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have indicated a problem. I failed to see the value of the */
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* extra  message after the accept on the remote. If it failed, */
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we'll see it here. If it didn't, we might as well start pumping */
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data. */
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a stream test, they can be */
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* either time or byte-count based. */
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = 0;
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in previous revisions, we had the same code repeated throught */
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* all the test suites. this was unnecessary, and meant more */
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* work for me when I wanted to switch to POSIX signals, so I */
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have abstracted this out into a routine in netlib.c. if you */
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* are experiencing signal problems, you might want to look */
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there. raj 11/94 */
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = test_bytes;
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we only start the interval timer if we are using the
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       timer-timed intervals rather than the sit and spin ones. raj
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2006-02-06 */
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_INTERVALS)
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before we start, initialize a few variables */
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(demo_one_ptr);
50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. */
50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (bytes_remaining > 0)) {
51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      access_buffer(send_ring->buffer_ptr,
51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    send_size,
51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_dirty_count,
51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_clean_count);
51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp just before we go into send and then again just
52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 after we come out raj 8/94 */
52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* but lets only do this if there is going to be a histogram
52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   displayed */
52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((len=send(send_socket,
53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   send_ring->buffer_ptr,
53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   send_size,
53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   0)) != send_size) {
53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len >=0) || SOCKET_EINTR(len)) {
53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* the test was interrupted, must be the end of test */
53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("netperf: data send error");
53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	printf("len was %d\n",len);
53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_bytes_sent += send_size;
54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp the exit from the send call and update the histogram */
54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_STREAM_INTERVAL(send_size)
55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_INTERVALS)
55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
56002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
56102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...we may also want to wrap back to the "beginning" */
56202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* of the bufferspace, so we will mod the number of messages sent */
56302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by the send width, and use that to calculate the offset to add */
56402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to the base pointer. */
56502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
56602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
56702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (bytes_remaining) {
56802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bytes_remaining -= send_size;
56902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
57002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
57102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test is over. Flush the buffers to the remote end. We do a */
57302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* graceful release to insure that all data has been taken by the */
57402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote. */
57502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but first, if the verbosity is greater than 1, find-out what */
57702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the SDP maximum segment_size was (if possible) */
57802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
57902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_mss = -1;
58002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      get_sdp_info(send_socket,&sdp_mss);
58102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
58202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (shutdown(send_socket,SHUT_WR) == SOCKET_ERROR) {
58402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: cannot shutdown sdp stream socket");
58502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
58602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
58702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* hang a recv() off the socket to block until the remote has */
58902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* brought all the data up into the application. it will do a */
59002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* shutdown to cause a FIN to be sent our way. We will assume that */
59102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* any exit from the recv() call is good... raj 4/93 */
59202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv(send_socket, send_ring->buffer_ptr, send_size, 0);
59402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
59602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
59702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
59902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured and how */
60002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* long did we really */
60102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* run? */
60202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are finished with the socket, so close it to prevent hitting */
60402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the limit on maximum open files. */
60502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
60702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
60902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Get the statistics from the remote end. The remote will have
61002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 calculated service demand and all those interesting
61102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 things. If it wasn't supposed to care, it will return obvious
61202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 values. */
61302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
61402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
61502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
61602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
61702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote results obtained\n");
61802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
61902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
62002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
62102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
62202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
62302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
62402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
62502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
62602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
62702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
62802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
62902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We now calculate what our thruput was for the test. In the
63102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 future, we may want to include a calculation of the thruput
63202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 measured by the remote, but it should be the case that for a
63302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 SDP stream test, that the two numbers should be *very*
63402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 close... We calculate bytes_sent regardless of the way the
63502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 test length was controlled.  If it was time, we needed to,
63602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 and if it was by bytes, the user may have specified a number
63702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 of bytes that wasn't a multiple of the send_size, so we
63802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 really didn't send what he asked for ;-) */
63902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_sent	= ntohd(sdp_stream_result->bytes_received);
64102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
64202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
64302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_sent = (double)local_bytes_sent;
64402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
64502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= calc_thruput(bytes_sent);
64702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
64902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
65002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
65102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
65202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
65302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
65402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
65502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
65702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_sent,
65802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
65902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
66002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
66102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
66202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
66302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
66402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
66502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
66602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
66802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= sdp_stream_result->cpu_util;
67002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_sent,
67102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
67202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
67302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      sdp_stream_result->num_cpus);
67402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
67502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
67602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
67702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
67802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
67902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
68002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
68102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
68202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
68302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
68402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
68502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
68602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
68702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
68802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
69002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
69102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
69202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
69402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
69502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
69602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
69702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
69802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
69902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
70002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
70102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
70202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
70302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
70402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
70502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have finished making all the runs that we */
70602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be making. so, we should extract what the calcuated values */
70702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are for all the confidence stuff. we could make the values */
70802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* global, but that seemed a little messy, and it did not seem worth */
70902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the mucking with header files. so, we create a routine much */
71002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* like calcualte_confidence, which just returns the mean values. */
71102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 11/94 */
71202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
71402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
71502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
71602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
71702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
71802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
71902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
72102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
72202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
72302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
72402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
72502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
72602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
72702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
72802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
73002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
73102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
73202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
73302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
73402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
73502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
73702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
73802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(sdp_stream_result->cpu_method);
73902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
74102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
74202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
74302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
74402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
74502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
74602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
74702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
74802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
74902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
75002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
75102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
75202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
75302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
75402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method,
75502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
75602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
75702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
75802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
75902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
76002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
76102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
76202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		fprintf(where,
76302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
76402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
76502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
76602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
76702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
76802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
76902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
77002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
77102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,		        /* remote recvbuf size */
77202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
77302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
77402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
77502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		        /* what was the xfer rate */
77602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
77702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
77802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
77902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand,	/* remote service demand */
78002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
78102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
78202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
78302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
78402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
78502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
78602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
78702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
78802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
78902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
79002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
79102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
79202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
79302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
79402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
79502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
79602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
79702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
79802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
79902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		fprintf(where,tput_title,format_units());
80002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
80102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
80202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
80302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size, 		/* remote recvbuf size */
80402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size, 		/* local sendbuf size */
80502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
80602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
80702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,                  /* how fast did it go */
80802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
80902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
81002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
81102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
81202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
81302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
81402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
81502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
81602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
81702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
81802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
81902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
82102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
82202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
82302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* SDP statistics, the alignments of the sends and receives */
82402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
82502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this stuff needs to be worked-out in the presence of confidence */
82702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* intervals and multiple iterations of the test... raj 11/94 */
82802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
83002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
83102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
83202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
83302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
83402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
83502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
83602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
83702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
83802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
83902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
84002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
84102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)sdp_stream_result->recv_calls,
84202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_stream_result->recv_calls);
84302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
84402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt2,
84502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_mss);
84602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
84702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
84802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n\nHistogram of time spent in send() call.\n");
84902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
85002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
85102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
85202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
85302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
85502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the netperf-side SDP unidirectional data
85902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   transfer test (a.k.a. stream) for the sockets interface where the
86002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   data flow is from the netserver to the netperf.  It receives its
86102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   parameters via global variables from the shell and writes its
86202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output to the standard output. */
86302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
86602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_sdp_maerts(char remote_host[])
86702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
86802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
87002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
87102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
87202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
87302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
87402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
87602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f %s\n";
87702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
87902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f   %7.2f   \n %s";
88002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
88102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
88202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
88302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
88402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
88502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
88602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
88702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
88802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c %s\n";
88902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
89102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f %s\n";
89202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
89402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Recvs   %-8.8s Sends\n\
89502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
89602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Recv   Send             Recv (avg)          Send (avg)\n\
89702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
89802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt2 = "\n\
90002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
90102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
90202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
90302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
90402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
90702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
90902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* recv-size greater than our recv window. this will insure that we */
91002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
91102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
91202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
91302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
91402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
91502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
91602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
91702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int len;
91802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int nummessages = 0;
91902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET recv_socket;
92002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_remaining;
92102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int sdp_mss = -1;  /* possibly uninitialized on printf far below */
92202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
92302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can recv > 32 bits worth of bytes */
92402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) at some point, this should probably become a */
92502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 64bit integral type, but those are not entirely common yet */
92602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent = 0.0;
92702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned long long local_bytes_recvd = 0;
92802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
92902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
93002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
93102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
93202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
93302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
93502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
93702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
93802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_maerts_request_struct	*sdp_maerts_request;
94002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_maerts_response_struct	*sdp_maerts_response;
94102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_maerts_results_struct	*sdp_maerts_result;
94202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
94302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_request  =
94402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_maerts_request_struct *)netperf_request.content.test_specific_data;
94502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response =
94602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_maerts_response_struct *)netperf_response.content.test_specific_data;
94702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_result   =
94802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_maerts_results_struct *)netperf_response.content.test_specific_data;
94902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
95002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
95102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
95202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
95302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
95402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
95502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
95602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
95702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
95802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
95902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
96102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
96202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
96302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
96402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
96502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
96602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
96802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("SDP MAERTS TEST",local_res,remote_res);
96902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
97002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = NULL;
97202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
97302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
97402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
97602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
97702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
97802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
97902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
98002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
98102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
98302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
98402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
98602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
98702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages    =	0;
98902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent     =	0.0;
99002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 	0;
99102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
99302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* fake things out by changing local_res->ai_family to AF_INET_SDP */
99402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_res->ai_family = AF_INET_SDP;
99502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_res->ai_protocol = 0;
99602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_socket = create_data_socket(local_res);
99702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_socket == INVALID_SOCKET){
99902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sdp_maerts: sdp stream data socket");
100002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
100102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
100202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
100402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_sdp_maerts: recv_socket obtained...\n");
100502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
100602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have either retrieved the socket buffer sizes, */
100802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* or have tried to set them, so now, we may want to set the recv */
100902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size based on that (because the user either did not use a -m */
101002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* option, or used one with an argument of 0). If the socket buffer */
101102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size is not available, we will set the recv size to 4KB - no */
101202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular reason, just arbitrary... */
101302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_size == 0) {
101402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lsr_size > 0) {
101502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	recv_size = lsr_size;
101602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
101702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
101802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	recv_size = 4096;
101902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
102002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
102102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer ring with the requested alignment and offset. */
102302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* note also that we have allocated a quantity */
102402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of memory that is at least one recv-size greater than our socket */
102502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffer size. We want to be sure that there are at least two */
102602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers allocated - this can be a bit of a problem when the */
102702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* recv_size is bigger than the socket size, so we must check... the */
102802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user may have wanted to explicitly set the "width" of our recv */
102902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers, we should respect that wish... */
103002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) {
103102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_width = (lsr_size/recv_size) + 1;
103202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (recv_width == 1) recv_width++;
103302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
103402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
103602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* only allocate the recv ring once. this is a networking test, */
103702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* not a memory allocation test. this way, we do not need a */
103802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* deallocate_buffer_ring() routine, and I don't feel like */
103902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* writing one anyway :) raj 11/94 */
104002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
104102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       recv_size,
104202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
104302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
104402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
104502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
104602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
104702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
104802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
104902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
105002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
105102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. */
105202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
105402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
105502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
105602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
105802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Tell the remote end to do a listen. The server alters the
105902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket paramters on the other side at this point, hence the
106002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 reason for all the values being passed in the setup
106102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 message. If the user did not specify any of the parameters,
106202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 they will be passed as 0, which will indicate to the remote
106302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that no changes beyond the system's default should be
106402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 used. Alignment is the exception, it will default to 1, which
106502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will be no alignment alterations. */
106602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_request.content.request_type	=	DO_SDP_MAERTS;
106802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->send_buf_size	=	rss_size_req;
106902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->recv_buf_size	=	rsr_size_req;
107002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->send_size	=	send_size;
107102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->no_delay	=	rem_nodelay;
107202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->send_alignment	=	remote_send_align;
107302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->send_offset	=	remote_send_offset;
107402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->measure_cpu	=	remote_cpu_usage;
107502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->cpu_rate	=	remote_cpu_rate;
107602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (test_time) {
107702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sdp_maerts_request->test_length	=	test_time;
107802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
107902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
108002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sdp_maerts_request->test_length	=	test_bytes;
108102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
108202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->so_rcvavoid	=	rem_rcvavoid;
108302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->so_sndavoid	=	rem_sndavoid;
108402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
108502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->dirty_count       =       rem_dirty_count;
108602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->clean_count       =       rem_clean_count;
108702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
108802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->port            = atoi(remote_data_port);
108902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_maerts_request->ipfamily        = af_to_nf(remote_res->ai_family);
109002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 1) {
109102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
109202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: send_sdp_maerts: requesting SDP maerts test\n");
109302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
109402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_request();
109602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The response from the remote will contain all of the relevant
109802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket parameters for this test type. We will put them back
109902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 into the variables here so they can be displayed if desired.
110002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 The remote will have calibrated CPU if necessary, and will
110102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 have done all the needed set-up we will have calibrated the
110202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 cpu locally before sending the request, and will grab the
110302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 counter value right after the connect returns. The remote
110402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will grab the counter right after the accept call. This saves
110502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 the hassle of extra messages being sent for the SDP
110602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 tests.  */
110702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
110802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
110902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
111102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
111202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote listen done.\n");
111302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size	=	sdp_maerts_response->recv_buf_size;
111402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size	=	sdp_maerts_response->send_buf_size;
111502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_nodelay     =	sdp_maerts_response->no_delay;
111602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_usage=	sdp_maerts_response->measure_cpu;
111702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_rate = sdp_maerts_response->cpu_rate;
111802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size       = sdp_maerts_response->send_size;
111902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we have to make sure that the server port number is in
112102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 network order */
112202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res,
112302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      (short)sdp_maerts_response->data_port_number);
112402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid	= sdp_maerts_response->so_rcvavoid;
112502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid	= sdp_maerts_response->so_sndavoid;
112602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
112702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
112802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
112902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
113002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
113102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
113202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
113302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
113402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
113602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
113702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
113802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
114002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_STREAM_SETUP(lsr_size,rss_size)
114102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
114202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
114302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
114402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(recv_socket,
114502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
114602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET){
114702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sdp_maerts: data socket connect failed");
114802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
114902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
115002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
115102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either */
115202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the connect would have failed, or the previous response would */
115302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have indicated a problem. I failed to see the value of the */
115402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* extra  message after the accept on the remote. If it failed, */
115502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we'll see it here. If it didn't, we might as well start pumping */
115602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data. */
115702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
115802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a maerts test, they can be */
115902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* either time or byte-count based. */
116002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
116102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
116202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
116302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
116402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = 0;
116502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in previous revisions, we had the same code repeated throught */
116602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* all the test suites. this was unnecessary, and meant more */
116702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* work for me when I wanted to switch to POSIX signals, so I */
116802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have abstracted this out into a routine in netlib.c. if you */
116902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* are experiencing signal problems, you might want to look */
117002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there. raj 11/94 */
117102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!no_control) {
117202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* this is a netperf to netserver test, netserver will close
117302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   to tell us the test is over, so use PAD_TIME to avoid
117402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   causing the netserver fits. */
117502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	start_timer(test_time + PAD_TIME);
117602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
117702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
117802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* this is a netperf to data source test, no PAD_TIME */
117902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	start_timer(test_time);
118002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
118102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
118202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
118302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to recv a number of bytes. we don't do that
118402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 in a SDP_MAERTS test. sorry. raj 2002-06-21 */
118502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("netperf: send_sdp_maerts: test must be timed\n");
118602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
118702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
118802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
118902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
119002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
119102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
119202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
119302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
119402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
119502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
119602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
119702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
119802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
119902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before we start, initialize a few variables */
120002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
120202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (demo_mode) {
120302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(demo_one_ptr);
120402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
120502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
120602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the test will continue until we either get a zero-byte recv()
120802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       on the socket or our failsafe timer expires. most of the time
120902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       we trust that we get a zero-byte recieve from the socket. raj
121002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2002-06-21 */
121102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
121202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
121302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
121402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before we go into recv and then again just
121502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 after we come out raj 8/94 */
121602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* but only if we are actually going to display a histogram. raj
121702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 2006-02-07 */
121802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
121902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
122002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
122102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
122202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) && (len=recv(recv_socket,
122302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    recv_ring->buffer_ptr,
122402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    recv_size,
122502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    0)) > 0 ) {
122602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
122702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
122802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
122902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp the exit from the recv call and update the histogram */
123002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
123102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
123202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
123302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
123402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
123602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      access_buffer(recv_ring->buffer_ptr,
123702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    recv_size,
123802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_dirty_count,
123902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    loc_clean_count);
124002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
124102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
124302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_STREAM_INTERVAL(len);
124402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
124502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
124702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
124802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
124902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
125102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...we may also want to wrap back to the "beginning" */
125202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* of the bufferspace, so we will mod the number of messages sent */
125302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by the recv width, and use that to calculate the offset to add */
125402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to the base pointer. */
125502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
125602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
125702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (bytes_remaining) {
125802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bytes_remaining -= len;
125902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
126002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_bytes_recvd += len;
126202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
126402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
126502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure we timestamp just before we go into recv  */
126602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* raj 2004-06-15 */
126702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
126802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
126902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
127002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
127202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* an EINTR is to be expected when this is a no_control test */
127402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (((len < 0) || SOCKET_EINTR(len)) && (!no_control)) {
127502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("send_sdp_maerts: data recv error");
127602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("len was %d\n",len);
127702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
127802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
127902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if we get here, it must mean we had a recv return of 0 before
128102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the watchdog timer expired, or the watchdog timer expired and
128202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       this was a no_control test */
128302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test is over. Flush the buffers to the remote end. We do a
128502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       graceful release to tell the  remote we have all the data. */
128602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but first, if the verbosity is greater than 1, find-out what */
128802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the SDP maximum segment_size was (if possible) */
128902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
129002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_mss = -1;
129102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      get_sdp_info(recv_socket,&sdp_mss);
129202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
129302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (shutdown(recv_socket,SHUT_WR) == SOCKET_ERROR) {
129502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: cannot shutdown sdp maerts socket");
129602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
129702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
129802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    stop_timer();
130002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the local elapsed time for the
130202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       test, and will also store-away the necessaries for cpu
130302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       utilization */
130402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
130602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured and how */
130702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* long did we really */
130802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* run? */
130902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are finished with the socket, so close it to prevent hitting */
131102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the limit on maximum open files. */
131202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(recv_socket);
131402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
131602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Get the statistics from the remote end. The remote will have
131702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         calculated service demand and all those interesting
131802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         things. If it wasn't supposed to care, it will return obvious
131902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         values. */
132002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
132202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
132302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
132402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote results obtained\n");
132502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
132602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
132702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
132802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
132902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
133002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
133102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
133202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
133302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
133502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
133602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We now calculate what our thruput was for the test. In the
133802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 future, we may want to include a calculation of the thruput
133902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 measured by the remote, but it should be the case that for a
134002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 SDP maerts test, that the two numbers should be *very*
134102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 close... We calculate bytes_sent regardless of the way the
134202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 test length was controlled.  If it was time, we needed to,
134302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 and if it was by bytes, the user may have specified a number
134402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 of bytes that wasn't a multiple of the recv_size, so we
134502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 really didn't recv what he asked for ;-) */
134602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
134702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_sent	= ntohd(sdp_maerts_result->bytes_sent);
134802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
134902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
135002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_sent = (double)local_bytes_recvd;
135102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
135202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= calc_thruput(bytes_sent);
135502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
135702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
135802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
135902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
136002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
136102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
136202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
136302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
136502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_sent,
136602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
136702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
136802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
136902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
137002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
137102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
137202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
137302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
137402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
137602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= sdp_maerts_result->cpu_util;
137802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_sent,
137902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
138002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
138102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      sdp_maerts_result->num_cpus);
138202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
138302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
138402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
138502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
138602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
138702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
138802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
138902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
139002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
139102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
139202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
139302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
139402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
139502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
139602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
139802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
139902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
140002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
140202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
140302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
140402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
140502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
140602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
140702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
140802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
141102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
141202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have finished making all the runs that we */
141402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be making. so, we should extract what the calcuated values */
141502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are for all the confidence stuff. we could make the values */
141602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* global, but that seemed a little messy, and it did not seem worth */
141702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the mucking with header files. so, we create a routine much */
141802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* like calcualte_confidence, which just returns the mean values. */
141902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 11/94 */
142002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
142102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
142202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
142302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
142402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
142502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
142602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
142702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
142802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
142902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
143002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
143102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
143202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
143302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
143402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
143502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
143602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
143702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
143802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
143902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
144002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
144102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
144202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
144302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
144502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
144602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(sdp_maerts_result->cpu_method);
144702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
144902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
145002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
145102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
145202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
145302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
145402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
145502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
145602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
145702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
145802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
145902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
146002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
146102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
146202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method,
146302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
146402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
146502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
146602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
146702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
146802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
146902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
147002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
147102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
147202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
147302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
147402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
147502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
147602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
147802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
147902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,		        /* remote recvbuf size */
148002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
148102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the recvs */
148202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
148302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		        /* what was the xfer rate */
148402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
148502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
148602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
148702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand,	/* remote service demand */
148802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
148902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
149002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
149102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
149202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
149302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
149402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
149502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
149702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
149802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
149902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
150002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
150102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
150202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
150302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
150402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
150502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
150602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
150702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
150802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
150902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
151002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
151102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size, 		/* local recvbuf size */
151202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remot sendbuf size */
151302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the recvs */
151402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
151502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,                  /* how fast did it go */
151602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
151702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
151802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
151902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
152002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
152102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
152302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
152402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
152502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
152602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
152702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
152902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
153002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
153102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* SDP statistics, the alignments of the sends and receives */
153202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
153302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this stuff needs to be worked-out in the presence of confidence */
153502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* intervals and multiple iterations of the test... raj 11/94 */
153602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
153802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
153902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
154002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
154102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
154202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_recv_align,
154302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
154402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_recv_offset,
154502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
154602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
154702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
154802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
154902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)sdp_maerts_result->send_calls,
155002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_maerts_result->send_calls);
155102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
155202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt2,
155302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_mss);
155402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
155502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
155602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n\nHistogram of time spent in recv() call.\n");
155702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
155802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
155902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
156002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
156102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
156302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This is the server-side routine for the sdp stream test. It is */
156402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* implemented as one routine. I could break things-out somewhat, but */
156502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* didn't feel it was necessary. */
156602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
156802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_sdp_stream()
156902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
157002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in myaddr_in, peeraddr_in;
157202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET s_listen,s_data;
157302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t addrlen;
157402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
157502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	receive_calls;
157602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
157702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double   bytes_received;
157802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
158002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
158202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
158302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
158402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
158602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fd_set readfds;
158702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct timeval timeout;
158802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
158902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_stream_request_struct	*sdp_stream_request;
159102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_stream_response_struct	*sdp_stream_response;
159202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_stream_results_struct	*sdp_stream_results;
159302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
159502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  FD_ZERO(&readfds);
159602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_sec = 1;
159702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_usec = 0;
159802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
159902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_request	=
160102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_stream_request_struct *)netperf_request.content.test_specific_data;
160202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response	=
160302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_stream_response_struct *)netperf_response.content.test_specific_data;
160402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_results	=
160502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_stream_results_struct *)netperf_response.content.test_specific_data;
160602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
160802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_sdp_stream: entered...\n");
160902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
161002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
161102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
161202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
161302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
161402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
161502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
161602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
161702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
161802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
161902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
162102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
162202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
162302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
162402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
162602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_stream: setting the response type...\n");
162702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
162802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
162902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = SDP_STREAM_RESPONSE;
163102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
163302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_stream: the response type is set...\n");
163402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
163502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
163602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
163802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
163902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
164102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_stream: requested alignment of %d\n",
164202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_stream_request->recv_alignment);
164302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
164402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
164502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
164702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
164802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
164902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
165002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = sdp_stream_request->send_buf_size;
165102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = sdp_stream_request->recv_buf_size;
165202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay  = sdp_stream_request->no_delay;
165302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = sdp_stream_request->so_rcvavoid;
165402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = sdp_stream_request->so_sndavoid;
165502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
165702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
165802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(sdp_stream_request->ipfamily),
165902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			sdp_stream_request->port);
166002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
166202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
166302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
166402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(sdp_stream_request->ipfamily),
166502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
166602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
166702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
166802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* fake things out by changing local_res->ai_family to AF_INET_SDP */
167002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res->ai_family = AF_INET_SDP;
167102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res->ai_protocol = 0;
167202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
167302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
167502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
167602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
167702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
167802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
167902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
168102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test timer can fire during operations on the listening socket,
168202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     so to make the start_timer below work we have to move
168302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     it to close s_listen while we are blocked on accept. */
168402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket2 = s_listen;
168502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
168602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what sort of sizes did we end-up with? */
168802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_stream_request->receive_size == 0) {
168902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lsr_size > 0) {
169002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = lsr_size;
169102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
169202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
169302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = 4096;
169402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
169502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
169602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
169702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_size = sdp_stream_request->receive_size;
169802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
169902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to set-up our recv_ring in a manner analagous to what we */
170102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* do on the sending side. this is more for the sake of symmetry */
170202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* than for the needs of say copy avoidance, but it might also be */
170302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* more realistic - this way one could conceivably go with a */
170402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* double-buffering scheme when taking the data an putting it into */
170502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the filesystem or something like that. raj 7/94 */
170602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) {
170802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_width = (lsr_size/recv_size) + 1;
170902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 1) recv_width++;
171002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
171102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
171302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   recv_size,
171402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_stream_request->recv_alignment,
171502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_stream_request->recv_offset);
171602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
171802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_stream: receive alignment and offset set...\n");
171902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
172002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
172102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
172202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
172302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
172402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
172502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
172602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
172702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
172802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
172902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
173002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
173302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
173402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
173502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
173602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
173702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
173802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
173902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
174002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
174202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
174302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
174502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
174602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
174702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
174902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
175002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
175102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
175202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
175302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
175402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
175502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
175602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
175702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response->cpu_rate = (float)0.0; 	/* assume no cpu */
175802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_stream_request->measure_cpu) {
175902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_stream_response->measure_cpu = 1;
176002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_stream_response->cpu_rate =
176102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(sdp_stream_request->cpu_rate);
176202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
176302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
176402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_stream_response->measure_cpu = 0;
176502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
176602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
176702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
176802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
176902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response->send_buf_size = lss_size;
177002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response->recv_buf_size = lsr_size;
177102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response->no_delay = loc_nodelay;
177202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response->so_rcvavoid = loc_rcvavoid;
177302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response->so_sndavoid = loc_sndavoid;
177402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_response->receive_size = recv_size;
177502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
177702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
177902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data=accept(s_listen,
178102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     (struct sockaddr *)&peeraddr_in,
178202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &addrlen)) == INVALID_SOCKET) {
178302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
178402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
178502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
178602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
178702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
178902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass */
179002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* attributes across an accept() call. Including this goes against */
179102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* my better judgement :( raj 11/95 */
179202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
179302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
179402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
179502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
179602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
179702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
179802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
179902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(sdp_stream_request->measure_cpu);
180102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
180302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
180402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* there used to be an #ifdef DIRTY call to access_buffer() here,
180602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     but we have switched from accessing the buffer before the recv()
180702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     call to accessing the buffer after the recv() call.  The
180802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     accessing before was, IIRC, related to having dirty data when
180902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     doing page-flipping copy avoidance. */
181002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
181102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_received = 0;
181202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  receive_calls  = 0;
181302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
181402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((len = recv(s_data, recv_ring->buffer_ptr, recv_size, 0)) != 0) {
181502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (len == SOCKET_ERROR )
181602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
181702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
181802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
181902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
182002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
182102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_received += len;
182202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    receive_calls++;
182302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
182402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
182502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we access the buffer after the recv() call now, rather than before */
182602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    access_buffer(recv_ring->buffer_ptr,
182702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  recv_size,
182802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  sdp_stream_request->dirty_count,
182902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  sdp_stream_request->clean_count);
183002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
183102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* move to the next buffer in the recv_ring */
183402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
183502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef PAUSE
183702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sleep(1);
183802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* PAUSE */
183902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
184102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	FD_SET(s_data,&readfds);
184202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	select(s_data+1,&readfds,NULL,NULL,&timeout);
184302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
184402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
184602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* perform a shutdown to signal the sender that */
184802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have received all the data sent. raj 4/93 */
184902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
185002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (shutdown(s_data,SHUT_WR) == SOCKET_ERROR) {
185102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
185202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
185302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
185402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
185502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
185602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(sdp_stream_request->measure_cpu,&elapsed_time);
185702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
185802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
185902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
186002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
186102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
186202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sdp_stream: got %g bytes\n",
186302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
186402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
186502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sdp_stream: got %d recvs\n",
186602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
186702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
186802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
186902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
187002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_results->bytes_received	= htond(bytes_received);
187102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_results->elapsed_time	= elapsed_time;
187202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_results->recv_calls	= receive_calls;
187302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
187402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_results->cpu_method = cpu_method;
187502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_stream_results->num_cpus   = lib_num_loc_cpus;
187602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
187702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_stream_request->measure_cpu) {
187802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_stream_results->cpu_util	= calc_cpu_util(0.0);
187902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
188002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
188102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
188202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
188302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sdp_stream: test complete, sending results.\n");
188402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
188502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 bytes_received %g receive_calls %d\n",
188602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received,
188702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
188802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
188902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 len %d\n",
189002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    len);
189102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
189202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
189302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
189502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
189702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
189802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_listen);
189902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
190002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
190102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
190202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This is the server-side routine for the sdp maerts test. It is
190302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   implemented as one routine. I could break things-out somewhat, but
190402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   didn't feel it was necessary. */
190502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
190602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
190702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_sdp_maerts()
190802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
190902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in myaddr_in, peeraddr_in;
191102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
191202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  local_name[BUFSIZ];
191302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  port_buffer[PORTBUFSIZE];
191402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,s_data;
191602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
191702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
191802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	send_calls;
191902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
192002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double   bytes_sent = 0.0 ;
192102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
192202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
192302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
192402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_maerts_request_struct	*sdp_maerts_request;
192502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_maerts_response_struct	*sdp_maerts_response;
192602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_maerts_results_struct	*sdp_maerts_results;
192702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
192802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_request	=
192902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_maerts_request_struct *)netperf_request.content.test_specific_data;
193002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response	=
193102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_maerts_response_struct *)netperf_response.content.test_specific_data;
193202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_results	=
193302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_maerts_results_struct *)netperf_response.content.test_specific_data;
193402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
193602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_sdp_maerts: entered...\n");
193702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
193802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
193902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired
194102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     parameters and then let the initiator know that all is ready. If
194202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     socket size defaults are to be used, then the initiator will have
194302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     sent us 0's. If the socket sizes cannot be changed, then we will
194402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     send-back what they are. If that information cannot be
194502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     determined, then we send-back -1's for the sizes. If things go
194602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     wrong for any reason, we will drop back ten yards and punt. */
194702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It
194902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     would be best if the error that the remote reports to the user is
195002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     the actual error we encountered, rather than some bogus
195102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     unexpected response type message. */
195202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
195402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_maerts: setting the response type...\n");
195502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
195602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
195702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = SDP_MAERTS_RESPONSE;
195902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
196102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_maerts: the response type is set...\n");
196202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
196302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
196402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
196602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
196702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
196902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_maerts: requested alignment of %d\n",
197002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_maerts_request->send_alignment);
197102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
197202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
197302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
197502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
197702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_maerts: grabbing a socket...\n");
197802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
197902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
198002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
198202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
198302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
198402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
198502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = sdp_maerts_request->send_buf_size;
198602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = sdp_maerts_request->recv_buf_size;
198702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = sdp_maerts_request->no_delay;
198802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = sdp_maerts_request->so_rcvavoid;
198902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = sdp_maerts_request->so_sndavoid;
199002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
199102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
199202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
199302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(sdp_maerts_request->ipfamily),
199402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			sdp_maerts_request->port);
199502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
199602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
199702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
199802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
199902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(sdp_maerts_request->ipfamily),
200002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
200102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
200202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
200302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* fake things out by changing local_res->ai_family to AF_INET_SDP */
200502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res->ai_family = AF_INET_SDP;
200602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res->ai_protocol = 0;
200702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
200802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
201002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
201102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
201202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
201302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
201402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
201602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test timer can fire during operations on the listening socket,
201702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     so to make the start_timer below work we have to move
201802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     it to close s_listen while we are blocked on accept. */
201902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket2 = s_listen;
202002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
202102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what sort of sizes did we end-up with? */
202402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_maerts_request->send_size == 0) {
202502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lss_size > 0) {
202602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = lss_size;
202702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
202802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
202902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = 4096;
203002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
203102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
203202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
203302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_size = sdp_maerts_request->send_size;
203402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
203502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
203602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to set-up our recv_ring in a manner analagous to what we */
203702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* do on the recving side. this is more for the sake of symmetry */
203802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* than for the needs of say copy avoidance, but it might also be */
203902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* more realistic - this way one could conceivably go with a */
204002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* double-buffering scheme when taking the data an putting it into */
204102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the filesystem or something like that. raj 7/94 */
204202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
204302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) {
204402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_width = (lsr_size/send_size) + 1;
204502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 1) send_width++;
204602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
204702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
204802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
204902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   send_size,
205002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_maerts_request->send_alignment,
205102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_maerts_request->send_offset);
205202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
205302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
205402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_maerts: receive alignment and offset set...\n");
205502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
205602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
205702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
205802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
205902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
206002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
206102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
206202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
206302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
206502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
206602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
206902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
207002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
207102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
207202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR){
207302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
207402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
207502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
207602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
207802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
207902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
208102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
208202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
208302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
208502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
208602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
208802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
208902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
209002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
209102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
209202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
209302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response->cpu_rate = (float)0.0; 	/* assume no cpu */
209402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_maerts_request->measure_cpu) {
209502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_maerts_response->measure_cpu = 1;
209602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_maerts_response->cpu_rate =
209702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(sdp_maerts_request->cpu_rate);
209802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
209902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
210002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_maerts_response->measure_cpu = 0;
210102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
210202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
210302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
210402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
210502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response->send_buf_size = lss_size;
210602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response->recv_buf_size = lsr_size;
210702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response->no_delay = loc_nodelay;
210802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response->so_rcvavoid = loc_rcvavoid;
210902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response->so_sndavoid = loc_sndavoid;
211002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_response->send_size = send_size;
211102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
211202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
211302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
211402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
211502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
211602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we will start the timer before the accept() to be somewhat
211702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     analagous to the starting of the timer before the connect() call
211802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     in the SDP_STREAM test. raj 2002-06-21 */
211902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  start_timer(sdp_maerts_request->test_length);
212102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will
212302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     first grab the apropriate counters and then start grabbing. */
212402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(sdp_maerts_request->measure_cpu);
212602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data=accept(s_listen,
212902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     (struct sockaddr *)&peeraddr_in,
213002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &addrlen)) == INVALID_SOCKET) {
213102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
213202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
213302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
213402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
213502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
213702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass
213902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     attributes across an accept() call. Including this goes against
214002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     my better judgement :( raj 11/95 */
214102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
214202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
214302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
214402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
214502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
214602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
214702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
214802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
214902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_sent = 0.0;
215002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_calls  = 0;
215102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
215202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  len = 0;   /* nt-lint; len is not initialized (printf far below) if
215302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		times_up initially true.*/
215402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  times_up = 0; /* must remember to initialize this little beauty */
215502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (!times_up) {
215602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
215702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
215802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to dirty some number of consecutive integers in the buffer */
215902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are about to send. we may also want to bring some number of */
216002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* them cleanly into the cache. The clean ones will follow any dirty */
216102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ones into the cache. */
216202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
216302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  access_buffer(send_ring->buffer_ptr,
216402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		send_size,
216502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		sdp_maerts_request->dirty_count,
216602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		sdp_maerts_request->clean_count);
216702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
216802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
216902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
217002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((len=send(s_data,
217102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 send_ring->buffer_ptr,
217202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 send_size,
217302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 0)) != send_size) {
217402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if ((len >=0) || SOCKET_EINTR(len)) {
217502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* the test was interrupted, must be the end of test */
217602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
217702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
217802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
217902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
218002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
218102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
218202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent += len;
218402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_calls++;
218502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* more to the next buffer in the send_ring */
218702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
218802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
219002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
219102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* perform a shutdown to signal the sender that */
219202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have received all the data sent. raj 4/93 */
219302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
219402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (shutdown(s_data,SHUT_WR) == SOCKET_ERROR) {
219502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
219602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
219702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
219802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
219902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* hang a recv() off the socket to block until the remote has
220102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     brought all the data up into the application. it will do a
220202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     shutdown to cause a FIN to be sent our way. We will assume that
220302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     any exit from the recv() call is good... raj 4/93 */
220402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv(s_data, send_ring->buffer_ptr, send_size, 0);
220602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(sdp_maerts_request->measure_cpu,&elapsed_time);
220902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
221102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
221302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
221402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sdp_maerts: got %g bytes\n",
221502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent);
221602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
221702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sdp_maerts: got %d sends\n",
221802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    send_calls);
221902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
222002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
222102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_results->bytes_sent	= htond(bytes_sent);
222302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_results->elapsed_time	= elapsed_time;
222402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_results->send_calls	= send_calls;
222502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_maerts_request->measure_cpu) {
222702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_maerts_results->cpu_util	= calc_cpu_util(0.0);
222802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
222902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
223002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
223102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
223202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sdp_maerts: test complete, sending results.\n");
223302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
223402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 bytes_sent %g send_calls %d\n",
223502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
223602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    send_calls);
223702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
223802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 len %d\n",
223902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    len);
224002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
224102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
224202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
224302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_results->cpu_method = cpu_method;
224402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_maerts_results->num_cpus   = lib_num_loc_cpus;
224502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
224602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
224702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
224802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
224902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_listen);
225002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
225202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the sending (netperf) side of the SDP_RR */
225502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test. */
225602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
225802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_sdp_rr(char remote_host[])
225902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
226002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
226202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
226302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
226402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
226502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
226602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
226802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f %s\n";
226902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
227102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   %s\n";
227202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
227302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
227402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
227602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
227702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
227802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
227902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
228002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
228202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c %s\n";
228302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
228502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f  %-6.2f %-6.2f %-6.3f  %-6.3f %s\n";
228602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
228802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
228902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
229102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
229202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
229302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
229402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
229502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
229802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
229902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
230102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
230202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
230302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	send_socket;
230402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
230502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
230602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
230802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
230902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
231102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
231202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
231402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
231502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
231602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
231702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
231802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
232002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
232102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_rr_request_struct	*sdp_rr_request;
232302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_rr_response_struct	*sdp_rr_response;
232402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_rr_results_struct	*sdp_rr_result;
232502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
232702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define REQUEST_CWND_INITIAL 2
232802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "in the beginning..." the WANT_FIRST_BURST stuff was like both
232902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     Unix and the state of New Jersey - both were simple an unspoiled.
233002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     then it was realized that some stacks are quite picky about
233102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     initial congestion windows and a non-trivial initial burst of
233202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     requests would not be individual segments even with TCP_NODELAY
233302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     set. so, we have to start tracking a poor-man's congestion window
233402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     up here in window space because we want to try to make something
233502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     happen that frankly, we cannot guarantee with the specification
233602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     of SDP.  ain't that grand?-)  raj 2006-01-30 */
233702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int requests_outstanding = 0;
233802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int request_cwnd = REQUEST_CWND_INITIAL;  /* we ass-u-me that having
233902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       three requests
234002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       outstanding at the
234102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       beginning of the test
234202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       is ok with SDP stacks
234302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       of interest. the first
234402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       two will come from our
234502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       first_burst loop, and
234602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       the third from our
234702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       regularly scheduled
234802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       send */
234902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
235002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_request =
235202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_rr_request_struct *)netperf_request.content.test_specific_data;
235302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response=
235402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_rr_response_struct *)netperf_response.content.test_specific_data;
235502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_result	=
235602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_rr_results_struct *)netperf_response.content.test_specific_data;
235702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
235902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
236002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time_hist = HIST_new();
236102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
236202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
236302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
236502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
236602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
236702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
236802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
237002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
237102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
237202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
237302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_TCP,
237402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
237502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
237702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("SDP REQUEST/RESPONSE TEST",local_res,remote_res);
237802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
237902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
238102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
238302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = NULL;
238402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
238502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
238602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
238802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
238902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
239002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
239102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
239202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
239302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
239402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
239502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
239602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
239702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
239802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
239902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages     = 0;
240102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd     = 0.0;
240202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up        = 0;
240302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    timed_out       = 0;
240402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
240502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
240702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we have to remember to reset the number of transactions
240802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       outstanding and the "congestion window for each new
240902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       iteration. raj 2006-01-31 */
241002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    requests_outstanding = 0;
241102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_cwnd = REQUEST_CWND_INITIAL;
241202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
241302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffers with the requested alignment and offset. */
241602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since this is a request/response test, default the send_width and */
241702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* recv_width to 1 and not two raj 7/94 */
241802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 1;
242002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) recv_width = 1;
242102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
242302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
242402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       req_size,
242502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
242602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
242702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
242802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
243002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
243102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       rsp_size,
243202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
243302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
243402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
243502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
243702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* fake things out by changing local_res->ai_family to AF_INET_SDP */
243802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_res->ai_family = AF_INET_SDP;
243902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_res->ai_protocol = 0;
244002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
244102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
244302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sdp_rr: sdp stream data socket");
244402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
244502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
244602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
244802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_sdp_rr: send_socket obtained...\n");
244902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
245002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
245202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
245302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
245402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
245502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
245602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back.*/
245702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
245902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
246002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
246102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
246202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
246302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Tell the remote end to do a listen. The server alters the
246402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket paramters on the other side at this point, hence the
246502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 reason for all the values being passed in the setup
246602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 message. If the user did not specify any of the parameters,
246702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 they will be passed as 0, which will indicate to the remote
246802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that no changes beyond the system's default should be
246902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 used. Alignment is the exception, it will default to 8, which
247002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will be no alignment alterations. */
247102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_request.content.request_type	=	DO_SDP_RR;
247302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->recv_buf_size	=	rsr_size_req;
247402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->send_buf_size	=	rss_size_req;
247502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->recv_alignment    =	remote_recv_align;
247602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->recv_offset	=	remote_recv_offset;
247702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->send_alignment    =	remote_send_align;
247802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->send_offset	=	remote_send_offset;
247902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->request_size	=	req_size;
248002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->response_size	=	rsp_size;
248102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->no_delay	        =	rem_nodelay;
248202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->measure_cpu	=	remote_cpu_usage;
248302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->cpu_rate	        =	remote_cpu_rate;
248402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->so_rcvavoid	=	rem_rcvavoid;
248502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->so_sndavoid	=	rem_sndavoid;
248602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (test_time) {
248702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sdp_rr_request->test_length	=	test_time;
248802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
248902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
249002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sdp_rr_request->test_length	=	test_trans * -1;
249102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
249202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->port              =      atoi(remote_data_port);
249302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sdp_rr_request->ipfamily = af_to_nf(remote_res->ai_family);
249402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 1) {
249602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"netperf: send_sdp_rr: requesting SDP rr test\n");
249702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
249802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_request();
250002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The response from the remote will contain all of the relevant
250202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 socket parameters for this test type. We will put them back
250302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 into the variables here so they can be displayed if desired.
250402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 The remote will have calibrated CPU if necessary, and will
250502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 have done all the needed set-up we will have calibrated the
250602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 cpu locally before sending the request, and will grab the
250702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 counter value right after the connect returns. The remote
250802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will grab the counter right after the accept call. This saves
250902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 the hassle of extra messages being sent for the SDP
251002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 tests.  */
251102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
251202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
251302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
251402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
251502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
251602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote listen done.\n");
251702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size          = sdp_rr_response->recv_buf_size;
251802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size          = sdp_rr_response->send_buf_size;
251902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rem_nodelay       = sdp_rr_response->no_delay;
252002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_usage  = sdp_rr_response->measure_cpu;
252102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_rate   = sdp_rr_response->cpu_rate;
252202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure that port numbers are in network order */
252302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	set_port_number(remote_res,(short)sdp_rr_response->data_port_number);
252402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
252502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
252602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
252702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
252802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"netperf: remote error %d",
252902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
253002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
253102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
253202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
253302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
253402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
253502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
253602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
253702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
253802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DEMO_RR_SETUP(1000)
253902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
254002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
254102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
254202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
254302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
254402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET){
254502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: data socket connect failed");
254602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
254702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
254802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
254902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either the */
255102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect would have failed, or the previous response would have */
255202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indicated a problem. I failed to see the value of the extra */
255302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* message after the accept on the remote. If it failed, we'll see it */
255402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here. If it didn't, we might as well start pumping data. */
255502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a request/response test, they */
255702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can be either time or transaction based. */
255802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
256002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
256102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
256202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = 0;
256302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
256402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
256502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
256602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
256702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = test_bytes;
256802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
256902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
257002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
257202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
257302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
257402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
257602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
257802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    INTERVALS_INIT();
257902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
258002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
258102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
258202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
258302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
258402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
258502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. I think I */
258602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* just arbitrarily decrement trans_remaining for the timed test, but */
258702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will not do that just yet... One other question is whether or not */
258802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the send buffer and the receive buffer should be the same buffer. */
258902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
259002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
259102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
259202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(demo_one_ptr);
259302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
259402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
259502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
259602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (trans_remaining > 0)) {
259702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send the request. we assume that if we use a blocking socket, */
259802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the request will be sent at one shot. */
259902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
260102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we can inject no more than request_cwnd, which will grow with
260202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 time, and no more than first_burst_size.  we don't use <= to
260302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 account for the "regularly scheduled" send call.  of course
260402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 that makes it more a "max_outstanding_ than a
260502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 "first_burst_size" but for now we won't fix the names. also,
260602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 I suspect the extra check against < first_burst_size is
260702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 redundant since later I expect to make sure that request_cwnd
260802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 can never get larger than first_burst_size, but just at the
260902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 moment I'm feeling like a belt and suspenders kind of
261002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 programmer. raj 2006-01-30 */
261102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while ((first_burst_size > 0) &&
261202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     (requests_outstanding < request_cwnd) &&
261302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     (requests_outstanding < first_burst_size)) {
261402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
261502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
261602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "injecting, req_outstndng %d req_cwnd %d burst %d\n",
261702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  requests_outstanding,
261802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  request_cwnd,
261902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  first_burst_size);
262002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
262102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((len = send(send_socket,
262202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->buffer_ptr,
262302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			req_size,
262402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			0)) != req_size) {
262502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we should never hit the end of the test in the first burst */
262602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_sdp_rr: initial burst data send error");
262702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(-1);
262802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
262902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	requests_outstanding += 1;
263002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
263102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
263302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
263502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
263602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp just before our call to send, and then again just
263702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   after the receive raj 8/94 */
263802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* but only if we are actually going to display one. raj
263902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   2007-02-07 */
264002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_one);
264202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
264302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
264402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((len = send(send_socket,
264602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      send_ring->buffer_ptr,
264702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      req_size,
264802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      0)) != req_size) {
264902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (SOCKET_EINTR(len) || (errno == 0)) {
265002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we hit the end of a */
265102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* timed test. */
265202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
265302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
265402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
265502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("send_sdp_rr: data send error");
265602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
265702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
265802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
265902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
266102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      requests_outstanding += 1;
266202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
266302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* receive the response */
266502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_left = rsp_size;
266602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_message_ptr  = recv_ring->buffer_ptr;
266702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while(rsp_bytes_left > 0) {
266802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if((rsp_bytes_recvd=recv(send_socket,
266902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 temp_message_ptr,
267002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 rsp_bytes_left,
267102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 0)) == SOCKET_ERROR) {
267202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if ( SOCKET_EINTR(rsp_bytes_recvd) ) {
267302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    /* We hit the end of a timed test. */
267402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			timed_out = 1;
267502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			break;
267602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
267702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_sdp_rr: data recv error");
267802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
267902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
268002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_bytes_left -= rsp_bytes_recvd;
268102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += rsp_bytes_recvd;
268202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
268302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
268402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
268502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
268602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* so, since we've gotten a response back, update the
268702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 bookkeeping accordingly.  there is one less request
268802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 outstanding and we can put one more out there than before. */
268902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      requests_outstanding -= 1;
269002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (request_cwnd < first_burst_size) {
269102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_cwnd += 1;
269202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
269302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
269402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "incr req_cwnd to %d first_burst %d reqs_outstndng %d\n",
269502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  request_cwnd,
269602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  first_burst_size,
269702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  requests_outstanding);
269802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
269902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
270002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
270102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (timed_out) {
270202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we may have been in a nested while loop - we need */
270302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* another call to break. */
270402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
270502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
270602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
270802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (verbosity > 1) {
270902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_timestamp(&time_two);
271002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
271102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
271202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
271302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DEMO
271502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      DEMO_RR_INTERVAL(1);
271602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
271702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
271902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      INTERVALS_WAIT();
272002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
272102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
272202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
272302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
272402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
272502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
272602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
272702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
272802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((nummessages % 100) == 0) {
272902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
273002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "Transaction %d completed\n",
273102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  nummessages);
273202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
273302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
273402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
273502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
273602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* At this point we used to call shutdown on the data socket to be
273802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       sure all the data was delivered, but this was not germane in a
273902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       request/response test, and it was causing the tests to "hang"
274002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       when they were being controlled by time. So, I have replaced
274102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       this shutdown call with a call to close that can be found later
274202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       in the procedure. */
274302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
274402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test,
274502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       and will also store-away the necessaries for cpu utilization */
274602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
274702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
274802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured? how long */
274902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* did we really run? */
275002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
275102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!no_control) {
275202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Get the statistics from the remote end. The remote will have
275302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 calculated CPU utilization. If it wasn't supposed to care, it
275402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 will return obvious values. */
275502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
275602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response();
275702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!netperf_response.content.serv_errno) {
275802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug)
275902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"remote results obtained\n");
276002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
276102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
276202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(netperf_response.content.serv_errno);
276302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"netperf: remote error %d",
276402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		netperf_response.content.serv_errno);
276502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("");
276602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
276702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
276802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
276902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
277002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our throughput was for the test. */
277202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
277402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= nummessages/elapsed_time;
277502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
277702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu
277802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       utilization for the system(s) Of course, some of the
277902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       information might be bogus because there was no idle counter in
278002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the kernel(s). We need to make a note of this for the user's
278102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       benefit... */
278202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
278302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization = calc_cpu_util(0.0);
278402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 	/* since calc_service demand is doing ms/Kunit we will
278502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   multiply the number of transaction by 1024 to get "good"
278602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   numbers */
278702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand  = calc_service_demand((double) nummessages*1024,
278802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
278902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
279002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0);
279102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
279202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
279302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
279402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
279502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
279602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
279702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
279802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = sdp_rr_result->cpu_util;
279902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will
280002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   multiply the number of transaction by 1024 to get "good"
280102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   numbers */
280202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand = calc_service_demand((double) nummessages*1024,
280302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
280402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    remote_cpu_utilization,
280502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    sdp_rr_result->num_cpus);
280602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
280702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
280802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
280902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
281002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
281102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
281202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
281302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
281402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
281502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
281602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
281702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
281802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
281902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
282002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
282102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
282202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information.
282302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       if debugging is on, calculate_confidence will print-out the
282402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       parameters we pass it */
282502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
282602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
282702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
282802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
282902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
283002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
283102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
283202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
283302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
283602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are now done with the socket, so close it */
283802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
283902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
284102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
284302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
284402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
284502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
284602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
284702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
284802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user has
285002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     specified zero-level verbosity, we will just print the local
285102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     service demand, or the remote service demand. If the user has
285202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     requested verbosity level 1, he will get the basic "streamperf"
285302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     numbers. If the user has specified a verbosity of greater than 1,
285402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     we will display a veritable plethora of background information
285502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     from outside of this block as it it not cpu_measurement
285602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     specific...  */
285702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
285802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
285902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
286002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
286102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
286202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
286302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
286402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
286602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
286702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(sdp_rr_result->cpu_method);
286802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
287002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
287102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
287202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
287302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
287402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
287502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
287602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
287702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
287802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
287902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
288002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
288102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
288202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
288302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method,
288402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		((print_headers) ||
288502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 (result_brand == NULL)) ? "" : result_brand);
288602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
288702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
288802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
288902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
289002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
289102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
289202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
289302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
289402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
289502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
289602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
289702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
289802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
289902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
290002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
290102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
290202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
290302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
290402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
290502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
290602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
290702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
290802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand,	/* remote service demand */
290902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
291002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
291102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
291202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
291302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
291402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
291502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
291602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
291702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
291802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
291902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
292002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
292102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
292202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
292302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
292402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
292502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
292602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
292702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
292802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
292902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
293002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
293102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
293202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
293302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
293402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
293502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
293602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
293702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
293802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
293902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
294002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
294102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
294202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
294302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      ((print_headers) ||
294402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       (result_brand == NULL)) ? "" : result_brand);
294502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
294602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
294702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
294802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
294902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
295102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
295202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
295302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
295502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
295602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
295702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
295802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
295902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how to handle the verbose information in the presence of */
296102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence intervals is yet to be determined... raj 11/94 */
296202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
296302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
296402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
296502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* SDP statistics, the alignments of the sends and receives */
296602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
296702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
296902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
297002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
297102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
297202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
297302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset);
297402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
297502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
297602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
297702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
297802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
297902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
298002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
298202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
298402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive (netserver) side of a SDP_RR */
298502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test */
298602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
298702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_sdp_rr()
298802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
298902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
299102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
299202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
299402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
299502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
299602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sockaddr_in        myaddr_in,
299802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  peeraddr_in;
299902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET	s_listen,s_data;
300002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t 	addrlen;
300102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
300202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
300302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
300402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
300502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_recvd;
300602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
300702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
300802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   sock_closed = 0;
300902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
301002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_rr_request_struct	*sdp_rr_request;
301202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_rr_response_struct	*sdp_rr_response;
301302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sdp_rr_results_struct	*sdp_rr_results;
301402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_request =
301602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_rr_request_struct *)netperf_request.content.test_specific_data;
301702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response =
301802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_rr_response_struct *)netperf_response.content.test_specific_data;
301902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_results =
302002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sdp_rr_results_struct *)netperf_response.content.test_specific_data;
302102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
302302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_sdp_rr: entered...\n");
302402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
302502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
302602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
302802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
302902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
303002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
303102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
303202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
303302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
303402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
303502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
303602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
303702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
303802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
303902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
304102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_rr: setting the response type...\n");
304202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
304302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
304402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = SDP_RR_RESPONSE;
304602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
304802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_rr: the response type is set...\n");
304902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
305002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
305102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* allocate the recv and send rings with the requested alignments */
305302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and offsets. raj 7/94 */
305402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
305502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_rr: requested recv alignment of %d offset %d\n",
305602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_rr_request->recv_alignment,
305702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_rr_request->recv_offset);
305802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_rr: requested send alignment of %d offset %d\n",
305902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_rr_request->send_alignment,
306002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sdp_rr_request->send_offset);
306102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
306202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
306302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
306402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at some point, these need to come to us from the remote system */
306502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
306602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
306702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
306802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
306902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_rr_request->response_size,
307002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_rr_request->send_alignment,
307102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_rr_request->send_offset);
307202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
307402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_rr_request->request_size,
307502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_rr_request->recv_alignment,
307602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sdp_rr_request->recv_offset);
307702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
308002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
308202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_rr: grabbing a socket...\n");
308302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
308402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
308502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
308702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
308802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
308902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
309002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = sdp_rr_request->send_buf_size;
309102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = sdp_rr_request->recv_buf_size;
309202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = sdp_rr_request->no_delay;
309302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = sdp_rr_request->so_rcvavoid;
309402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = sdp_rr_request->so_sndavoid;
309502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
309702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
309802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(sdp_rr_request->ipfamily),
309902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			sdp_rr_request->port);
310002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
310202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
310302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
310402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(sdp_rr_request->ipfamily),
310502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
310602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_TCP,
310702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
310802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* fake things out by changing local_res->ai_family to AF_INET_SDP */
311002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res->ai_family = AF_INET_SDP;
311102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res->ai_protocol = 0;
311202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
311302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen == INVALID_SOCKET) {
311502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
311602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
311702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
311902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
312002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
312302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The test timer can fire during operations on the listening socket,
312402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     so to make the start_timer below work we have to move
312502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     it to close s_listen while we are blocked on accept. */
312602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket2 = s_listen;
312702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
312802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
313102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == SOCKET_ERROR) {
313202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
313302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
313402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
313502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
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  /* now get the port number assigned by the system  */
314102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
314202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
314302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
314402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == SOCKET_ERROR) {
314502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
314602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
314702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
314802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
315002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
315102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
315302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
315402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
315502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
315702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
315802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
316002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
316102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
316202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
316302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
316402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->cpu_rate = (float)0.0; 	/* assume no cpu */
316602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->measure_cpu = 0;
316702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_rr_request->measure_cpu) {
316902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_rr_response->measure_cpu = 1;
317002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_rr_response->cpu_rate = calibrate_local_cpu(sdp_rr_request->cpu_rate);
317102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
317202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
317502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
317602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->send_buf_size = lss_size;
317702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->recv_buf_size = lsr_size;
317802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->no_delay = loc_nodelay;
317902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->so_rcvavoid = loc_rcvavoid;
318002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->so_sndavoid = loc_sndavoid;
318102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_response->test_length = sdp_rr_request->test_length;
318202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
318302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
318502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data = accept(s_listen,
318702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       (struct sockaddr *)&peeraddr_in,
318802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       &addrlen)) == INVALID_SOCKET) {
318902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
319002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
319102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
319302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
319402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
319602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass */
319702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* attributes across an accept() call. Including this goes against */
319802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* my better judgement :( raj 11/95 */
319902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
320102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
320302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
320502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is used so the timer thread can close the socket out from */
320602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* under us, which to date is the easiest/cleanest/least */
320702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Windows-specific way I can find to force the winsock calls to */
320802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return WSAEINTR with the test is over. anything that will run on */
320902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 95 and NT and is closer to what netperf expects from Unix signals */
321002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and such would be appreciated raj 1/96 */
321102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  win_kludge_socket = s_data;
321202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
321302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
321402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
321502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sdp_rr: accept completes on the data connection.\n");
321602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
321702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
321802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
321902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
322002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
322102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(sdp_rr_request->measure_cpu);
322302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when we hit the end of the test time, or when */
322502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have exchanged the requested number of transactions. */
322602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_rr_request->test_length > 0) {
322802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
322902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
323002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(sdp_rr_request->test_length + PAD_TIME);
323102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
323202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
323302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
323402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = sdp_rr_request->test_length * -1;
323502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
323602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
323802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
324002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr = recv_ring->buffer_ptr;
324102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining	= sdp_rr_request->request_size;
324202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(request_bytes_remaining > 0) {
324302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((request_bytes_recvd=recv(s_data,
324402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   temp_message_ptr,
324502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   request_bytes_remaining,
324602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   0)) == SOCKET_ERROR) {
324702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (SOCKET_EINTR(request_bytes_recvd))
324802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
324902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
325002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
325102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
325202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = errno;
325402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
325502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
325602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
325702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else if( request_bytes_recvd == 0 ) {
325802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
325902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"zero is my hero\n");
326002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
326102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
326202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sock_closed = 1;
326302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
326402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
326502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
326602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	request_bytes_remaining -= request_bytes_recvd;
326702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += request_bytes_recvd;
326802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
326902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
327002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
327202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((timed_out) || (sock_closed)) {
327402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - or the socket
327502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 closed on us along the way.  bail out of here now... */
327602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
327702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo5\n");
327802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
327902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
328002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
328102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
328202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
328402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((bytes_sent=send(s_data,
328502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			send_ring->buffer_ptr,
328602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			sdp_rr_request->response_size,
328702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			0)) == SOCKET_ERROR) {
328802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(bytes_sent)) {
328902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
329002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
329102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo6\n");
329202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
329302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
329402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
329502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 992;
329602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
329702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
329802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
329902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
330102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
330302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
330402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
330502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
330602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
330702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
331002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
331102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
331202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(sdp_rr_request->measure_cpu,&elapsed_time);
331302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
331402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  stop_timer();
331502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
331602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
331702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
331802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
331902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
332002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
332102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
332202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
332402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
332602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
332702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sdp_rr: got %d transactions\n",
332802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
332902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
333002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
333102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
333202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_results->bytes_received = (trans_received *
333302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    (sdp_rr_request->request_size +
333402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     sdp_rr_request->response_size));
333502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_results->trans_received = trans_received;
333602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_results->elapsed_time   = elapsed_time;
333702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_results->cpu_method     = cpu_method;
333802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sdp_rr_results->num_cpus       = lib_num_loc_cpus;
333902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sdp_rr_request->measure_cpu) {
334002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sdp_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
334102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
334202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
334402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
334502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sdp_rr: test complete, sending results.\n");
334602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
334702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
334802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
335002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
335102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_listen);
335202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
335402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
335602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
336002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_sdp_usage()
336102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
336202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  printf("%s",sdp_usage);
336402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(1);
336502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
336702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
336802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectscan_sdp_args(argc, argv)
336902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int	argc;
337002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     char	*argv[];
337102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
337302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define SOCKETS_ARGS "b:DhH:I:L:m:M:P:r:s:S:V46"
337502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  extern char	*optarg;	  /* pointer to option string	*/
337702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int		c;
337902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char
338102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    arg1[BUFSIZ],  /* argument holders		*/
338202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    arg2[BUFSIZ];
338302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (no_control) {
338502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
338602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "The SDP tests do not know how to deal with no control tests\n");
338702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
338802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
338902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strncpy(local_data_port,"0",sizeof(local_data_port));
339102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strncpy(remote_data_port,"0",sizeof(remote_data_port));
339202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Go through all the command line arguments and break them */
339402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* out. For those options that take two parms, specifying only */
339502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the first will set both to that value. Specifying only the */
339602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* second will leave the first untouched. To change only the */
339702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first, use the form "first," (see the routine break_args.. */
339802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((c= getopt(argc, argv, SOCKETS_ARGS)) != EOF) {
340002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (c) {
340102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '?':
340202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '4':
340302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_data_family = AF_INET;
340402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_data_family = AF_INET;
340502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
340602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '6':
340702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
340802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_data_family = AF_INET6;
340902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_data_family = AF_INET6;
341002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
341102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr,
341202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "This netperf was not compiled on an IPv6 capable host!\n");
341302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(stderr);
341402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
341502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
341602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
341702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'h':
341802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      print_sdp_usage();
341902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
342002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'b':
342102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
342202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      first_burst_size = atoi(optarg);
342302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* WANT_FIRST_BURST */
342402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Initial request burst functionality not compiled-in!\n");
342502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
342602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
342702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'D':
342802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the nodelay flag */
342902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_nodelay = 1;
343002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay = 1;
343102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
343202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'H':
343302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args_explicit(optarg,arg1,arg2);
343402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0]) {
343502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure we leave room for the NULL termination boys and
343602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   girls. raj 2005-02-82 */
343702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_data_address = malloc(strlen(arg1)+1);
343802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_address,arg1,strlen(arg1));
343902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
344002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
344102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_data_family = parse_address_family(arg2);
344202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
344302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'L':
344402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args_explicit(optarg,arg1,arg2);
344502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0]) {
344602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure we leave room for the NULL termination boys and
344702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   girls. raj 2005-02-82 */
344802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_data_address = malloc(strlen(arg1)+1);
344902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(local_data_address,arg1,strlen(arg1));
345002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
345102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
345202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_data_family = parse_address_family(arg2);
345302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
345402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'P':
345502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the local and remote data port numbers for the tests to
345602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 allow them to run through those blankety blank end-to-end
345702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 breaking firewalls. raj 2004-06-15 */
345802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
345902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
346002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(local_data_port,arg1,sizeof(local_data_port));
346102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
346202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_port,arg2,sizeof(remote_data_port));
346302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
346402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 's':
346502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set local socket sizes */
346602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
346702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
346802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lss_size_req = convert(arg1);
346902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
347002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lsr_size_req = convert(arg2);
347102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
347202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'S':
347302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set remote socket sizes */
347402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
347502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
347602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size_req = convert(arg1);
347702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
347802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size_req = convert(arg2);
347902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
348002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'r':
348102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the request/response sizes */
348202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
348302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
348402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	req_size = convert(arg1);
348502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
348602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_size = convert(arg2);
348702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
348802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'm':
348902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set size of the buffer for each sent message */
349002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = convert(optarg);
349102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
349202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'M':
349302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the size of the buffer for each received message */
349402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = convert(optarg);
349502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
349602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 't':
349702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the test name */
349802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      strcpy(test_name,optarg);
349902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
350002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'W':
350102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* set the "width" of the user space data */
350202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* buffer. This will be the number of */
350302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* send_size buffers malloc'd in the */
350402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* *_STREAM test. It may be enhanced to set */
350502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* both send and receive "widths" but for now */
350602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* it is just the sending *_STREAM. */
350702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_width = convert(optarg);
350802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
350902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'V':
351002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to do copy avoidance and will set */
351102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it for everything, everywhere, if we really */
351202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* can. of course, we don't know anything */
351302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* about the remote... */
351402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_SND_COPYAVOID
351502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 1;
351602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
351702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 0;
351802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Local send copy avoidance not available.\n");
351902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
352002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_RCV_COPYAVOID
352102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 1;
352202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
352302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 0;
352402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Local recv copy avoidance not available.\n");
352502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
352602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid = 1;
352702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid = 1;
352802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
352902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'N':
353002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* this opton allows the user to set the number of
353102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * messages to send.  This in effect modifies the test
353202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * time.  If we know the message size, then the we can
353302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * express the test time as message_size * number_messages
353402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       */
353502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      msg_count = convert (optarg);
353602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (msg_count > 0)
353702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  test_time = 0;
353802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
353902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'B':
354002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      non_block = 1;
354102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
354202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'T':
354302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      num_associations = atoi(optarg);
354402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (num_associations <= 1) {
354502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  printf("Number of SDP associations must be >= 1\n");
354602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
354702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
354802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
354902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
355002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
355102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
355202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
355302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif  /* WANT_SDP */
3554