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