102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar    netlib_id[]="\
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netlib.c (c) Copyright 1993-2007 Hewlett-Packard Company. Version 2.4.3";
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      netlib.c                                                */
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      the common utility routines available to all...         */
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      establish_control()     establish the control socket    */
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      calibrate_local_cpu()   do local cpu calibration        */
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      calibrate_remote_cpu()  do remote cpu calibration       */
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      send_request()          send a request to the remote    */
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      recv_response()         receive a response from remote  */
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      send_response()         send a response to the remote   */
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      recv_request()          recv a request from the remote  */
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dump_request()          dump request contents           */
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dump_response()         dump response contents          */
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      cpu_start()             start measuring cpu             */
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      cpu_stop()              stop measuring cpu              */
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      calc_cpu_util()         calculate the cpu utilization   */
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      calc_service_demand()   calculate the service demand    */
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      calc_thruput()          calulate the tput in units      */
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      calibrate()             really calibrate local cpu      */
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      identify_local()        print local host information    */
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      identify_remote()       print remote host information   */
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      format_number()         format the number (KB, MB,etc)  */
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      format_units()          return the format in english    */
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      msec_sleep()            sleep for some msecs            */
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      start_timer()           start a timer                   */
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      the routines you get when WANT_DLPI is defined...         */
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_open()               open a file descriptor and      */
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                              attach to the card              */
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_mtu()                find the MTU of the card        */
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_bind()               bind the sap do the card        */
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_connect()            sender's have of connect        */
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_accpet()             receiver's half of connect      */
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_set_window()         set the window size             */
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_stats()              retrieve statistics             */
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_send_disc()          initiate disconnect (sender)    */
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      dl_recv_disc()          accept disconnect (receiver)    */
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      Global include files                                    */
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_CONFIG_H
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <config.h>
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* It would seem that most of the includes being done here from */
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* "sys/" actually have higher-level wrappers at just /usr/include. */
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* This is based on a spot-check of a couple systems at my disposal. */
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* If you have trouble compiling you may want to add "sys/" raj 10/95 */
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <limits.h>
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <signal.h>
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef MPE
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  define NSIG _NSIG
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* MPE */
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <fcntl.h>
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdlib.h>
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <math.h>
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <string.h>
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <assert.h>
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_ENDIAN_H
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <endian.h>
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* at some point, I would like to get rid of all these "sys/" */
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* includes where appropriate. if you have a system that requires */
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* them, speak now, or your system may not comile later revisions of */
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* netperf. raj 1/96 */
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <unistd.h>
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/stat.h>
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/times.h>
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef MPE
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <time.h>
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/time.h>
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* MPE */
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/socket.h>
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/in.h>
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <arpa/inet.h>
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netdb.h>
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/utsname.h>
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if !defined(MPE) && !defined(__VMS)
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/param.h>
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* MPE */
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* WIN32 */
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <process.h>
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <time.h>
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <winsock2.h>
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define netperf_socklen_t socklen_t
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <windows.h>
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* the only time someone should need to define DONT_IPV6 in the
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   "sources" file is if they are trying to compile on Windows 2000 or
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   NT4 and I suspect this may not be their only problem :) */
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef DONT_IPV6
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <ws2tcpip.h>
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <windows.h>
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define SIGALRM (14)
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define sleep(x) Sleep((x)*1000)
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef _AIX
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/select.h>
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/sched.h>
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/pri.h>
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define PRIORITY PRI_LOW
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else/* _AIX */
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __sgi
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/prctl.h>
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/schedctl.h>
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define PRIORITY NDPLOMIN
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __sgi */
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* _AIX */
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DLPI
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/stream.h>
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/stropts.h>
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/poll.h>
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __osf__
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/dlpihdr.h>
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* __osf__ */
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/dlpi.h>
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __hpux
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/dlpi_ext.h>
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __hpux */
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __osf__ */
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_DLPI */
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_MPCTL
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/mpctl.h>
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include "missing/getaddrinfo.h"
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "hist.h"
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      Local Include Files                                     */
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETLIB
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netcpu.h"
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      Global constants, macros and variables                  */
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WIN32) || defined(__VMS)
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct  timezone {
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        int     dummy ;
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        } ;
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef __VMS
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSOCKET     win_kludge_socket = INVALID_SOCKET;
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSOCKET     win_kludge_socket2 = INVALID_SOCKET;
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __VMS */
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 || __VMS */
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef LONG_LONG_MAX
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define LONG_LONG_MAX 9223372036854775807LL
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* LONG_LONG_MAX */
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* older versions of netperf knew about the HP kernel IDLE counter. */
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this is now obsolete - in favor of either pstat(), times, or a */
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* process-level looper process. we also now require support for the */
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* "long" integer type. raj 4/95.  */
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_num_loc_cpus,    /* the number of cpus in the system */
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_num_rem_cpus;    /* how many we think are in the remote */
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define PAGES_PER_CHILD 2
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     lib_use_idle;
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     cpu_method;
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct  timeval         time1, time2;
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct  timezone        tz;
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat   lib_elapsed,
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        lib_local_maxrate,
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        lib_remote_maxrate,
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        lib_local_cpu_util,
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        lib_remote_cpu_util;
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat   lib_local_per_cpu_util[MAXCPUS];
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     lib_cpu_map[MAXCPUS];
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     *request_array;
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     *response_array;
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* INVALID_SOCKET == INVALID_HANDLE_VALUE == (unsigned int)(~0) == -1 */
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSOCKET  netlib_control = INVALID_SOCKET;
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSOCKET  server_sock = INVALID_SOCKET;
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* global variables to hold the value for processor affinity */
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     local_proc_affinity,remote_proc_affinity = -1;
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* these are to allow netperf to be run easily through those evil,
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   end-to-end breaking things known as firewalls */
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar local_data_port[10];
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar remote_data_port[10];
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *local_data_address=NULL;
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *remote_data_address=NULL;
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint local_data_family=AF_UNSPEC;
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint remote_data_family=AF_UNSPEC;
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* in the past, I was overlaying a structure on an array of ints. now */
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* I am going to have a "real" structure, and point an array of ints */
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* at it. the real structure will be forced to the same alignment as */
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the type "double." this change will mean that pre-2.1 netperfs */
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* cannot be mixed with 2.1 and later. raj 11/95 */
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectunion   netperf_request_struct  netperf_request;
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectunion   netperf_response_struct netperf_response;
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectFILE    *where;
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar    libfmt = '?';
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DLPI
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* some stuff for DLPI control messages */
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DLPI_DATA_SIZE 2048
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectunsigned long control_data[DLPI_DATA_SIZE];
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct strbuf control_message = {DLPI_DATA_SIZE, 0, (char *)control_data};
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_DLPI */
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHANDLE hAlarm = INVALID_HANDLE_VALUE;
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     times_up;
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we use a getopt implementation from net.sources */
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * get option letter from argument vector
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        opterr = 1,             /* should error messages be printed? */
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        optind = 1,             /* index into parent argv vector */
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        optopt;                 /* character checked for validity */
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        *optarg;                /* argument associated with option */
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define EMSG    ""
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int measuring_cpu;
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnetlib_get_page_size(void) {
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* not all systems seem to have the sysconf for page size. for
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    those  which do not, we will assume that the page size is 8192
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes.  this should be more than enough to be sure that there is
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    no page  or cache thrashing by looper processes on MP
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    systems. otherwise  that's really just too bad - such systems
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    should define  _SC_PAGE_SIZE - raj 4/95 */
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef _SC_PAGE_SIZE
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSYSTEM_INFO SystemInfo;
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project GetSystemInfo(&SystemInfo);
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return SystemInfo.dwPageSize;
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return(8192L);
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif  /* WIN32 */
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return(sysconf(_SC_PAGE_SIZE));
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* _SC_PAGE_SIZE */
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic unsigned int usec_per_itvl;
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstop_itimer()
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct itimerval new_interval;
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct itimerval old_interval;
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  new_interval.it_interval.tv_sec = 0;
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  new_interval.it_interval.tv_usec = 0;
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  new_interval.it_value.tv_sec = 0;
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  new_interval.it_value.tv_usec = 0;
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (setitimer(ITIMER_REAL,&new_interval,&old_interval) != 0) {
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was a problem arming the interval timer */
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: setitimer");
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecterror(char *pch)
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!opterr) {
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return;             /* without printing */
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(stderr, "%s: %s: %c\n",
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (NULL != program) ? program : "getopt", pch, optopt);
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectgetopt(int argc, char **argv, char *ostr)
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  static char *place = EMSG;    /* option letter processing */
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  register char *oli;                   /* option letter list index */
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!*place) {
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* update scanning pointer */
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (optind >= argc || *(place = argv[optind]) != '-' || !*++place) {
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        return EOF;
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (*place == '-') {
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* found "--" */
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        ++optind;
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      place = EMSG ;    /* Added by shiva for Netperf */
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        return EOF;
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* option letter okay? */
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((optopt = (int)*place++) == (int)':'
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      || !(oli = strchr(ostr, optopt))) {
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!*place) {
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      ++optind;
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    error("illegal option");
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return BADCH;
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (*++oli != ':') {
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* don't need argument */
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    optarg = NULL;
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!*place)
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      ++optind;
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } else {
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* need an argument */
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (*place) {
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      optarg = place;           /* no white space */
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } else  if (argc <= ++optind) {
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* no arg */
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      place = EMSG;
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      error("option requires an argument");
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return BADCH;
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } else {
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      optarg = argv[optind];            /* white space */
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    place = EMSG;
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ++optind;
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return optopt;                        /* return option letter */
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*----------------------------------------------------------------------------
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * WIN32 implementation of perror, does not deal very well with WSA errors
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * The stdlib.h version of perror only deals with the ancient XENIX error codes.
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project *
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * +*+SAF Why can't all WSA errors go through GetLastError?  Most seem to...
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project *--------------------------------------------------------------------------*/
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid PrintWin32Error(FILE *stream, LPSTR text)
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    LPSTR    szTemp;
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DWORD    dwResult;
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    DWORD    dwError;
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dwError = GetLastError();
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dwResult = FormatMessage(
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        NULL,
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        dwError,
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LANG_NEUTRAL,
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (LPTSTR)&szTemp,
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        0,
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        NULL );
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (dwResult)
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(stream, "%s: %s\n", text, szTemp);
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(stream, "%s: error 0x%x\n", text, dwError);
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(stream);
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (szTemp)
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        LocalFree((HLOCAL)szTemp);
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectinet_ttos(int type)
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch (type) {
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case SOCK_DGRAM:
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("SOCK_DGRAM");
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case SOCK_STREAM:
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("SOCK_STREAM");
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("SOCK_UNKNOWN");
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar unknown[32];
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectinet_ptos(int protocol) {
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch (protocol) {
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case IPPROTO_TCP:
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("IPPROTO_TCP");
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case IPPROTO_UDP:
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("IPPROTO_UDP");
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(IPPROTO_SCTP)
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case IPPROTO_SCTP:
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("IPPROTO_SCTP");
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(unknown,sizeof(unknown),"IPPROTO_UNKNOWN(%d)",protocol);
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(unknown);
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* one of these days, this should not be required */
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef AF_INET_SDP
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define AF_INET_SDP 27
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define PF_INET_SDP AF_INET_SDP
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectinet_ftos(int family)
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch(family) {
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET:
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("AF_INET");
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET6:
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("AF_INET6");
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET_SDP)
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET_SDP:
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("AF_INET_SDP");
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return("AF_UNSPEC");
50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectinet_nton(int af, const void *src, char *dst, int cnt)
50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch (af) {
50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET:
51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* magic constants again... :) */
51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (cnt >= 4) {
51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      memcpy(dst,src,4);
51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return 4;
51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(ENOSPC);
51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return(-1);
51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case AF_INET6:
52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (cnt >= 16) {
52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      memcpy(dst,src,16);
52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return(16);
52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(ENOSPC);
52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return(-1);
52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Set_errno(EAFNOSUPPORT);
53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble
53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectntohd(double net_double)
54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we rely on things being nicely packed */
54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  union {
54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    double whole_thing;
54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unsigned int words[2];
54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unsigned char bytes[8];
54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } conv_rec;
54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned char scratch;
55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on those systems where ntohl is a no-op, we want to return the */
55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* original value, unchanged */
55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (ntohl(1L) == 1L) {
55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(net_double);
55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  conv_rec.whole_thing = net_double;
56002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
56102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we know that in the message passing routines that ntohl will have */
56202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* been called on the 32 bit quantities. we need to put those back */
56302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the way they belong before we swap */
56402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  conv_rec.words[0] = htonl(conv_rec.words[0]);
56502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  conv_rec.words[1] = htonl(conv_rec.words[1]);
56602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
56702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now swap */
56802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i=0; i<= 3; i++) {
56902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    scratch = conv_rec.bytes[i];
57002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    conv_rec.bytes[i] = conv_rec.bytes[7-i];
57102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    conv_rec.bytes[7-i] = scratch;
57202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
57302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(__FLOAT_WORD_ORDER) && defined(__BYTE_ORDER)
57502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (__FLOAT_WORD_ORDER != __BYTE_ORDER) {
57602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Fixup mixed endian floating point machines */
57702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unsigned int scratch = conv_rec.words[0];
57802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    conv_rec.words[0] = conv_rec.words[1];
57902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    conv_rec.words[1] = scratch;
58002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
58102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
58202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(conv_rec.whole_thing);
58402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
58602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble
58802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecthtond(double host_double)
58902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
59102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we rely on things being nicely packed */
59202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  union {
59302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    double whole_thing;
59402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unsigned int words[2];
59502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unsigned char bytes[8];
59602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } conv_rec;
59702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned char scratch;
59902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
60002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on those systems where ntohl is a no-op, we want to return the */
60202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* original value, unchanged */
60302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (ntohl(1L) == 1L) {
60502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(host_double);
60602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
60702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  conv_rec.whole_thing = host_double;
60902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
61002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now swap */
61102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i=0; i<= 3; i++) {
61202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    scratch = conv_rec.bytes[i];
61302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    conv_rec.bytes[i] = conv_rec.bytes[7-i];
61402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    conv_rec.bytes[7-i] = scratch;
61502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
61602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
61702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(__FLOAT_WORD_ORDER) && defined(__BYTE_ORDER)
61802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (__FLOAT_WORD_ORDER != __BYTE_ORDER) {
61902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Fixup mixed endian floating point machines */
62002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    unsigned int scratch = conv_rec.words[0];
62102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    conv_rec.words[0] = conv_rec.words[1];
62202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    conv_rec.words[1] = scratch;
62302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
62402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
62502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
62602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we know that in the message passing routines htonl will */
62702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* be called on the 32 bit quantities. we need to set things up so */
62802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that when this happens, the proper order will go out on the */
62902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* network */
63002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  conv_rec.words[0] = htonl(conv_rec.words[0]);
63102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  conv_rec.words[1] = htonl(conv_rec.words[1]);
63202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(conv_rec.whole_thing);
63402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
63602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* one of these days, this should be abstracted-out just like the CPU
63902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   util stuff.  raj 2005-01-27 */
64002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
64102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_num_cpus()
64202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
64402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on HP-UX, even when we use the looper procs we need the pstat */
64602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* call */
64702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int temp_cpus;
64902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __hpux
65102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/pstat.h>
65202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct pst_dynamic psd;
65402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (pstat_getdynamic((struct pst_dynamic *)&psd,
65602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       (size_t)sizeof(psd), (size_t)1, 0) != -1) {
65702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_cpus = psd.psd_proc_cnt;
65802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
65902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
66002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_cpus = 1;
66102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
66202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
66402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* MW: <unistd.h> was included for non-Windows systems above. */
66502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Thus if _SC_NPROC_ONLN is defined, we should be able to use sysconf. */
66602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef _SC_NPROCESSORS_ONLN
66702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_cpus = sysconf(_SC_NPROCESSORS_ONLN);
66802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef USE_PERFSTAT
67002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_cpus = perfstat_cpu(NULL,NULL, sizeof(perfstat_cpu_t), 0);
67102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* USE_PERFSTAT */
67202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
67302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* no _SC_NPROCESSORS_ONLN */
67402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
67502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
67602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SYSTEM_INFO SystemInfo;
67702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  GetSystemInfo(&SystemInfo);
67802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
67902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_cpus = SystemInfo.dwNumberOfProcessors;
68002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
68102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we need to know some other ways to do this, or just fall-back on */
68202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* a global command line option - raj 4/95 */
68302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_cpus = shell_num_cpus;
68402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif  /* WIN32 */
68502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* _SC_NPROCESSORS_ONLN */
68602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /*  __hpux */
68702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (temp_cpus > MAXCPUS) {
68902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
69002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "Sorry, this system has more CPUs (%d) than I can handle (%d).\n",
69102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            temp_cpus,
69202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            MAXCPUS);
69302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
69402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "Please alter MAXCPUS in netlib.h and recompile.\n");
69502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
69602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
69702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
69802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(temp_cpus);
70002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
70102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
70202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
70302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
70402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __GNUC__
70502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  #define S64_SUFFIX(x) x##LL
70602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
70702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  #define S64_SUFFIX(x) x##i64
70802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
70902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
71102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * Number of 100 nanosecond units from 1/1/1601 to 1/1/1970
71202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */
71302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define EPOCH_BIAS  S64_SUFFIX(116444736000000000)
71402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
71602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * Union to facilitate converting from FILETIME to unsigned __int64
71702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */
71802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttypedef union {
71902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        unsigned __int64 ft_scalar;
72002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        FILETIME ft_struct;
72102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} FT;
72202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
72402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectgettimeofday( struct timeval *tv , struct timezone *not_used )
72502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
72602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        FT nt_time;
72702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        __int64 UnixTime;  /* microseconds since 1/1/1970 */
72802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        GetSystemTimeAsFileTime( &(nt_time.ft_struct) );
73002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        UnixTime = ((nt_time.ft_scalar - EPOCH_BIAS) / S64_SUFFIX(10));
73202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tv->tv_sec = (long)(time_t)(UnixTime / S64_SUFFIX(1000000));
73302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        tv->tv_usec = (unsigned long)(UnixTime % S64_SUFFIX(1000000));
73402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
73502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
73602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/************************************************************************/
74002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                                      */
74102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      signal catcher                                                  */
74202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                                      */
74302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/************************************************************************/
74402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
74602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(__hpux)
74702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcatcher(sig, code, scp)
74802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int sig;
74902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int code;
75002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     struct sigcontext *scp;
75102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
75202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcatcher(int sig)
75302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __hpux || __VMS */
75402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
75502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
75602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __hpux
75702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 2) {
75802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"caught signal %d ",sig);
75902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (scp) {
76002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"while in syscall %d\n",
76102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              scp->sc_syscall);
76202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
76302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
76402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"null scp\n");
76502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
76602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
76702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
76802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* RAJ_DEBUG */
76902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch(sig) {
77102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
77202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case SIGINT:
77302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: caught SIGINT\n");
77402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
77502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
77602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
77702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case SIGALRM:
77802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   if (--test_len_ticks == 0) {
77902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the test is over */
78002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (times_up != 0) {
78102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"catcher: timer popped with times_up != 0\n");
78202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
78302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
78402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
78502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_INTERVALS) && !defined(WANT_SPIN)
78602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      stop_itimer();
78702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
78802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
78902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
79002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
79102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
79202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __hpux
79302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the test is not over yet and we must have been using the */
79402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer. if we were in SYS_SIGSUSPEND we want to */
79502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* re-start the system call. Otherwise, we want to get out of */
79602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the sigsuspend call. I NEED TO KNOW HOW TO DO THIS FOR OTHER */
79702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* OPERATING SYSTEMS. If you know how, please let me know. rick */
79802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* jones <raj@cup.hp.com> */
79902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (scp->sc_syscall != SYS_SIGSUSPEND) {
80002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (debug > 2) {
80102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          fprintf(where,
80202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                  "catcher: Time to send burst > interval!\n");
80302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          fflush(where);
80402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
80502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        scp->sc_syscall_action = SIG_RESTART;
80602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
80702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __hpux */
80802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* WANT_INTERVALS */
80902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
81002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "catcher: interval timer running unexpectedly!\n");
81102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
81202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
81302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
81402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
81502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
81602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
81702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
81802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
81902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
82202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectinstall_signal_catchers()
82302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
82502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just a simple little routine to catch a bunch of signals */
82602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
82802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sigaction action;
82902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
83002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
83102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,"installing catcher for all signals\n");
83202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
83302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
83402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigemptyset(&(action.sa_mask));
83502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  action.sa_handler = catcher;
83602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
83702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SA_INTERRUPT
83802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  action.sa_flags = SA_INTERRUPT;
83902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* SA_INTERRUPT */
84002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  action.sa_flags = 0;
84102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* SA_INTERRUPT */
84202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 1; i <= NSIG; i++) {
84502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (i != SIGALRM) {
84602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (sigaction(i,&action,NULL) != 0) {
84702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
84802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                "Could not install signal catcher for sig %d, errno %d\n",
84902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                i,
85002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                errno);
85102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
85202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
85402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
85502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
85602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
85702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
85802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
85902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
86002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
86302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define SIGALRM (14)
86402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
86502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectemulate_alarm( int seconds )
86602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
86702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	DWORD ErrorCode;
86802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* Wait on this event for parm seconds. */
87002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ErrorCode = WaitForSingleObject(hAlarm, seconds*1000);
87202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (ErrorCode == WAIT_FAILED)
87302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
87402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		perror("WaitForSingleObject failed");
87502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		exit(1);
87602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
87702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (ErrorCode == WAIT_TIMEOUT)
87902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
88002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* WaitForSingleObject timed out; this means the timer
88102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     wasn't canceled. */
88202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
88302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        times_up = 1;
88402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
88502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* We have yet to find a good way to fully emulate the effects */
88602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* of signals and getting EINTR from system calls under */
88702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* winsock, so what we do here is close the socket out from */
88802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* under the other thread.  It is rather kludgy, but should be */
88902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* sufficient to get this puppy shipped.  The concept can be */
89002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* attributed/blamed :) on Robin raj 1/96 */
89102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (win_kludge_socket != INVALID_SOCKET) {
89302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          closesocket(win_kludge_socket);
89402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
89502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (win_kludge_socket2 != INVALID_SOCKET) {
89602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          closesocket(win_kludge_socket2);
89702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
89802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
89902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
90002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
90202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
90402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstart_timer(int time)
90502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
90602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
90802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/*+*+SAF What if StartTimer is called twice without the first timer */
90902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/*+*+SAF expiring? */
91002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
91102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	DWORD  thread_id ;
91202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HANDLE tHandle;
91302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
91402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (hAlarm == (HANDLE) INVALID_HANDLE_VALUE)
91502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
91602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		/* Create the Alarm event object */
91702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		hAlarm = CreateEvent(
91802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			(LPSECURITY_ATTRIBUTES) NULL,	  /* no security */
91902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			FALSE,	 /* auto reset event */
92002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			FALSE,   /* init. state = reset */
92102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			(void *)NULL);  /* unnamed event object */
92202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if (hAlarm == (HANDLE) INVALID_HANDLE_VALUE)
92302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		{
92402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			perror("CreateEvent failure");
92502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			exit(1);
92602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
92702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
92802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else
92902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
93002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		ResetEvent(hAlarm);
93102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
93202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	tHandle = CreateThread(0,
93502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					       0,
93602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						   (LPTHREAD_START_ROUTINE)emulate_alarm,
93702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						   (LPVOID)(ULONG_PTR)time,
93802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						   0,
93902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						   &thread_id ) ;
94002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	CloseHandle(tHandle);
94102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
94202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* not WIN32 */
94302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
94402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct sigaction action;
94502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
94602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (debug) {
94702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,"About to start a timer for %d seconds.\n",time);
94802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
94902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
95002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
95102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  action.sa_handler = catcher;
95202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigemptyset(&(action.sa_mask));
95302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigaddset(&(action.sa_mask),SIGALRM);
95402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
95502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SA_INTERRUPT
95602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on some systems (SunOS 4.blah), system calls are restarted. we do */
95702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not want that */
95802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  action.sa_flags = SA_INTERRUPT;
95902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* SA_INTERRUPT */
96002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  action.sa_flags = 0;
96102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* SA_INTERRUPT */
96202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
96302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sigaction(SIGALRM, &action, NULL) < 0) {
96402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"start_timer: error installing alarm handler ");
96502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"errno %d\n",errno);
96602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
96702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
96802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
96902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is the easy case - just set the timer for so many seconds */
97102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (alarm(time) != 0) {
97202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
97302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "error starting alarm timer, errno %d\n",
97402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            errno);
97502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
97602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
97702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
97802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  test_len_ticks = 1;
98002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
98202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine will disable any running timer */
98502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
98602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstop_timer()
98702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
98802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
98902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  alarm(0);
99002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
99102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at some point we may need some win32 equivalent */
99202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  	if (hAlarm != (HANDLE) INVALID_HANDLE_VALUE)
99302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
99402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		SetEvent(hAlarm);
99502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
99602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
99702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
99802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
99902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
100102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
100202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine will enable the interval timer and set things up so */
100302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* that for a timed test the test will end at the proper time. it */
100402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* should detect the presence of POSIX.4 timer_* routines one of */
100502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* these days */
100602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
100702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstart_itimer(unsigned int interval_len_msec )
100802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
100902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int ticks_per_itvl;
101102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct itimerval new_interval;
101302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct itimerval old_interval;
101402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* if -DWANT_INTERVALS was used, we will use the ticking of the itimer to */
101602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* tell us when the test is over. while the user will be specifying */
101702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* some number of milliseconds, we know that the interval timer is */
101802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* really in units of 1/HZ. so, to prevent the test from running */
101902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "long" it would be necessary to keep this in mind when calculating */
102002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the number of itimer events */
102102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ticks_per_itvl = ((interval_wate * sysconf(_SC_CLK_TCK) * 1000) /
102302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    1000000);
102402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (ticks_per_itvl == 0) ticks_per_itvl = 1;
102602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how many usecs in each interval? */
102802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  usec_per_itvl = ticks_per_itvl * (1000000 / sysconf(_SC_CLK_TCK));
102902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
103002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how many times will the timer pop before the test is over? */
103102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (test_time > 0) {
103202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this was a timed test */
103302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    test_len_ticks = (test_time * 1000000) / usec_per_itvl;
103402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
103502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
103602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this was not a timed test, use MAXINT */
103702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    test_len_ticks = INT_MAX;
103802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
103902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
104002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
104102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"setting the interval timer to %d sec %d usec ",
104202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            usec_per_itvl / 1000000,
104302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            usec_per_itvl % 1000000);
104402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"test len %d ticks\n",
104502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            test_len_ticks);
104602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
104702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
104802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
104902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* if this was not a timed test, then we really aught to enable the */
105002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* signal catcher raj 2/95 */
105102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  new_interval.it_interval.tv_sec = usec_per_itvl / 1000000;
105302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  new_interval.it_interval.tv_usec = usec_per_itvl % 1000000;
105402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  new_interval.it_value.tv_sec = usec_per_itvl / 1000000;
105502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  new_interval.it_value.tv_usec = usec_per_itvl % 1000000;
105602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (setitimer(ITIMER_REAL,&new_interval,&old_interval) != 0) {
105702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* there was a problem arming the interval timer */
105802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("netperf: setitimer");
105902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
106002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
106102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
106202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
106302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
106502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnetlib_init_cpu_map() {
106602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
106802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_MPCTL
106902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int num;
107002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  i = 0;
107102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* I go back and forth on whether this should be the system-wide set
107202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     of calls, or if the processor set versions (sans the _SYS) should
107302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     be used.  at the moment I believe that the system-wide version
107402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     should be used. raj 2006-04-03 */
107502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  num = mpctl(MPC_GETNUMSPUS_SYS,0,0);
107602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_cpu_map[i] = mpctl(MPC_GETFIRSTSPU_SYS,0,0);
107702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 1;((i < num) && (i < MAXCPUS)); i++) {
107802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_cpu_map[i] = mpctl(MPC_GETNEXTSPU_SYS,lib_cpu_map[i-1],0);
107902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
108002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* from here, we set them all to -1 because if we launch more
108102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     loopers than actual CPUs, well, I'm not sure why :) */
108202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (; i < MAXCPUS; i++) {
108302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_cpu_map[i] = -1;
108402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
108502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
108602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
108702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we assume that there is indeed a contiguous mapping */
108802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < MAXCPUS; i++) {
108902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_cpu_map[i] = i;
109002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
109102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
109202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
109302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
109602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
109702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      netlib_init()                                           */
109802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
109902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      initialize the performance library...                   */
110002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
110102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
110202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
110302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
110402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnetlib_init()
110502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
110602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
110702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
110802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  where            = stdout;
110902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  request_array = (int *)(&netperf_request);
111102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  response_array = (int *)(&netperf_response);
111202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < MAXCPUS; i++) {
111402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_per_cpu_util[i] = 0.0;
111502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
111602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on those systems where we know that CPU numbers may not start at
111802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     zero and be contiguous, we provide a way to map from a
111902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     contiguous, starting from 0 CPU id space to the actual CPU ids.
112002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     at present this is only used for the netcpu_looper stuff because
112102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     we ass-u-me that someone setting processor affinity from the
112202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     netperf commandline will provide a "proper" CPU identifier. raj
112302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     2006-04-03 */
112402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netlib_init_cpu_map();
112602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
112802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
112902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "netlib_init: request_array at %p\n",
113002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            request_array);
113102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
113202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "netlib_init: response_array at %p\n",
113302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            response_array);
113402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
113602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
113702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
113902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
114002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine will conver the string into an unsigned integer. it */
114102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* is used primarily for the command-line options taking a number */
114202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* (such as the socket size) which could be rather large. If someone */
114302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* enters 32M, then the number will be converted to 32 * 1024 * 1024. */
114402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* If they inter 32m, the number will be converted to 32 * 1000 * */
114502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* 1000 */
114602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectunsigned int
114702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectconvert(char *string)
114802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
114902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
115002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int base;
115102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  base = atoi(string);
115202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strstr(string,"K")) {
115302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= 1024;
115402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
115502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strstr(string,"M")) {
115602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= (1024 * 1024);
115702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
115802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strstr(string,"G")) {
115902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= (1024 * 1024 * 1024);
116002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
116102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strstr(string,"k")) {
116202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= (1000);
116302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
116402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strstr(string,"m")) {
116502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= (1000 * 1000);
116602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
116702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strstr(string,"g")) {
116802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= (1000 * 1000 * 1000);
116902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
117002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(base);
117102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
117202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
117302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* this routine is like convert, but it is used for an interval time
117402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   specification instead of stuff like socket buffer or send sizes.
117502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   it converts everything to microseconds for internal use.  if there
117602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   is an 'm' at the end it assumes the user provided milliseconds, s
117702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   will imply seconds, u will imply microseconds.  in the future n
117802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   will imply nanoseconds but for now it will be ignored. if there is
117902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   no suffix or an unrecognized suffix, it will be assumed the user
118002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   provided milliseconds, which was the long-time netperf default. one
118102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   of these days, we should probably revisit that nanosecond business
118202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   wrt the return value being just an int rather than a uint64_t or
118302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   something.  raj 2006-02-06 */
118402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
118502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectunsigned int
118602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectconvert_timespec(char *string) {
118702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
118802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int base;
118902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  base = atoi(string);
119002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strstr(string,"m")) {
119102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= 1000;
119202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
119302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else if (strstr(string,"u")) {
119402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= (1);
119502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
119602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else if (strstr(string,"s")) {
119702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= (1000 * 1000);
119802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
119902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
120002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    base *= (1000);
120102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
120202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(base);
120302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
120402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine will allocate a circular list of buffers for either */
120702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* send or receive operations. each of these buffers will be aligned */
120802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* and offset as per the users request. the circumference of this */
120902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* ring will be controlled by the setting of send_width. the buffers */
121002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* will be filled with data from the file specified in fill_file. if */
121102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* fill_file is an empty string, the buffers will not be filled with */
121202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* any particular data */
121302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
121402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct ring_elt *
121502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectallocate_buffer_ring(int width, int buffer_size, int alignment, int offset)
121602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
121702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
121802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *first_link = NULL;
121902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *temp_link  = NULL;
122002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *prev_link;
122102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
122202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
122302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int malloc_size;
122402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_left;
122502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_read;
122602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int do_fill;
122702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
122802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  FILE *fill_source;
122902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char default_fill[] = "netperf";
123002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int  fill_cursor = 0;
123102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  malloc_size = buffer_size + alignment + offset;
123302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* did the user wish to have the buffers pre-filled with data from a */
123502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* particular source? */
123602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strcmp(fill_file,"") == 0) {
123702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    do_fill = 0;
123802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fill_source = NULL;
123902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
124002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
124102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    do_fill = 1;
124202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fill_source = (FILE *)fopen(fill_file,"r");
124302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (fill_source == (FILE *)NULL) {
124402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("Could not open requested fill file");
124502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
124602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
124702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
124802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  assert(width >= 1);
125002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  prev_link = NULL;
125202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 1; i <= width; i++) {
125302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the ring element */
125402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link = (struct ring_elt *)malloc(sizeof(struct ring_elt));
125502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (temp_link == NULL) {
12561a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn      printf("malloc(%zu) failed!\n", sizeof(struct ring_elt));
125702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
125802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
125902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remember the first one so we can close the ring at the end */
126002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (i == 1) {
126102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      first_link = temp_link;
126202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
126302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->buffer_base = (char *)malloc(malloc_size);
126402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (temp_link == NULL) {
126502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("malloc(%d) failed!\n", malloc_size);
126602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
126702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
126802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
127002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->buffer_ptr = (char *)(( (long)(temp_link->buffer_base) +
127102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          (long)alignment - 1) &
127202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                         ~((long)alignment - 1));
127302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
127402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->buffer_ptr = (char *)(( (ULONG_PTR)(temp_link->buffer_base) +
127502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          (ULONG_PTR)alignment - 1) &
127602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                         ~((ULONG_PTR)alignment - 1));
127702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
127802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->buffer_ptr += offset;
127902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* is where the buffer fill code goes. */
128002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (do_fill) {
128102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      char *bufptr = temp_link->buffer_ptr;
128202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_left = buffer_size;
128302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while (bytes_left) {
128402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (((bytes_read = (int)fread(bufptr,
128502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      1,
128602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      bytes_left,
128702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      fill_source)) == 0) &&
128802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            (feof(fill_source))){
128902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          rewind(fill_source);
129002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
129102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bufptr += bytes_read;
129202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        bytes_left -= bytes_read;
129302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
129402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
129502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
129602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* use the default fill to ID our data traffic on the
129702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 network. it ain't exactly pretty, but it should work */
129802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int j;
129902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      char *bufptr = temp_link->buffer_ptr;
130002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (j = 0; j < buffer_size; j++) {
130102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bufptr[j] = default_fill[fill_cursor];
130202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fill_cursor += 1;
130302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the Windows DDK compiler with an x86_64 target wants a cast
130402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   here */
130502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (fill_cursor >  (int)strlen(default_fill)) {
130602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fill_cursor = 0;
130702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
130802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
130902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
131102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->next = prev_link;
131202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    prev_link = temp_link;
131302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
131402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (first_link) {  /* SAF Prefast made me do it... */
131502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    first_link->next = temp_link;
131602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
131702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(first_link); /* it's a circle, doesn't matter which we return */
131902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
132002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* this routine will dirty the first dirty_count bytes of the
132202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   specified buffer and/or read clean_count bytes from the buffer. it
132302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   will go N bytes at a time, the only question is how large should N
132402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   be and if we should be going continguously, or based on some
132502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   assumption of cache line size */
132602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
132702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
132802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectaccess_buffer(char *buffer_ptr,int length, int dirty_count, int clean_count) {
132902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *temp_buffer;
133102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *limit;
133202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int  i, dirty_totals;
133302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp_buffer = buffer_ptr;
133502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  limit = temp_buffer + length;
133602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dirty_totals = 0;
133702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0;
133902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       ((i < dirty_count) && (temp_buffer < limit));
134002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       i++) {
134102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *temp_buffer += (char)i;
134202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dirty_totals += *temp_buffer;
134302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_buffer++;
134402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
134502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
134602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0;
134702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       ((i < clean_count) && (temp_buffer < limit));
134802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       i++) {
134902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dirty_totals += *temp_buffer;
135002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_buffer++;
135102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
135202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 100) {
135402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
135502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "This was here to try to avoid dead-code elimination %d\n",
135602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    dirty_totals);
135702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
135802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
135902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
136002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_ICSC_EXS
136302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/mman.h>
136502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/exs.h>
136602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine will allocate a circular list of buffers for either */
136802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* send or receive operations. each of these buffers will be aligned */
136902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* and offset as per the users request. the circumference of this */
137002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* ring will be controlled by the setting of send_width. the buffers */
137102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* will be filled with data from the file specified in fill_file. if */
137202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* fill_file is an empty string, the buffers will not be filled with */
137302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* any particular data */
137402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct ring_elt *
137602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectallocate_exs_buffer_ring (int width, int buffer_size, int alignment, int offset, exs_mhandle_t *mhandlep)
137702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
137802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct ring_elt *first_link;
138002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct ring_elt *temp_link;
138102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct ring_elt *prev_link;
138202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int i;
138402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int malloc_size;
138502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int bytes_left;
138602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int bytes_read;
138702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int do_fill;
138802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    FILE *fill_source;
139002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int mmap_size;
139202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *mmap_buffer, *mmap_buffer_aligned;
139302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    malloc_size = buffer_size + alignment + offset;
139502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* did the user wish to have the buffers pre-filled with data from a */
139702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular source? */
139802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (strcmp (fill_file, "") == 0) {
139902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        do_fill = 0;
140002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fill_source = NULL;
140102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } else {
140202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        do_fill = 1;
140302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fill_source = (FILE *) fopen (fill_file, "r");
140402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (fill_source == (FILE *) NULL) {
140502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            perror ("Could not open requested fill file");
140602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            exit (1);
140702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
140802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
140902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    assert (width >= 1);
141102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
141302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf (where, "allocate_exs_buffer_ring: "
141402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 "width=%d buffer_size=%d alignment=%d offset=%d\n",
141502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 width, buffer_size, alignment, offset);
141602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
141702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* allocate shared memory */
141902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    mmap_size = width * malloc_size;
142002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    mmap_buffer = (char *) mmap ((caddr_t)NULL, mmap_size+NBPG-1,
142102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                 PROT_READ|PROT_WRITE,
142202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                 MAP_SHARED|MAP_ANONYMOUS, -1, 0);
142302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (mmap_buffer == NULL) {
142402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        perror ("allocate_exs_buffer_ring: mmap failed");
142502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit (1);
142602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
142702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    mmap_buffer_aligned = (char *) ((uintptr_t)mmap_buffer & ~(NBPG-1));
142802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
142902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf (where, "allocate_exs_buffer_ring: "
143002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 "mmap buffer size=%d address=0x%p aligned=0x%p\n",
143102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 mmap_size, mmap_buffer, mmap_buffer_aligned);
143202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
143302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
143402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* register shared memory */
143502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *mhandlep = exs_mregister ((void *)mmap_buffer_aligned, (size_t)mmap_size, 0);
143602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (*mhandlep == EXS_MHANDLE_INVALID) {
143702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        perror ("allocate_exs_buffer_ring: exs_mregister failed");
143802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit (1);
143902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
144002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
144102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf (where, "allocate_exs_buffer_ring: mhandle=%d\n",
144202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                 *mhandlep);
144302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
144402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* allocate ring elements */
144602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    first_link = (struct ring_elt *) malloc (width * sizeof (struct ring_elt));
144702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (first_link == NULL) {
144802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        printf ("malloc(%d) failed!\n", width * sizeof (struct ring_elt));
144902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit (1);
145002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
145102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
145202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize buffer ring */
145302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    prev_link = first_link + width - 1;
145402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
145502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0, temp_link = first_link; i < width; i++, temp_link++) {
145602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
145702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        temp_link->buffer_base = (char *) mmap_buffer_aligned + (i*malloc_size);
145802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
145902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        temp_link->buffer_ptr = (char *)
146002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            (((long)temp_link->buffer_base + (long)alignment - 1) &
146102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             ~((long)alignment - 1));
146202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
146302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        temp_link->buffer_ptr = (char *)
146402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            (((ULONG_PTR)temp_link->buffer_base + (ULONG_PTR)alignment - 1) &
146502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             ~((ULONG_PTR)alignment - 1));
146602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
146702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        temp_link->buffer_ptr += offset;
146802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
146902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (debug) {
147002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            fprintf (where, "allocate_exs_buffer_ring: "
147102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     "buffer: index=%d base=0x%p ptr=0x%p\n",
147202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     i, temp_link->buffer_base, temp_link->buffer_ptr);
147302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
147402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* is where the buffer fill code goes. */
147602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (do_fill) {
147702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            bytes_left = buffer_size;
147802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            while (bytes_left) {
147902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                if (((bytes_read = (int) fread (temp_link->buffer_ptr,
148002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                1,
148102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                bytes_left,
148202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                                fill_source)) == 0) &&
148302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    (feof (fill_source))) {
148402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                    rewind (fill_source);
148502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                }
148602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                bytes_left -= bytes_read;
148702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            }
148802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
148902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* do linking */
149102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        prev_link->next = temp_link;
149202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        prev_link = temp_link;
149302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
149402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return (first_link);        /* it's a circle, doesn't matter which we return */
149602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
149702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* HAVE_ICSC_EXS */
149902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_SENDFILE
150302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* this routine will construct a ring of sendfile_ring_elt structs
150402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   that the routine sendfile_tcp_stream() will use to get parameters
150502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   to its calls to sendfile(). It will setup the ring to point at the
150602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   file specified in the global -F option that is already used to
150702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   pre-fill buffers in the send() case. 08/2000
150802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   if there is no file specified in a global -F option, we will create
151002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   a tempoarary file and fill it with random data and use that
151102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   instead.  raj 2007-08-09 */
151202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
151302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct sendfile_ring_elt *
151402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectalloc_sendfile_buf_ring(int width,
151502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        int buffer_size,
151602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        int alignment,
151702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        int offset)
151802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
151902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
152002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sendfile_ring_elt *first_link = NULL;
152202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sendfile_ring_elt *temp_link  = NULL;
152302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sendfile_ring_elt *prev_link;
152402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
152602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int fildes;
152702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct stat statbuf;
152802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* if the user has not specified a file with the -F option, we will
153002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     fail the test. otherwise, go ahead and try to open the
153102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     file. 08/2000 */
153202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (strcmp(fill_file,"") == 0) {
153302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* use an temp file for the fill file */
153402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    char *temp_file;
153502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int *temp_buffer;
153602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* make sure we have at least an ints worth, even if the user is
153802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       using an insane buffer size for a sendfile test. we are
153902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       ass-u-me-ing that malloc will return something at least aligned
154002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       on an int boundary... */
154102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_buffer = (int *) malloc(buffer_size + sizeof(int));
154202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (temp_buffer) {
154302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* ok, we have the buffer we are going to write, lets get a
154402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 temporary filename */
154502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_file = tmpnam(NULL);
154602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (NULL != temp_file) {
154702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fildes = open(temp_file,O_RDWR | O_EXCL | O_CREAT,0600);
154802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (-1 != fildes) {
154902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  int count;
155002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  int *int_ptr;
155102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* initialize the random number generator */
155302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  srand(getpid());
155402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* unlink the file so it goes poof when we
155602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     exit. unless/until shown to be a problem we will
155702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     blissfully ignore the return value. raj 2007-08-09 */
155802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  unlink(temp_file);
155902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* now fill-out the file with at least buffer_size * width bytes */
156102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (count = 0; count < width; count++) {
156202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* fill the buffer with random data.  it doesn't have to be
156302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       really random, just "random enough" :) we do this here rather
156402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       than up above because we want each write to the file to be
156502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       different random data */
156602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    int_ptr = temp_buffer;
156702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    for (i = 0; i <= buffer_size/sizeof(int); i++) {
156802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      *int_ptr = rand();
156902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      int_ptr++;
157002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
157102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if (write(fildes,temp_buffer,buffer_size+sizeof(int)) !=
157202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		buffer_size + sizeof(int)) {
157302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      perror("allocate_sendfile_buf_ring: incomplete write");
157402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      exit(-1);
157502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
157602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
157702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
157802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else {
157902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("allocate_sendfile_buf_ring: could not open tempfile");
158002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(-1);
158102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
158202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
158302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
158402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("allocate_sendfile_buf_ring: could not allocate temp name");
158502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(-1);
158602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
158702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
158802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
158902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("alloc_sendfile_buf_ring: could not allocate buffer for file");
159002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
159102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
159202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
159302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
159402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the user pointed us at a file, so try it */
159502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fildes = open(fill_file , O_RDONLY);
159602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (fildes == -1){
159702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("alloc_sendfile_buf_ring: Could not open requested file");
159802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
159902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
160002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* make sure there is enough file there to allow us to make a
160102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       complete ring. that way we do not need additional logic in the
160202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       ring setup to deal with wrap-around issues. we might want that
160302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       someday, but not just now. 08/2000 */
160402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (stat(fill_file,&statbuf) != 0) {
160502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("alloc_sendfile_buf_ring: could not stat file");
160602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
160702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
160802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (statbuf.st_size < (width * buffer_size)) {
160902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the file is too short */
161002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr,"alloc_sendfile_buf_ring: specified file too small.\n");
161102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr,"file must be larger than send_width * send_size\n");
161202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(stderr);
161302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
161402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
161502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
161602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
161702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* so, at this point we know that fildes is a descriptor which
161802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     references a file of sufficient size for our nefarious
161902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     porpoises. raj 2007-08-09 */
162002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  prev_link = NULL;
162202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 1; i <= width; i++) {
162302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the ring element. we should probably make sure the malloc()
162402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     was successful, but for now we'll just let the code bomb
162502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     mysteriously. 08/2000 */
162602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link = (struct sendfile_ring_elt *)
162802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      malloc(sizeof(struct sendfile_ring_elt));
162902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (temp_link == NULL) {
163002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("malloc(%u) failed!\n", sizeof(struct sendfile_ring_elt));
163102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
163202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
163302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remember the first one so we can close the ring at the end */
163502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (i == 1) {
163702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      first_link = temp_link;
163802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
163902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* now fill-in the fields of the structure with the apropriate
164102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       stuff. just how should we deal with alignment and offset I
164202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       wonder? until something better comes-up, I think we will just
164302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       ignore them. 08/2000 */
164402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->fildes = fildes;      /* from which file do we send? */
164602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->offset = offset;      /* starting at which offset? */
164702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    offset += buffer_size;           /* get ready for the next elt */
164802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->length = buffer_size; /* how many bytes to send */
164902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->hdtrl = NULL;         /* no header or trailer */
165002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->flags = 0;            /* no flags */
165102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* is where the buffer fill code went. */
165302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_link->next = prev_link;
165502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    prev_link = temp_link;
165602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
165702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* close the ring */
165802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  first_link->next = temp_link;
165902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(first_link); /* it's a dummy ring */
166102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
166202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* HAVE_SENDFILE */
166402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
166702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
166802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*     dump_request()                                                  */
166902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
167002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* display the contents of the request array to the user. it will      */
167102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* display the contents in decimal, hex, and ascii, with four bytes    */
167202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* per line.                                                           */
167302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
167402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
167502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
167602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
167702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdump_request()
167802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
16791a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzynsize_t counter = 0;
168002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfprintf(where,"request contents:\n");
168102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfor (counter = 0; counter < ((sizeof(netperf_request)/4)-3); counter += 4) {
16821a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn  fprintf(where,"%zu:\t%8x %8x %8x %8x \t|%4.4s| |%4.4s| |%4.4s| |%4.4s|\n",
168302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          counter,
168402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          request_array[counter],
168502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          request_array[counter+1],
168602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          request_array[counter+2],
168702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          request_array[counter+3],
168802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&request_array[counter],
168902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&request_array[counter+1],
169002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&request_array[counter+2],
169102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&request_array[counter+3]);
169202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
169302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfflush(where);
169402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
169502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
169802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
169902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*     dump_response()                                                 */
170002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
170102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* display the content of the response array to the user. it will      */
170202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* display the contents in decimal, hex, and ascii, with four bytes    */
170302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* per line.                                                           */
170402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
170502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
170602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
170802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdump_response()
170902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
17101a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzynsize_t counter = 0;
171102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfprintf(where,"response contents\n");
171302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfor (counter = 0; counter < ((sizeof(netperf_response)/4)-3); counter += 4) {
17141a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn  fprintf(where,"%zu:\t%8x %8x %8x %8x \t>%4.4s< >%4.4s< >%4.4s< >%4.4s<\n",
171502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          counter,
171602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          response_array[counter],
171702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          response_array[counter+1],
171802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          response_array[counter+2],
171902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          response_array[counter+3],
172002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&response_array[counter],
172102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&response_array[counter+1],
172202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&response_array[counter+2],
172302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&response_array[counter+3]);
172402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
172502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfflush(where);
172602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
172702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
172802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*
172902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      format_number()
173102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return a pointer to a formatted string containing the value passed
173302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  translated into the units specified. It assumes that the base units
173402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  are bytes. If the format calls for bits, it will use SI units (10^)
173502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if the format calls for bytes, it will use CS units (2^)...  This
173602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  routine should look familiar to uses of the latest ttcp...
173702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  we would like to use "t" or "T" for transactions, but probably
173902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  should leave those for terabits and terabytes respectively, so for
174002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  transactions, we will use "x" which will, by default, do absolutely
174102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nothing to the result.  why?  so we don't have to special case code
174202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  elsewhere such as in the TCP_RR-as-bidirectional test case.
174302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */
174502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *
174802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectformat_number(double number)
174902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
175002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  static  char    fmtbuf[64];
175102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
175202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch (libfmt) {
175302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'K':
175402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(fmtbuf, sizeof(fmtbuf),  "%-7.2f" , number / 1024.0);
175502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
175602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'M':
175702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(fmtbuf, sizeof(fmtbuf),  "%-7.2f", number / 1024.0 / 1024.0);
175802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
175902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'G':
176002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(fmtbuf, sizeof(fmtbuf),  "%-7.2f", number / 1024.0 / 1024.0 / 1024.0);
176102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
176202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'k':
176302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(fmtbuf, sizeof(fmtbuf),  "%-7.2f", number * 8 / 1000.0);
176402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
176502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'm':
176602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(fmtbuf, sizeof(fmtbuf),  "%-7.2f", number * 8 / 1000.0 / 1000.0);
176702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
176802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'g':
176902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(fmtbuf, sizeof(fmtbuf),  "%-7.2f", number * 8 / 1000.0 / 1000.0 / 1000.0);
177002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
177102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'x':
177202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(fmtbuf, sizeof(fmtbuf),  "%-7.2f", number);
177302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
177402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
177502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snprintf(fmtbuf, sizeof(fmtbuf),  "%-7.2f", number / 1024.0);
177602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
177702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return fmtbuf;
177902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
178002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar
178202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectformat_cpu_method(int method)
178302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
178402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char method_char;
178602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch (method) {
178802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case CPU_UNKNOWN:
178902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'U';
179002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
179102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case HP_IDLE_COUNTER:
179202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'I';
179302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
179402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case PSTAT:
179502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'P';
179602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
179702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case KSTAT:
179802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'K';
179902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
180002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case KSTAT_10:
180102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'M';
180202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
180302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case PERFSTAT:
180402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'E';
180502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
180602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case TIMES:             /* historical only, completely unsuitable
180702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     for netperf's purposes */
180802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'T';
180902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
181002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case GETRUSAGE:         /* historical only, completely unsuitable
181102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     for netperf;s purposes */
181202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'R';
181302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
181402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case LOOPER:
181502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'L';
181602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
181702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case NT_METHOD:
181802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'N';
181902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
182002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case PROC_STAT:
182102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'S';
182202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
182302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case SYSCTL:
182402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'C';
182502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
182602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case OSX:
182702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = 'O';
182802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
182902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
183002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    method_char = '?';
183102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
183202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return method_char;
183402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
183602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *
183802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectformat_units()
183902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
184002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  static        char    unitbuf[64];
184102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch (libfmt) {
184302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'K':
184402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(unitbuf, "KBytes");
184502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
184602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'M':
184702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(unitbuf, "MBytes");
184802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
184902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'G':
185002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(unitbuf, "GBytes");
185102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
185202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'k':
185302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(unitbuf, "10^3bits");
185402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
185502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'm':
185602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(unitbuf, "10^6bits");
185702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
185802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'g':
185902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(unitbuf, "10^9bits");
186002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
186102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'x':
186202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(unitbuf, "Trans");
186302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
186402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
186502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
186602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(unitbuf, "KBytes");
186702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
186802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
186902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return unitbuf;
187002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
187102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
187202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
187302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
187402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
187502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      shutdown_control()                                      */
187602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
187702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* tear-down the control connection between me and the server.  */
187802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
187902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
188002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
188102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectshutdown_control()
188202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
188302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
188402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char  *buf = (char *)&netperf_response;
188502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   buflen = sizeof(netperf_response);
188602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
188702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* stuff for select, use fd_set for better compliance */
188802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fd_set        readfds;
188902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct        timeval timeout;
189002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
189202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
189302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "shutdown_control: shutdown of control connection requested.\n");
189402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
189502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
189602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first, we say that we will be sending no more data on the */
189802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* connection */
189902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (shutdown(netlib_control,1) == SOCKET_ERROR) {
190002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Print_errno(where,
190102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "shutdown_control: error in shutdown");
190202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
190302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
190402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
190502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
190602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we hang on a select waiting for the socket to become */
190702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* readable to receive the shutdown indication from the remote. this */
190802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be "just" like the recv_response() code */
190902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we only select once. it is assumed that if the response is split */
191102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (which should not be happening, that we will receive the whole */
191202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* thing and not have a problem ;-) */
191302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  FD_ZERO(&readfds);
191502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  FD_SET(netlib_control,&readfds);
191602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_sec  = 60; /* wait one minute then punt */
191702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_usec = 0;
191802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* select had better return one, or there was either a problem or a */
192002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* timeout... */
192102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (select(FD_SETSIZE,
192202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             &readfds,
192302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             0,
192402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             0,
192502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             &timeout) != 1) {
192602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    Print_errno(where,
192702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "shutdown_control: no response received");
192802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
192902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
193002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
193102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we now assume that the socket has come ready for reading */
193302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv(netlib_control, buf, buflen,0);
193402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
193602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
193802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_to_specific_processor will bind the calling process to the
193902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  processor in "processor"  It has lots of ugly ifdefs to deal with
194002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  all the different ways systems do processor affinity.  this is a
194102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  generalization of work initially done by stephen burger.  raj
194202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  2004/12/13 */
194302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
194502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbind_to_specific_processor(int processor_affinity, int use_cpu_map)
194602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
194702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int mapped_affinity;
194902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is in place because the netcpu_looper processor affinity
195102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     ass-u-me-s a contiguous CPU id space starting with 0. for the
195202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     regular netperf/netserver affinity, we ass-u-me the user has used
195302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     a suitable CPU id even when the space is not contiguous and
195402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     starting from zero */
195502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (use_cpu_map) {
195602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    mapped_affinity = lib_cpu_map[processor_affinity];
195702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
195802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
195902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    mapped_affinity = processor_affinity;
196002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
196102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_MPCTL
196302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* indeed, at some point it would be a good idea to check the return
196402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     status and pass-along notification of error... raj 2004/12/13 */
196502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  mpctl(MPC_SETPROCESS_FORCE, mapped_affinity, getpid());
196602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif HAVE_PROCESSOR_BIND
196702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
196802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/processor.h>
196902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/procset.h>
197002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  processor_bind(P_PID,P_MYID,mapped_affinity,NULL);
197102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif HAVE_BINDPROCESSOR
197202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/processor.h>
197302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is the call on AIX.  It takes a "what" of BINDPROCESS or
197402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     BINDTHRAD, then "who" and finally "where" which is a CPU number
197502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     or it seems PROCESSOR_CLASS_ANY there also seems to be a mycpu()
197602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     call to return the current CPU assignment.  this is all based on
197702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     the sys/processor.h include file.  from empirical testing, it
197802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     would seem that the my_cpu() call returns the current CPU on
197902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     which we are running rather than the CPU binding, so it's return
198002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     value will not tell you if you are bound vs unbound. */
198102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bindprocessor(BINDPROCESS,getpid(),(cpu_t)mapped_affinity);
198202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif HAVE_SCHED_SETAFFINITY
198302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sched.h>
198402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* in theory this should cover systems with more CPUs than bits in a
198502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     long, without having to specify __USE_GNU.  we "cheat" by taking
198602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     defines from /usr/include/bits/sched.h, which we ass-u-me is
198702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     included by <sched.h>.  If they are not there we will just
198802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     fall-back on what we had before, which is to use just the size of
198902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     an unsigned long. raj 2006-09-14 */
199002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
199102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(__CPU_SETSIZE)
199202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETPERF_CPU_SETSIZE __CPU_SETSIZE
199302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETPERF_CPU_SET(cpu, cpusetp)  __CPU_SET(cpu, cpusetp)
199402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETPERF_CPU_ZERO(cpusetp)      __CPU_ZERO (cpusetp)
199502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  typedef cpu_set_t netperf_cpu_set_t;
199602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
199702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETPERF_CPU_SETSIZE sizeof(unsigned long)
199802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETPERF_CPU_SET(cpu, cpusetp) *cpusetp = 1 << cpu
199902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define NETPERF_CPU_ZERO(cpusetp) *cpusetp = (unsigned long)0
200002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  typedef unsigned long netperf_cpu_set_t;
200102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
200202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_cpu_set_t   netperf_cpu_set;
200402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int        len = sizeof(netperf_cpu_set);
200502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (mapped_affinity < 8*sizeof(netperf_cpu_set)) {
200702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    NETPERF_CPU_ZERO(&netperf_cpu_set);
200802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    NETPERF_CPU_SET(mapped_affinity,&netperf_cpu_set);
200902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sched_setaffinity(getpid(), len, &netperf_cpu_set)) {
201102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
201202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(stderr, "failed to set PID %d's CPU affinity errno %d\n",
201302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		getpid(),errno);
201402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(stderr);
201502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
201602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
201702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
201802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
201902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
202002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(stderr,
202102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"CPU number larger than pre-compiled limits. Consider a recompile.\n");
202202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(stderr);
202302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
202402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
202502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif HAVE_BIND_TO_CPU_ID
202702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is the one for Tru64 */
202802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
202902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/resource.h>
203002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/processor.h>
203102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
203202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* really should be checking a return code one of these days. raj
203302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     2005/08/31 */
203402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
203502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_to_cpu_id(getpid(), mapped_affinity,0);
203602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
203702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif WIN32
203802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
203902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  {
204002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ULONG_PTR AffinityMask;
204102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ULONG_PTR ProcessAffinityMask;
204202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ULONG_PTR SystemAffinityMask;
204302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
204402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((mapped_affinity < 0) ||
204502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	(mapped_affinity > MAXIMUM_PROCESSORS)) {
204602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
204702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "Invalid processor_affinity specified: %d\n", mapped_affinity);      fflush(where);
204802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return;
204902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
205002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
205102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!GetProcessAffinityMask(
205202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				GetCurrentProcess(),
205302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				&ProcessAffinityMask,
205402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				&SystemAffinityMask))
205502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      {
205602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("GetProcessAffinityMask failed");
205702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(stderr);
205802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
205902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
206002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    AffinityMask = (ULONG_PTR)1 << mapped_affinity;
206202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (AffinityMask & ProcessAffinityMask) {
206402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!SetThreadAffinityMask( GetCurrentThread(), AffinityMask)) {
206502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("SetThreadAffinityMask failed");
206602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(stderr);
206702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
206802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } else if (debug) {
206902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
207002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "Processor affinity set to CPU# %d\n", mapped_affinity);
207102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
207202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
207302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
207402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
207602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
207702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
207802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Processor affinity not available for this platform!\n");
207902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
208002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
208102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
208202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
208302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
208602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project * Sets a socket to non-blocking operation.
208702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */
208802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
208902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectset_nonblock (SOCKET sock)
209002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
209102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
209202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned long flags = 1;
209302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return (ioctlsocket(sock, FIONBIO, &flags) != SOCKET_ERROR);
209402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
209502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return (fcntl(sock, F_SETFL, O_NONBLOCK) != -1);
209602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
209702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
209802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
209902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
210002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
210102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
210202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
210302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*     send_request()                                                  */
210402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
210502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* send a netperf request on the control socket to the remote half of  */
210602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the connection. to get us closer to intervendor interoperability,   */
210702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we will call htonl on each of the int that compose the message to   */
210802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* be sent. the server-half of the connection will call the ntohl      */
210902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* routine to undo any changes that may have been made...              */
211002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
211102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
211202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
211302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
211402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_request()
211502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
21161a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn  size_t counter=0;
211702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
211802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* display the contents of the request if the debug level is high */
211902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* enough. otherwise, just send the darned thing ;-) */
212002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
212202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"entered send_request...contents before htonl:\n");
212302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_request();
212402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
212502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* pass the processor affinity request value to netserver */
212702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is a kludge and I know it.  sgb 8/11/04           */
212802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
212902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.dummy = remote_proc_affinity;
213002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* put the entire request array into network order. We do this */
213202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* arbitrarily rather than trying to figure-out just how much */
213302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the request array contains real information. this should */
213402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* be simpler, and at any rate, the performance of sending */
213502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control messages for this benchmark is not of any real */
213602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* concern. */
213702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (counter=0;counter < sizeof(netperf_request)/4; counter++) {
213902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_array[counter] = htonl(request_array[counter]);
214002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
214102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
214202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
214302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"send_request...contents after htonl:\n");
214402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_request();
214502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
214602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
21471a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn            "\nsend_request: about to send %zu bytes from %p\n",
214802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            sizeof(netperf_request),
214902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            &netperf_request);
215002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
215102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
215202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
215302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send(netlib_control,
215402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           (char *)&netperf_request,
215502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           sizeof(netperf_request),
215602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           0) != sizeof(netperf_request)) {
215702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("send_request: send call failure");
215802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
215902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
216002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
216102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
216202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
216302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/***********************************************************************/
216402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
216502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*     send_response()                                                 */
216602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
216702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* send a netperf response on the control socket to the remote half of */
216802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the connection. to get us closer to intervendor interoperability,   */
216902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we will call htonl on each of the int that compose the message to   */
217002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* be sent. the other half of the connection will call the ntohl       */
217102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* routine to undo any changes that may have been made...              */
217202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
217302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
217402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
217502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
217602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_response()
217702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
21781a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn  size_t counter=0;
217902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
218002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* display the contents of the request if the debug level is high */
218202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* enough. otherwise, just send the darned thing ;-) */
218302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
218502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
21861a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn            "send_response: contents of %zu ints before htonl\n",
218702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            sizeof(netperf_response)/4);
218802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_response();
218902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
219002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
219102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* put the entire response_array into network order. We do this */
219202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* arbitrarily rather than trying to figure-out just how much of the */
219302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* request array contains real information. this should be simpler, */
219402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and at any rate, the performance of sending control messages for */
219502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this benchmark is not of any real concern. */
219602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
219702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (counter=0;counter < sizeof(netperf_response)/4; counter++) {
219802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    response_array[counter] = htonl(response_array[counter]);
219902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
220002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
220102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
220202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
220302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "send_response: contents after htonl\n");
220402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_response();
220502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
22061a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn            "about to send %zu bytes from %p\n",
220702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            sizeof(netperf_response),
220802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            &netperf_response);
220902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
221002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
221102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /*KC*/
221302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((bytes_sent = send(server_sock,
221402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           (char *)&netperf_response,
221502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           sizeof(netperf_response),
221602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           0)) != sizeof(netperf_response)) {
221702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("send_response: send call failure");
221802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where, "BytesSent: %d\n", bytes_sent);
221902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
222002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
222102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
222302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
222502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
222602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*     recv_request()                                                  */
222702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
222802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* receive the remote's request on the control socket. we will put     */
222902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the entire response into host order before giving it to the         */
223002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* calling routine. hopefully, this will go most of the way to         */
223102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* insuring intervendor interoperability. if there are any problems,   */
223202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we will just punt the entire situation.                             */
223302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
223402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
223502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
223602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
223702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_request()
223802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
223902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     tot_bytes_recvd,
224002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        bytes_recvd,
224102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        bytes_left;
224202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar    *buf = (char *)&netperf_request;
224302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     buflen = sizeof(netperf_request);
22441a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzynsize_t  counter;
224502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
224602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttot_bytes_recvd = 0;
224702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project bytes_recvd = 0;     /* nt_lint; bytes_recvd uninitialized if buflen == 0 */
224802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes_left      = buflen;
224902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectwhile ((tot_bytes_recvd != buflen) &&
225002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       ((bytes_recvd = recv(server_sock, buf, bytes_left,0)) > 0 )) {
225102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tot_bytes_recvd += bytes_recvd;
225202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  buf             += bytes_recvd;
225302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_left      -= bytes_recvd;
225402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
225502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* put the request into host order */
225702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfor (counter = 0; counter < sizeof(netperf_request)/sizeof(int); counter++) {
225902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  request_array[counter] = ntohl(request_array[counter]);
226002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
226102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (debug) {
226302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
226402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "recv_request: received %d bytes of request.\n",
226502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          tot_bytes_recvd);
226602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
226702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
226802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (bytes_recvd == SOCKET_ERROR) {
227002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  Print_errno(where,
227102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "recv_request: error on recv");
227202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
227302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(1);
227402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
227502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (bytes_recvd == 0) {
227702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the remote has shutdown the control connection, we should shut it */
227802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* down as well and exit */
227902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
228102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
228202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "recv_request: remote requested shutdown of control\n");
228302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
228402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
228502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (netlib_control != INVALID_SOCKET) {
228702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        shutdown_control();
228802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
228902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(0);
229002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
229102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (tot_bytes_recvd < buflen) {
229302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1)
229402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_request();
229502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
229702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "recv_request: partial request received of %d bytes\n",
229802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          tot_bytes_recvd);
229902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
230002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(1);
230102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
230202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug > 1) {
230402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   dump_request();
230502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project }
230602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* get the processor affinity request value from netperf */
230802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is a kludge and I know it.  sgb 8/11/04          */
230902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_proc_affinity = netperf_request.content.dummy;
231102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_proc_affinity != -1) {
231302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bind_to_specific_processor(local_proc_affinity,0);
231402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
231502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
231702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
231802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*
231902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_response_timed()
232102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project receive the remote's response on the control socket. we will put the
232302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project entire response into host order before giving it to the calling
232402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project routine. hopefully, this will go most of the way to insuring
232502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project intervendor interoperability. if there are any problems, we will just
232602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project punt the entire situation.
232702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project The call to select at the beginning is to get us out of hang
232902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project situations where the remote gives-up but we don't find-out about
233002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project it. This seems to happen only rarely, but it would be nice to be
233102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project somewhat robust ;-)
233202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
233302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project The "_timed" part is to allow the caller to add (or I suppose
233402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project subtract) from the length of timeout on the select call. this was
233502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project added since not all the CPU utilization mechanisms require a 40
233602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project second calibration, and we used to have an aribtrary 40 second sleep
233702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project in "calibrate_remote_cpu" - since we don't _always_ need that, we
233802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project want to simply add 40 seconds to the select() timeout from that call,
233902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project but don't want to change all the "recv_response" calls in the code
234002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project right away.  sooo, we push the functionality of the old
234102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project recv_response() into a new recv_response_timed(addl_timout) call, and
234202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project have recv_response() call recv_response_timed(0).  raj 2005-05-16
234302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project */
234502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
234802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_response_timed(int addl_time)
234902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
235002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     tot_bytes_recvd,
235102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        bytes_recvd = 0,
235202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        bytes_left;
235302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar    *buf = (char *)&netperf_response;
235402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     buflen = sizeof(netperf_response);
23551a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzynsize_t  counter;
235602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* stuff for select, use fd_set for better compliance */
235802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfd_set  readfds;
235902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct  timeval timeout;
236002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttot_bytes_recvd = 0;
236202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes_left      = buflen;
236302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* zero out the response structure */
236502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* BUG FIX SJB 2/4/93 - should be < not <= */
236702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfor (counter = 0; counter < sizeof(netperf_response)/sizeof(int); counter++) {
236802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        response_array[counter] = 0;
236902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
237002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* we only select once. it is assumed that if the response is split */
237202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* (which should not be happening, that we will receive the whole */
237302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* thing and not have a problem ;-) */
237402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectFD_ZERO(&readfds);
237602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectFD_SET(netlib_control,&readfds);
237702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttimeout.tv_sec  = 120 + addl_time;  /* wait at least two minutes
237802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                      before punting - the USE_LOOPER
237902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                      CPU stuff may cause remote's to
238002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                      have a bit longer time of it
238102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                      than 60 seconds would allow.
238202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                      triggered by fix from Jeff
238302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                      Dwork. */
238402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttimeout.tv_usec = 0;
238502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* select had better return one, or there was either a problem or a */
238702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* timeout... */
238802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif ((counter = select(FD_SETSIZE,
239002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                      &readfds,
239102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                      0,
239202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                      0,
239302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                      &timeout)) != 1) {
239402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
23951a75dd02e272ea1aa1dbee9ae60c8f73a9e3d67fMark Salyzyn          "netperf: receive_response: no response received. errno %d counter %zu\n",
239602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          errno,
239702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          counter);
239802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(1);
239902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
240002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectwhile ((tot_bytes_recvd != buflen) &&
240202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       ((bytes_recvd = recv(netlib_control, buf, bytes_left,0)) > 0 )) {
240302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tot_bytes_recvd += bytes_recvd;
240402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  buf             += bytes_recvd;
240502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_left      -= bytes_recvd;
240602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
240702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (debug) {
240902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,"recv_response: received a %d byte response\n",
241002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          tot_bytes_recvd);
241102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(where);
241202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
241302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* put the response into host order */
241502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfor (counter = 0; counter < sizeof(netperf_response)/sizeof(int); counter++) {
241702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  response_array[counter] = ntohl(response_array[counter]);
241802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
241902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (bytes_recvd == SOCKET_ERROR) {
242102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        perror("recv_response");
242202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit(1);
242302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
242402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (tot_bytes_recvd < buflen) {
242502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(stderr,
242602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "recv_response: partial response received: %d bytes\n",
242702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          tot_bytes_recvd);
242802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(stderr);
242902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1)
243002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_response();
243102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(1);
243202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
243302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (debug > 1) {
243402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dump_response();
243502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
243602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
243702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
243902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_response()
244002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
244102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response_timed(0);
244202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
244302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(USE_PSTAT) || defined (USE_SYSCTL)
244702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
244802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecthi_32(big_int)
244902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     long long *big_int;
245002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
245102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  union overlay_u {
245202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    long long  dword;
245302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    long       words[2];
245402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } *overlay;
245502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  overlay = (union overlay_u *)big_int;
245702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on those systems which are byte swapped, we really wish to */
245802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return words[1] - at least I think so - raj 4/95 */
245902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (htonl(1L) == 1L) {
246002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are a "normal" :) machine */
246102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(overlay->words[0]);
246202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
246302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
246402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(overlay->words[1]);
246502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
246602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
246702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
246802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
246902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectlo_32(big_int)
247002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     long long *big_int;
247102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
247202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  union overlay_u {
247302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    long long  dword;
247402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    long       words[2];
247502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } *overlay;
247602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  overlay = (union overlay_u *)big_int;
247802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on those systems which are byte swapped, we really wish to */
247902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return words[0] - at least I think so - raj 4/95 */
248002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (htonl(1L) == 1L) {
248102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are a "normal" :) machine */
248202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(overlay->words[1]);
248302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
248402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
248502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(overlay->words[0]);
248602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
248702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
248802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
248902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* USE_PSTAT || USE_SYSCTL */
249002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid libmain()
249302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
249402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfprintf(where,"hello world\n");
249502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfprintf(where,"debug: %d\n",debug);
249602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
249702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
250002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectset_sock_buffer (SOCKET sd, enum sock_buffer which, int requested_size, int *effective_sizep)
250102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
250202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_SNDBUF
250302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int optname = (which == SEND_BUFFER) ? SO_SNDBUF : SO_RCVBUF;
250402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_socklen_t sock_opt_len;
250502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* seems that under Windows, setting a value of zero is how one
250702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     tells the stack you wish to enable copy-avoidance. Knuth only
250802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     knows what it will do on other stacks, but it might be
250902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     interesting to find-out, so we won't bother #ifdef'ing the change
251002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     to allow asking for 0 bytes. Courtesy of SAF, 2007-05  raj
251102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     2007-05-31 */
251202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (requested_size >= 0) {
251302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (setsockopt(sd, SOL_SOCKET, optname,
251402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   (char *)&requested_size, sizeof(int)) < 0) {
251502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "netperf: set_sock_buffer: %s option: errno %d\n",
251602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      (which == SEND_BUFFER) ? "SO_SNDBUF" : "SO_RCVBUF",
251702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
251802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
251902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
252002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
252102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
252202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "netperf: set_sock_buffer: %s of %d requested.\n",
252302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      (which == SEND_BUFFER) ? "SO_SNDBUF" : "SO_RCVBUF",
252402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      requested_size);
252502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
252602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
252702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
252802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
252902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, we will find-out what the size actually became, and report */
253002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that back to the user. If the call fails, we will just report a -1 */
253102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* back to the initiator for the recv buffer size. */
253202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
253302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sock_opt_len = sizeof(netperf_socklen_t);
253402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockopt(sd, SOL_SOCKET, optname, (char *)effective_sizep,
253502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 &sock_opt_len) < 0) {
253602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where, "netperf: set_sock_buffer: getsockopt %s: errno %d\n",
253702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (which == SEND_BUFFER) ? "SO_SNDBUF" : "SO_RCVBUF", errno);
253802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
253902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *effective_sizep = -1;
254002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
254102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
254202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
254302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where, "netperf: set_sock_buffer: "
254402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "%s socket size determined to be %d\n",
254502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    (which == SEND_BUFFER) ? "send" : "receive", *effective_sizep);
254602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
254702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
254802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* SO_SNDBUF */
254902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *effective_size = -1;
255002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* SO_SNDBUF */
255102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
255202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
255402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdump_addrinfo(FILE *dumploc, struct addrinfo *info,
255502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              char *host, char *port, int family)
255602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
255702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr *ai_addr;
255802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *temp;
255902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  temp=info;
256002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
256102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(dumploc, "getaddrinfo returned the following for host '%s' ", host);
256202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(dumploc, "port '%s' ", port);
256302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(dumploc, "family %s\n", inet_ftos(family));
256402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (temp) {
256502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* seems that Solaris 10 GA bits will not give a canonical name
256602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       for ::0 or 0.0.0.0, and their fprintf() cannot deal with a null
256702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       pointer, so we have to check for a null pointer.  probably a
256802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       safe thing to do anyway, eventhough it was not necessary on
256902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       linux or hp-ux. raj 2005-02-09 */
257002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (temp->ai_canonname) {
257102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(dumploc,
257202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\tcannonical name: '%s'\n",temp->ai_canonname);
257302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
257402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
257502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(dumploc,
257602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\tcannonical name: '%s'\n","(nil)");
257702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
257802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(dumploc,
257902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "\tflags: %x family: %s: socktype: %s protocol %s addrlen %d\n",
258002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            temp->ai_flags,
258102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            inet_ftos(temp->ai_family),
258202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            inet_ttos(temp->ai_socktype),
258302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            inet_ptos(temp->ai_protocol),
258402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            temp->ai_addrlen);
258502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ai_addr = temp->ai_addr;
258602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ai_addr != NULL) {
258702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(dumploc,
258802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "\tsa_family: %s sadata: %d %d %d %d %d %d\n",
258902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              inet_ftos(ai_addr->sa_family),
259002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (u_char)ai_addr->sa_data[0],
259102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (u_char)ai_addr->sa_data[1],
259202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (u_char)ai_addr->sa_data[2],
259302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (u_char)ai_addr->sa_data[3],
259402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (u_char)ai_addr->sa_data[4],
259502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (u_char)ai_addr->sa_data[5]);
259602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
259702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp = temp->ai_next;
259802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
259902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fflush(dumploc);
260002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
260102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*
260302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  establish_control()
260402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectset-up the control connection between netperf and the netserver so we
260602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcan actually run some tests. if we cannot establish the control
260702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectconnection, that may or may not be a good thing, so we will let the
260802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcaller decide what to do.
260902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
261002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectto assist with pesky end-to-end-unfriendly things like firewalls, we
261102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectallow the caller to specify both the remote hostname and port, and the
261202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectlocal addressing info.  i believe that in theory it is possible to
261302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecthave an IPv4 endpoint and an IPv6 endpoint communicate with one
261402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectanother, but for the time being, we are only going to take-in one
261502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrequested address family parameter. this means that the only way
261602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project(iirc) that we might get a mixed-mode connection would be if the
261702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectaddress family is specified as AF_UNSPEC, and getaddrinfo() returns
261802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdifferent families for the local and server names.
261902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectthe "names" can also be IP addresses in ASCII string form.
262102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectraj 2003-02-27 */
262302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSOCKET
262502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectestablish_control_internal(char *hostname,
262602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   char *port,
262702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   int   remfam,
262802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   char *localhost,
262902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   char *localport,
263002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			   int   locfam)
263102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
263202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int not_connected;
263302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SOCKET control_sock;
263402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int count;
263502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int error;
263602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo   hints;
263802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo  *local_res;
263902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo  *remote_res;
264002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo  *local_res_temp;
264102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo  *remote_res_temp;
264202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
264402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
264502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "establish_control called with host '%s' port '%s' remfam %s\n",
264602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            hostname,
264702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            port,
264802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            inet_ftos(remfam));
264902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
265002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "\t\tlocal '%s' port '%s' locfam %s\n",
265102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            localhost,
265202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            localport,
265302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            inet_ftos(locfam));
265402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
265502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
265602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
265702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first, we do the remote */
265802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  memset(&hints, 0, sizeof(hints));
265902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_family = remfam;
266002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_socktype = SOCK_STREAM;
266102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_protocol = IPPROTO_TCP;
266202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_flags = 0|AI_CANONNAME;
266302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  count = 0;
266402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  do {
266502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    error = getaddrinfo((char *)hostname,
266602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        (char *)port,
266702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        &hints,
266802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                        &remote_res);
266902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    count += 1;
267002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (error == EAI_AGAIN) {
267102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
267202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"Sleeping on getaddrinfo EAI_AGAIN\n");
267302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
267402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
267502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sleep(1);
267602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
267702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } while ((error == EAI_AGAIN) && (count <= 5));
267802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
267902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (error) {
268002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("establish control: could not resolve remote '%s' port '%s' af %s",
268102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           hostname,
268202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           port,
268302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           inet_ftos(remfam));
268402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("\n\tgetaddrinfo returned %d %s\n",
268502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           error,
268602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           gai_strerror(error));
268702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(INVALID_SOCKET);
268802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
268902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
269102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_addrinfo(where, remote_res, hostname, port, remfam);
269202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
269302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now we do the local */
269502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  memset(&hints, 0, sizeof(hints));
269602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_family = locfam;
269702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_socktype = SOCK_STREAM;
269802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_protocol = IPPROTO_TCP;
269902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  hints.ai_flags = AI_PASSIVE|AI_CANONNAME;
270002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  count = 0;
270102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  do {
270202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    count += 1;
270302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    error = getaddrinfo((char *)localhost,
270402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                           (char *)localport,
270502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                           &hints,
270602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                           &local_res);
270702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (error == EAI_AGAIN) {
270802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
270902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
271002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                "Sleeping on getaddrinfo(%s,%s) EAI_AGAIN count %d \n",
271102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                localhost,
271202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                localport,
271302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                count);
271402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
271502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
271602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sleep(1);
271702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
271802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  } while ((error == EAI_AGAIN) && (count <= 5));
271902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
272002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (error) {
272102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("establish control: could not resolve local '%s' port '%s' af %s",
272202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           localhost,
272302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           localport,
272402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           inet_ftos(locfam));
272502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    printf("\n\tgetaddrinfo returned %d %s\n",
272602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           error,
272702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           gai_strerror(error));
272802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(INVALID_SOCKET);
272902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
273002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
273202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dump_addrinfo(where, local_res, localhost, localport, locfam);
273302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
273402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  not_connected = 1;
273602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res_temp = local_res;
273702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  remote_res_temp = remote_res;
273802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to loop through all the possibilities. looping on the
273902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     local addresses will be handled within the while loop.  I suppose
274002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     these is some more "C-expert" way to code this, but it has not
274102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     lept to mind just yet :)  raj 2003-02024 */
274202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
274302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (remote_res_temp != NULL) {
274402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
274502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I am guessing that we should use the address family of the
274602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       local endpoint, and we will not worry about mixed family types
274702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       - presumeably the stack or other transition mechanisms will be
274802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       able to deal with that for us. famous last words :)  raj 2003-02-26 */
274902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    control_sock = socket(local_res_temp->ai_family,
275002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          SOCK_STREAM,
275102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          0);
275202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (control_sock == INVALID_SOCKET) {
275302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* at some point we'll need a more generic "display error"
275402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         message for when/if we use GUIs and the like. unlike a bind
275502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         or connect failure, failure to allocate a socket is
275602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         "immediately fatal" and so we return to the caller. raj 2003-02-24 */
275702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
275802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        perror("establish_control: unable to allocate control socket");
275902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
276002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return(INVALID_SOCKET);
276102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
276202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
276302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if we are going to control the local enpoint addressing, we
276402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       need to call bind. of course, we should probably be setting one
276502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       of the SO_REUSEmumble socket options? raj 2005-02-04 */
276602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (bind(control_sock,
276702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     local_res_temp->ai_addr,
276802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     local_res_temp->ai_addrlen) == 0) {
276902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
277002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
277102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"bound control socket to %s and %s\n",
277202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		localhost,
277302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		localport);
277402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
277502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
277602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (connect(control_sock,
277702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  remote_res_temp->ai_addr,
277802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  remote_res_temp->ai_addrlen) == 0) {
277902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we have successfully connected to the remote netserver */
278002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
278102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
278202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "successful connection to remote netserver at %s and %s\n",
278302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  hostname,
278402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  port);
278502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
278602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	not_connected = 0;
278702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* this should get us out of the while loop */
278802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
278902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      } else {
279002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the connect call failed */
279102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
279202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
279302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "establish_control: connect failed, errno %d %s\n",
279402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  errno,
279502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  strerror(errno));
279602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where, "    trying next address combination\n");
279702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
279802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
279902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
280002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
280102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
280202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the bind failed */
280302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
280402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
280502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"establish_control: bind failed, errno %d %s\n",
280602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		errno,
280702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		strerror(errno));
280802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where, "    trying next address combination\n");
280902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
281002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
281102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
281202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
281302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((local_res_temp = local_res_temp->ai_next) == NULL) {
281402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* wrap the local and move to the next server, don't forget to
281502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         close the current control socket. raj 2003-02-24 */
281602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_res_temp = local_res;
281702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the outer while conditions will deal with the case when we
281802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         get to the end of all the possible remote addresses. */
281902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_res_temp = remote_res_temp->ai_next;
282002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it is simplest here to just close the control sock. since
282102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         this is not a performance critical section of code, we
282202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         don't worry about overheads for socket allocation or
282302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         close. raj 2003-02-24 */
282402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
282502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(control_sock);
282602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
282702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
282802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we no longer need the addrinfo stuff */
282902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  freeaddrinfo(local_res);
283002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  freeaddrinfo(remote_res);
283102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* so, we are either connected or not */
283302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (not_connected) {
283402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where, "establish control: are you sure there is a netserver listening on %s at port %s?\n",hostname,port);
283502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
283602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(INVALID_SOCKET);
283702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
283802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we are connected.  we probably want some sort of
283902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     version check with the remote at some point. raj 2003-02-24 */
284002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(control_sock);
284102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
284202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
284402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectestablish_control(char *hostname,
284502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  char *port,
284602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  int   remfam,
284702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  char *localhost,
284802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  char *localport,
284902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  int   locfam)
285002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
285102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
285202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
285302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netlib_control = establish_control_internal(hostname,
285402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					      port,
285502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					      remfam,
285602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					      localhost,
285702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					      localport,
285802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					      locfam);
285902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (netlib_control == INVALID_SOCKET) {
286002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
286102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "establish_control could not establish the control connection from %s port %s address family %s to %s port %s address family %s\n",
286202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    localhost,localport,inet_ftos(locfam),
286302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    hostname,port,inet_ftos(remfam));
286402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
286502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(INVALID_SOCKET);
286602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
286702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
286802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
287002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
287102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
287202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
287302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
287402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*     get_id()                                                        */
287502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
287602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* Return a string to the calling routine that contains the            */
287702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* identifying information for the host we are running on. This        */
287802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* information will then either be displayed locally, or returned to   */
287902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* a remote caller for display there.                                  */
288002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
288102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
288202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
288302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *
288402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_id()
288502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
288602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	static char id_string[80];
288702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
288802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar                    system_name[MAX_COMPUTERNAME_LENGTH+1] ;
288902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectDWORD                   name_len = MAX_COMPUTERNAME_LENGTH + 1 ;
289002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
289102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstruct  utsname         system_name;
289202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
289302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
289402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
289502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project SYSTEM_INFO SystemInfo;
289602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project GetSystemInfo( &SystemInfo ) ;
289702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if ( !GetComputerName(system_name , &name_len) )
289802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   strcpy(system_name , "no_name") ;
289902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
290002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (uname(&system_name) <0) {
290102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   perror("identify_local: uname");
290202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   exit(1);
290302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project }
290402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
290502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
290602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project snprintf(id_string, sizeof(id_string),
290702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
290802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "%-15s%-15s%d.%d%d",
290902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "Windows NT",
291002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  system_name ,
291102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  GetVersion() & 0xFF ,
291202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  GetVersion() & 0xFF00 ,
291302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  SystemInfo.dwProcessorType
291402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
291502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
291602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "%-15s%-15s%-15s%-15s%-15s",
291702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  system_name.sysname,
291802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  system_name.nodename,
291902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  system_name.release,
292002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  system_name.version,
292102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  system_name.machine
292202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
292302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  );
292402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return (id_string);
292502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
292602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
292702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
292802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
292902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
293002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*     identify_local()                                                */
293102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
293202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* Display identifying information about the local host to the user.   */
293302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* At first release, this information will be the same as that which   */
293402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* is returned by the uname -a command, with the exception of the      */
293502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* idnumber field, which seems to be a non-POSIX item, and hence       */
293602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* non-portable.                                                       */
293702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
293802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
293902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
294002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
294102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectidentify_local()
294202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
294302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
294402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar *local_id;
294502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
294602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectlocal_id = get_id();
294702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
294802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfprintf(where,"Local Information \n\
294902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSysname       Nodename       Release        Version        Machine\n");
295002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfprintf(where,"%s\n",
295202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       local_id);
295302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
295502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
295702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
295802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
295902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*     identify_remote()                                               */
296002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
296102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* Display identifying information about the remote host to the user.  */
296202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* At first release, this information will be the same as that which   */
296302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* is returned by the uname -a command, with the exception of the      */
296402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* idnumber field, which seems to be a non-POSIX item, and hence       */
296502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* non-portable. A request is sent to the remote side, which will      */
296602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* return a string containing the utsname information in a             */
296702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* pre-formatted form, which is then displayed after the header.       */
296802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /*                                                                     */
296902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /***********************************************************************/
297002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
297102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
297202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectidentify_remote()
297302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
297402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
297502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar    *remote_id="";
297602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
297702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* send a request for node info to the remote */
297802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectnetperf_request.content.request_type = NODE_IDENTIFY;
297902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_request();
298102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* and now wait for the reply to come back */
298302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_response();
298502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
298602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectif (netperf_response.content.serv_errno) {
298702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        Set_errno(netperf_response.content.serv_errno);
298802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        perror("identify_remote: on remote");
298902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        exit(1);
299002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
299102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfprintf(where,"Remote Information \n\
299302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSysname       Nodename       Release        Version        Machine\n");
299402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfprintf(where,"%s",
299602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       remote_id);
299702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
299802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
299902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
300002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start(int measure_cpu)
300102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
300202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
300302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  gettimeofday(&time1,
300402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project               &tz);
300502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
300602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (measure_cpu) {
300702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_util_init();
300802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    measuring_cpu = 1;
300902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_method = get_cpu_method();
301002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start_internal();
301102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
301202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
301302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
301602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop(int measure_cpu, float *elapsed)
301702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
301902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int     sec,
302102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    usec;
302202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (measure_cpu) {
302402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop_internal();
302502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_util_terminate();
302602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
302702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  gettimeofday(&time2,
302902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       &tz);
303002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
303102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (time2.tv_usec < time1.tv_usec) {
303202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time2.tv_usec += 1000000;
303302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    time2.tv_sec  -= 1;
303402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
303502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
303602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sec     = time2.tv_sec - time1.tv_sec;
303702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  usec    = time2.tv_usec - time1.tv_usec;
303802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_elapsed     = (float)sec + ((float)usec/(float)1000000.0);
303902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *elapsed = lib_elapsed;
304102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
304302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble
304602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_thruput_interval(double units_received,double elapsed)
304702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
304902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double        divisor;
305002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We will calculate the thruput in libfmt units/second */
305202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch (libfmt) {
305302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'K':
305402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1024.0;
305502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
305602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'M':
305702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1024.0 * 1024.0;
305802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
305902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'G':
306002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1024.0 * 1024.0 * 1024.0;
306102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
306202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'k':
306302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1000.0 / 8.0;
306402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
306502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'm':
306602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1000.0 * 1000.0 / 8.0;
306702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
306802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'g':
306902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1000.0 * 1000.0 * 1000.0 / 8.0;
307002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
307102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
307302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1024.0;
307402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
307502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return (units_received / divisor / elapsed);
307702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
307902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble
308102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_thruput(double units_received)
308202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
308402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(calc_thruput_interval(units_received,lib_elapsed));
308502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
308602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
308702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* these "_omni" versions are ones which understand 'x' as a unit,
308802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   meaning transactions/s.  we have a separate routine rather than
308902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   convert the existing routine so we don't have to go and change
309002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   _all_ the nettest_foo.c files at one time.  raj 2007-06-08 */
309102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble
309302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_thruput_interval_omni(double units_received,double elapsed)
309402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
309602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double        divisor;
309702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We will calculate the thruput in libfmt units/second */
309902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  switch (libfmt) {
310002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'K':
310102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1024.0;
310202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
310302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'M':
310402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1024.0 * 1024.0;
310502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
310602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'G':
310702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1024.0 * 1024.0 * 1024.0;
310802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
310902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'k':
311002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1000.0 / 8.0;
311102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
311202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'm':
311302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1000.0 * 1000.0 / 8.0;
311402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
311502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'g':
311602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1000.0 * 1000.0 * 1000.0 / 8.0;
311702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
311802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  case 'x':
311902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1.0;
312002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    break;
312102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  default:
312302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
312402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "WARNING calc_throughput_internal_omni: unknown units %c\n",
312502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    libfmt);
312602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
312702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    divisor = 1024.0;
312802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
312902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return (units_received / divisor / elapsed);
313102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
313302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble
313502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_thruput_omni(double units_received)
313602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
313802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(calc_thruput_interval_omni(units_received,lib_elapsed));
313902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
314002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
314602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util(float elapsed_time)
314702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
314802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(calc_cpu_util_internal(elapsed_time));
314902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
315002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
315202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_service_demand_internal(double unit_divisor,
315302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     double units_sent,
315402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     float elapsed_time,
315502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     float cpu_utilization,
315602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     int num_cpus)
315702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
315802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
315902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double service_demand;
316102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double thruput;
316202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
316302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
316402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"calc_service_demand called:  units_sent = %f\n",
316502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            units_sent);
316602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                             elapsed_time = %f\n",
316702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            elapsed_time);
316802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                             cpu_util = %f\n",
316902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            cpu_utilization);
317002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                             num cpu = %d\n",
317102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            num_cpus);
317202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
317302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
317402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (num_cpus == 0) num_cpus = lib_num_loc_cpus;
317602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (elapsed_time == 0.0) {
317802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time = lib_elapsed;
317902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
318002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (cpu_utilization == 0.0) {
318102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_utilization = lib_local_cpu_util;
318202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
318302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  thruput = (units_sent /
318502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             (double) unit_divisor /
318602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             (double) elapsed_time);
318702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
318802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on MP systems, it is necessary to multiply the service demand by */
318902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the number of CPU's. at least, I believe that to be the case:) */
319002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 10/95 */
319102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* thruput has a "per second" component. if we were using 100% ( */
319302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 100.0) of the CPU in a second, that would be 1 second, or 1 */
319402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* millisecond, so we multiply cpu_utilization by 10 to go to */
319502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* milliseconds, or 10,000 to go to micro seconds. With revision */
319602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 2.1, the service demand measure goes to microseconds per unit. */
319702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 12/95 */
319802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  service_demand = (cpu_utilization*10000.0/thruput) *
319902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (float) num_cpus;
320002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
320202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"calc_service_demand using:   units_sent = %f\n",
320302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            units_sent);
320402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                             elapsed_time = %f\n",
320502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            elapsed_time);
320602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                             cpu_util = %f\n",
320702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            cpu_utilization);
320802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                             num cpu = %d\n",
320902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            num_cpus);
321002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"calc_service_demand got:     thruput = %f\n",
321102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            thruput);
321202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                             servdem = %f\n",
321302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            service_demand);
321402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
321502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
321602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return (float)service_demand;
321702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
321802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
321902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat calc_service_demand(double units_sent,
322002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          float elapsed_time,
322102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          float cpu_utilization,
322202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          int num_cpus)
322302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
322502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double unit_divisor = (double)1024.0;
322702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(calc_service_demand_internal(unit_divisor,
322902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      units_sent,
323002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      elapsed_time,
323102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      cpu_utilization,
323202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      num_cpus));
323302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
323402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat calc_service_demand_trans(double units_sent,
323602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				float elapsed_time,
323702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				float cpu_utilization,
323802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				int num_cpus)
323902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
324102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double unit_divisor = (double)1.0;
324302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(calc_service_demand_internal(unit_divisor,
324502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      units_sent,
324602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      elapsed_time,
324702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      cpu_utilization,
324802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				      num_cpus));
324902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
325002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
325402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_local_cpu(float local_cpu_rate)
325502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
325602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_num_loc_cpus = get_num_cpus();
325802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_use_idle = 0;
326002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef USE_LOOPER
326102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_util_init();
326202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_use_idle = 1;
326302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* USE_LOOPER */
326402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
326502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_rate > 0) {
326602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user think that he knows what the cpu rate is. We assume */
326702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that all the processors of an MP system are essentially the */
326802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* same - for this reason we do not have a per processor maxrate. */
326902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if the machine has processors which are different in */
327002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* performance, the CPU utilization will be skewed. raj 4/95 */
327102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_maxrate = local_cpu_rate;
327202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
327302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
327402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if neither USE_LOOPER nor USE_PSTAT are defined, we return a */
327502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* 0.0 to indicate that times or getrusage should be used. raj */
327602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* 4/95 */
327702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_maxrate = (float)0.0;
327802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(USE_PROC_STAT) || defined(USE_LOOPER) || defined(USE_PSTAT) || defined(USE_KSTAT) || defined(USE_PERFSTAT) || defined(USE_SYSCTL)
327902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_maxrate = calibrate_idle_rate(4,10);
328002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
328102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
328202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return lib_local_maxrate;
328302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
328402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
328702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_remote_cpu()
328802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
328902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float remrate;
329002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
329102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_request.content.request_type = CPU_CALIBRATE;
329202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_request();
329302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we know that calibration will last at least 40 seconds, so go to */
329402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sleep for that long so the 60 second select in recv_response will */
329502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not pop. raj 7/95 */
329602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
329702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we know that CPU calibration may last as long as 40 seconds, so
329802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     make sure we "select" for at least that long while looking for
329902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     the response. raj 2005-05-16 */
330002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_response_timed(40);
330102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (netperf_response.content.serv_errno) {
330302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initially, silently ignore remote errors and pass */
330402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* back a zero to the caller this should allow us to */
330502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* mix rev 1.0 and rev 1.1 netperfs... */
330602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return((float)0.0);
330702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
330802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
330902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the rate is the first word of the test_specific data */
331002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bcopy((char *)netperf_response.content.test_specific_data,
331102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (char *)&remrate,
331202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          sizeof(remrate));
331302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bcopy((char *)netperf_response.content.test_specific_data + sizeof(remrate),
331402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  (char *)&lib_num_rem_cpus,
331502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  sizeof(lib_num_rem_cpus));
331602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*    remrate = (float) netperf_response.content.test_specific_data[0]; */
331702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(remrate);
331802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
331902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
332002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
332202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* WIN32 requires that at least one of the file sets to select be non-null. */
332302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* Since msec_sleep routine is only called by nettest_dlpi & nettest_unix,  */
332402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* let's duck this issue. */
332502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
332702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectmsec_sleep( int msecs )
332802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
332902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int           rval ;
333002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
333102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct timeval timeout;
333202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
333302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_sec = msecs / 1000;
333402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_usec = (msecs - (msecs/1000) *1000) * 1000;
333502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((rval = select(0,
333602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             0,
333702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             0,
333802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             0,
333902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project             &timeout))) {
334002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ( SOCKET_EINTR(rval) ) {
334102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return(1);
334202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
334302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("msec_sleep: select");
334402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
334502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
334602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(0);
334702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
334802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
334902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
335102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* hist.c
335202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   Given a time difference in microseconds, increment one of 61
335402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   different buckets:
335502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   0 - 9 in increments of 1 usec
335702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   0 - 9 in increments of 10 usecs
335802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   0 - 9 in increments of 100 usecs
335902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   1 - 9 in increments of 1 msec
336002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   1 - 9 in increments of 10 msecs
336102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   1 - 9 in increments of 100 msecs
336202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   1 - 9 in increments of 1 sec
336302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   1 - 9 in increments of 10 sec
336402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   > 100 secs
336502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   This will allow any time to be recorded to within an accuracy of
336702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   10%, and provides a compact  representation for capturing the
336802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   distribution of a large number of time differences (e.g.
336902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   request-response latencies).
337002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   Colin Low  10/6/93
337202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   Rick Jones 2004-06-15 extend to unit and ten usecs
337302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project*/
337402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* #include "sys.h" */
337602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*#define HIST_TEST*/
337802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHIST
338002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHIST_new(void){
338102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   HIST h;
338202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   if((h = (HIST) malloc(sizeof(struct histogram_struct))) == NULL) {
338302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     perror("HIST_new - malloc failed");
338402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     exit(1);
338502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   }
338602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   HIST_clear(h);
338702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   return h;
338802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
338902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
339102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHIST_clear(HIST h){
339202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   int i;
339302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   for(i = 0; i < 10; i++){
339402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      h->unit_usec[i] = 0;
339502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      h->ten_usec[i] = 0;
339602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      h->hundred_usec[i] = 0;
339702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      h->unit_msec[i] = 0;
339802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      h->ten_msec[i] = 0;
339902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      h->hundred_msec[i] = 0;
340002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      h->unit_sec[i] = 0;
340102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      h->ten_sec[i] = 0;
340202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   }
340302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   h->ridiculous = 0;
340402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   h->total = 0;
340502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
340602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
340702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
340802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHIST_add(register HIST h, int time_delta){
340902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   register int val;
341002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   h->total++;
341102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   val = time_delta;
341202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   if(val <= 9) h->unit_usec[val]++;
341302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   else {
341402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     val = val/10;
341502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     if(val <= 9) h->ten_usec[val]++;
341602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     else {
341702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       val = val/10;
341802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       if(val <= 9) h->hundred_usec[val]++;
341902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       else {
342002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 val = val/10;
342102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 if(val <= 9) h->unit_msec[val]++;
342202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 else {
342302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   val = val/10;
342402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   if(val <= 9) h->ten_msec[val]++;
342502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   else {
342602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     val = val/10;
342702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     if(val <= 9) h->hundred_msec[val]++;
342802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     else {
342902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project               val = val/10;
343002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project               if(val <= 9) h->unit_sec[val]++;
343102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project               else {
343202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 val = val/10;
343302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 if(val <= 9) h->ten_sec[val]++;
343402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 else h->ridiculous++;
343502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project               }
343602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     }
343702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   }
343802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 }
343902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       }
344002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     }
344102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   }
344202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
344302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define RB_printf printf
344502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
344702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectoutput_row(FILE *fd, char *title, int *row){
344802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   register int i;
344902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   RB_printf("%s", title);
345002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   for(i = 0; i < 10; i++) RB_printf(": %4d", row[i]);
345102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   RB_printf("\n");
345202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
345302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
345502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsum_row(int *row) {
345602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int sum = 0;
345702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
345802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < 10; i++) sum += row[i];
345902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(sum);
346002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
346102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
346302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHIST_report(HIST h){
346402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef OLD_HISTOGRAM
346502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "UNIT_USEC     ", h->unit_usec);
346602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "TEN_USEC      ", h->ten_usec);
346702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "HUNDRED_USEC  ", h->hundred_usec);
346802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
346902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   h->hundred_usec[0] += sum_row(h->unit_usec);
347002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   h->hundred_usec[0] += sum_row(h->ten_usec);
347102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "TENTH_MSEC    ", h->hundred_usec);
347202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
347302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "UNIT_MSEC     ", h->unit_msec);
347402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "TEN_MSEC      ", h->ten_msec);
347502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "HUNDRED_MSEC  ", h->hundred_msec);
347602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "UNIT_SEC      ", h->unit_sec);
347702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   output_row(stdout, "TEN_SEC       ", h->ten_sec);
347802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   RB_printf(">100_SECS: %d\n", h->ridiculous);
347902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   RB_printf("HIST_TOTAL:      %d\n", h->total);
348002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
348102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
348302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* with the advent of sit-and-spin intervals support, we might as well
348502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   make these things available all the time, not just for demo or
348602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   histogram modes. raj 2006-02-06 */
348702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_GETHRTIME
348802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
349002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHIST_timestamp(hrtime_t *timestamp)
349102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
349202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *timestamp = gethrtime();
349302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
349402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
349602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdelta_micro(hrtime_t *begin, hrtime_t *end)
349702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
349802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  long nsecs;
349902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  nsecs = (*end) - (*begin);
350002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(nsecs/1000);
350102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
350202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
350302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined(HAVE_GET_HRT)
350402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "hrt.h"
350502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
350602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
350702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHIST_timestamp(hrt_t *timestamp)
350802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
350902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *timestamp = get_hrt();
351002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
351102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
351202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
351302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdelta_micro(hrt_t *begin, hrt_t *end)
351402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
351502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
351602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return((int)get_hrt_delta(*end,*begin));
351702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
351802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
351902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#elif defined(WIN32)
352002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid HIST_timestamp(LARGE_INTEGER *timestamp)
352102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
352202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	QueryPerformanceCounter(timestamp);
352302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
352402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
352502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint delta_micro(LARGE_INTEGER *begin, LARGE_INTEGER *end)
352602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
352702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	LARGE_INTEGER DeltaTimestamp;
352802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	static LARGE_INTEGER TickHz = {0,0};
352902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (TickHz.QuadPart == 0)
353102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	{
353202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		QueryPerformanceFrequency(&TickHz);
353302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
353402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/*+*+ Rick; this will overflow after ~2000 seconds, is that
353602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  good enough? Spencer: Yes, that should be more than good
353702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  enough for histogram support */
353802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	DeltaTimestamp.QuadPart = (end->QuadPart - begin->QuadPart) *
354002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  1000000/TickHz.QuadPart;
354102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	assert((DeltaTimestamp.HighPart == 0) &&
354202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	       ((int)DeltaTimestamp.LowPart >= 0));
354302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
354402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	return (int)DeltaTimestamp.LowPart;
354502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
354602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
354702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
354802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
354902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
355002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectHIST_timestamp(struct timeval *timestamp)
355102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
355202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  gettimeofday(timestamp,NULL);
355302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
355402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
355502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* return the difference (in micro seconds) between two timeval */
355602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* timestamps */
355702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
355802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdelta_micro(struct timeval *begin,struct timeval *end)
355902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
356102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int usecs, secs;
356302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (end->tv_usec < begin->tv_usec) {
356502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* borrow a second from the tv_sec */
356602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    end->tv_usec += 1000000;
356702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    end->tv_sec--;
356802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
356902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  usecs = end->tv_usec - begin->tv_usec;
357002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  secs  = end->tv_sec - begin->tv_sec;
357102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  usecs += (secs * 1000000);
357302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(usecs);
357502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
357702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* HAVE_GETHRTIME */
357802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_DLPI
358102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
358302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectput_control(fd, len, pri, ack)
358402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int fd, len, pri, ack;
358502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
358602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int error;
358702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int flags = 0;
358802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_error_ack_t *err_ack = (dl_error_ack_t *)control_data;
358902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
359002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  control_message.len = len;
359102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
359202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((error = putmsg(fd, &control_message, 0, pri)) < 0 ) {
359302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"put_control: putmsg error %d\n",error);
359402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
359502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
359602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
359702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((error = getmsg(fd, &control_message, 0, &flags)) < 0) {
359802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"put_control: getsmg error %d\n",error);
359902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
360002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
360102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
360202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (err_ack->dl_primitive != ack) {
360302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"put_control: acknowledgement error wanted %u got %u \n",
360402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            ack,err_ack->dl_primitive);
360502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (err_ack->dl_primitive == DL_ERROR_ACK) {
360602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"             dl_error_primitive: %u\n",
360702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              err_ack->dl_error_primitive);
360802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"             dl_errno:           %u\n",
360902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              err_ack->dl_errno);
361002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"             dl_unix_errno       %u\n",
361102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              err_ack->dl_unix_errno);
361202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
361302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
361402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
361502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
361602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(0);
361802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
361902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
362102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdl_open(char devfile[], int ppa)
362202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
362302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int fd;
362402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_attach_req_t *attach_req = (dl_attach_req_t *)control_data;
362502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((fd = open(devfile, O_RDWR)) == -1) {
362702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netperf: dl_open: open of %s failed, errno = %d\n",
362802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            devfile,
362902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            errno);
363002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
363102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
363202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  attach_req->dl_primitive = DL_ATTACH_REQ;
363402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  attach_req->dl_ppa = ppa;
363502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (put_control(fd, sizeof(dl_attach_req_t), 0, DL_OK_ACK) < 0) {
363702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
363802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "netperf: dl_open: could not send control message, errno = %d\n",
363902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            errno);
364002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
364102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
364202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(fd);
364302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
364402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
364602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdl_bind(int fd, int sap, int mode, char *dlsap_ptr, int *dlsap_len)
364702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
364802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_bind_req_t *bind_req = (dl_bind_req_t *)control_data;
364902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_bind_ack_t *bind_ack = (dl_bind_ack_t *)control_data;
365002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
365102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req->dl_primitive = DL_BIND_REQ;
365202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req->dl_sap = sap;
365302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req->dl_max_conind = 1;
365402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req->dl_service_mode = mode;
365502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req->dl_conn_mgmt = 0;
365602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_req->dl_xidtest_flg = 0;
365702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
365802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (put_control(fd, sizeof(dl_bind_req_t), 0, DL_BIND_ACK) < 0) {
365902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
366002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "netperf: dl_bind: could not send control message, errno = %d\n",
366102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            errno);
366202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
366302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
366402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, the control_data portion of the control message */
366602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* structure should contain a DL_BIND_ACK, which will have a full */
366702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* DLSAP in it. we want to extract this and pass it up so that    */
366802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it can be passed around. */
366902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (*dlsap_len >= bind_ack->dl_addr_length) {
367002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bcopy((char *)bind_ack+bind_ack->dl_addr_offset,
367102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          dlsap_ptr,
367202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          bind_ack->dl_addr_length);
367302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *dlsap_len = bind_ack->dl_addr_length;
367402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(0);
367502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
367602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
367702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return (-1);
367802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
367902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
368002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
368102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
368202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdl_connect(int fd, unsigned char *remote_addr, int remote_addr_len)
368302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
368402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_connect_req_t *connection_req = (dl_connect_req_t *)control_data;
368502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_connect_con_t *connection_con = (dl_connect_con_t *)control_data;
368602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct pollfd pinfo;
368702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
368802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int flags = 0;
368902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is here on the off chance that we really want some data */
369102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  u_long data_area[512];
369202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct strbuf data_message;
369302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int error;
369502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_message.maxlen = 2048;
369702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_message.len = 0;
369802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  data_message.buf = (char *)data_area;
369902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connection_req->dl_primitive = DL_CONNECT_REQ;
370102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connection_req->dl_dest_addr_length = remote_addr_len;
370202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connection_req->dl_dest_addr_offset = sizeof(dl_connect_req_t);
370302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connection_req->dl_qos_length = 0;
370402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connection_req->dl_qos_offset = 0;
370502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bcopy (remote_addr,
370602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         (unsigned char *)control_data + sizeof(dl_connect_req_t),
370702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         remote_addr_len);
370802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* well, I would call the put_control routine here, but the sequence */
371002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of connection stuff with DLPI is a bit screwey with all this */
371102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* message passing - Toto, I don't think were in Berkeley anymore. */
371202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  control_message.len = sizeof(dl_connect_req_t) + remote_addr_len;
371402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((error = putmsg(fd,&control_message,0,0)) !=0) {
371502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"dl_connect: putmsg failure, errno = %d, error 0x%x \n",
371602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            errno,error);
371702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
371802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
371902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
372002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  pinfo.fd = fd;
372202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  pinfo.events = POLLIN | POLLPRI;
372302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  pinfo.revents = 0;
372402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((error = getmsg(fd,&control_message,&data_message,&flags)) != 0) {
372602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"dl_connect: getmsg failure, errno = %d, error 0x%x \n",
372702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            errno,error);
372802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
372902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
373002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
373102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (control_data[0] == DL_TEST_CON) {
373202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* i suppose we spin until we get an error, or a connection */
373302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indication */
373402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if((error = getmsg(fd,&control_message,&data_message,&flags)) !=0) {
373502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       fprintf(where,"dl_connect: getmsg failure, errno = %d, error = 0x%x\n",
373602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project               errno,error);
373702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       fflush(where);
373802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       return(-1);
373902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
374002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
374102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
374202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are out - it either worked or it didn't - which was it? */
374302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (control_data[0] == DL_CONNECT_CON) {
374402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(0);
374502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
374602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
374702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return(-1);
374802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
374902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
375002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
375102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
375202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdl_accept(fd, remote_addr, remote_addr_len)
375302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int fd;
375402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     unsigned char *remote_addr;
375502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int remote_addr_len;
375602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
375702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_connect_ind_t *connect_ind = (dl_connect_ind_t *)control_data;
375802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dl_connect_res_t *connect_res = (dl_connect_res_t *)control_data;
375902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int tmp_cor;
376002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int flags = 0;
376102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
376202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* hang around and wait for a connection request */
376302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  getmsg(fd,&control_message,0,&flags);
376402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (control_data[0] != DL_CONNECT_IND) {
376502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    getmsg(fd,&control_message,0,&flags);
376602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
376702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
376802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now respond to the request. at some point, we may want to be sure */
376902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that the connection came from the correct station address, but */
377002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will assume that we do not have to worry about it just now. */
377102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
377202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  tmp_cor = connect_ind->dl_correlation;
377302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
377402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connect_res->dl_primitive = DL_CONNECT_RES;
377502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connect_res->dl_correlation = tmp_cor;
377602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connect_res->dl_resp_token = 0;
377702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connect_res->dl_qos_length = 0;
377802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connect_res->dl_qos_offset = 0;
377902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  connect_res->dl_growth = 0;
378002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
378102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(put_control(fd, sizeof(dl_connect_res_t), 0, DL_OK_ACK));
378202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
378302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
378402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
378502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
378602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdl_set_window(fd, window)
378702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int fd, window;
378802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
378902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return(0);
379002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
379102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
379302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdl_stats(fd)
379402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int fd;
379502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
379602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
379702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
379902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdl_send_disc(fd)
380002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int fd;
380102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
380202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
380302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
380402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
380502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdl_recv_disc(fd)
380602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int fd;
380702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
380802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
380902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_DLPI*/
381002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
381102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* these routines for confidence intervals are courtesy of IBM. They */
381202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* have been modified slightly for more general usage beyond TCP/UDP */
381302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* tests. raj 11/94 I would suspect that this code carries an IBM */
381402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* copyright that is much the same as that for the original HP */
381502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* netperf code */
381602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint     confidence_iterations; /* for iterations */
381702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
381802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble
381902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  result_confid=-10.0,
382002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_cpu_confid=-10.0,
382102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  rem_cpu_confid=-10.0,
382202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
382302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_result=0.0,
382402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_result=0.0,
382502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_result=0.0,
382602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_result=0.0,
382702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
382802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_local_cpu=0.0,
382902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_local_cpu=0.0,
383002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_local_cpu=0.0,
383102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_local_cpu=0.0,
383202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
383302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_remote_cpu=0.0,
383402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_remote_cpu=0.0,
383502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_remote_cpu=0.0,
383602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_remote_cpu=0.0,
383702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
383802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_local_service_demand=0.0,
383902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_local_service_demand=0.0,
384002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_local_service_demand=0.0,
384102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_local_service_demand=0.0,
384202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
384302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_remote_service_demand=0.0,
384402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_remote_service_demand=0.0,
384502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_remote_service_demand=0.0,
384602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_remote_service_demand=0.0,
384702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
384802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_local_time=0.0,
384902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_local_time=0.0,
385002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_local_time=0.0,
385102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_local_time=0.0,
385202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
385302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_remote_time=0.0,
385402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
385502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_fails,
385602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_local_results,
385702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence=-10.0;
385802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*  interval=0.1; */
385902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
386002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/************************************************************************/
386102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                                      */
386202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      Constants for Confidence Intervals                              */
386302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                                      */
386402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/************************************************************************/
386502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
386602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectinit_stat()
386702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
386802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_sum_result=0.0;
386902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_square_sum_result=0.0;
387002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_mean_result=0.0;
387102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_var_result=0.0;
387202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
387302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_sum_local_cpu=0.0;
387402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_square_sum_local_cpu=0.0;
387502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_mean_local_cpu=0.0;
387602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_var_local_cpu=0.0;
387702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
387802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_sum_remote_cpu=0.0;
387902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_square_sum_remote_cpu=0.0;
388002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_mean_remote_cpu=0.0;
388102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_var_remote_cpu=0.0;
388202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
388302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_sum_local_service_demand=0.0;
388402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_square_sum_local_service_demand=0.0;
388502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_mean_local_service_demand=0.0;
388602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_var_local_service_demand=0.0;
388702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
388802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_sum_remote_service_demand=0.0;
388902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_square_sum_remote_service_demand=0.0;
389002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_mean_remote_service_demand=0.0;
389102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_var_remote_service_demand=0.0;
389202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
389302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_sum_local_time=0.0;
389402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_square_sum_local_time=0.0;
389502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_mean_local_time=0.0;
389602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_var_local_time=0.0;
389702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
389802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_mean_remote_time=0.0;
389902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_fails = 0.0;
390102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        measured_local_results=0.0,
390202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        confidence=-10.0;
390302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
390402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine does a simple table lookup for some statistical */
390602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* function that I would remember if I stayed awake in my probstats */
390702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* class... raj 11/94 */
390802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble
390902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectconfid(int level, int freedom)
391002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
391102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdouble  t99[35],t95[35];
391202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
391302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[1]=12.706;
391402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[2]= 4.303;
391502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[3]= 3.182;
391602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[4]= 2.776;
391702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[5]= 2.571;
391802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[6]= 2.447;
391902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[7]= 2.365;
392002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[8]= 2.306;
392102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[9]= 2.262;
392202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[10]= 2.228;
392302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[11]= 2.201;
392402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[12]= 2.179;
392502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[13]= 2.160;
392602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[14]= 2.145;
392702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[15]= 2.131;
392802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[16]= 2.120;
392902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[17]= 2.110;
393002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[18]= 2.101;
393102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[19]= 2.093;
393202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[20]= 2.086;
393302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[21]= 2.080;
393402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[22]= 2.074;
393502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[23]= 2.069;
393602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[24]= 2.064;
393702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[25]= 2.060;
393802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[26]= 2.056;
393902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[27]= 2.052;
394002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[28]= 2.048;
394102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[29]= 2.045;
394202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t95[30]= 2.042;
394302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
394402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[1]=63.657;
394502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[2]= 9.925;
394602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[3]= 5.841;
394702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[4]= 4.604;
394802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[5]= 4.032;
394902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[6]= 3.707;
395002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[7]= 3.499;
395102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[8]= 3.355;
395202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[9]= 3.250;
395302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[10]= 3.169;
395402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[11]= 3.106;
395502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[12]= 3.055;
395602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[13]= 3.012;
395702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[14]= 2.977;
395802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[15]= 2.947;
395902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[16]= 2.921;
396002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[17]= 2.898;
396102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[18]= 2.878;
396202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[19]= 2.861;
396302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[20]= 2.845;
396402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[21]= 2.831;
396502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[22]= 2.819;
396602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[23]= 2.807;
396702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[24]= 2.797;
396802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[25]= 2.787;
396902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[26]= 2.779;
397002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[27]= 2.771;
397102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[28]= 2.763;
397202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[29]= 2.756;
397302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   t99[30]= 2.750;
397402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   if(level==95){
397602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        return(t95[freedom]);
397702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   } else if(level==99){
397802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        return(t99[freedom]);
397902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   } else{
398002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        return(0);
398102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   }
398202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
398302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
398402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
398502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalculate_confidence(int confidence_iterations,
398602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     float time,
398702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     double result,
398802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     float loc_cpu,
398902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     float rem_cpu,
399002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     float loc_sd,
399102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     float rem_sd)
399202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
399302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
399402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
399502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
399602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "calculate_confidence: itr  %d; time %f; res  %f\n",
399702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            confidence_iterations,
399802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            time,
399902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            result);
400002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
400102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "                               lcpu %f; rcpu %f\n",
400202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            loc_cpu,
400302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            rem_cpu);
400402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
400502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "                               lsdm %f; rsdm %f\n",
400602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            loc_sd,
400702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            rem_sd);
400802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
400902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
401002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
401102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the test time */
401202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_local_time               +=
401302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) time;
401402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_local_time        +=
401502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) time*time;
401602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_local_time              =
401702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_sum_local_time/confidence_iterations;
401802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_local_time               =
401902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_square_sum_local_time/confidence_iterations
402002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      -measured_mean_local_time*measured_mean_local_time;
402102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
402202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the test result */
402302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_result           +=
402402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) result;
402502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_result    +=
402602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) result*result;
402702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_result          =
402802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_sum_result/confidence_iterations;
402902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_result           =
403002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_square_sum_result/confidence_iterations
403102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      -measured_mean_result*measured_mean_result;
403202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
403302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local cpu utilization */
403402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_local_cpu        +=
403502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) loc_cpu;
403602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_local_cpu +=
403702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) loc_cpu*loc_cpu;
403802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_local_cpu       =
403902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_sum_local_cpu/confidence_iterations;
404002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_local_cpu        =
404102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_square_sum_local_cpu/confidence_iterations
404202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      -measured_mean_local_cpu*measured_mean_local_cpu;
404302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
404402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote cpu util */
404502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_remote_cpu       +=
404602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) rem_cpu;
404702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_remote_cpu+=
404802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) rem_cpu*rem_cpu;
404902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_remote_cpu      =
405002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_sum_remote_cpu/confidence_iterations;
405102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_remote_cpu       =
405202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_square_sum_remote_cpu/confidence_iterations
405302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      -measured_mean_remote_cpu*measured_mean_remote_cpu;
405402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
405502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand */
405602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_local_service_demand     +=
405702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) loc_sd;
405802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_local_service_demand+=
405902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) loc_sd*loc_sd;
406002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_local_service_demand    =
406102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_sum_local_service_demand/confidence_iterations;
406202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_local_service_demand     =
406302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_square_sum_local_service_demand/confidence_iterations
406402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      -measured_mean_local_service_demand*measured_mean_local_service_demand;
406502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
406602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* remote service demand */
406702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_sum_remote_service_demand    +=
406802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) rem_sd;
406902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_square_sum_remote_service_demand+=
407002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) rem_sd*rem_sd;
407102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_mean_remote_service_demand   =
407202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_sum_remote_service_demand/confidence_iterations;
407302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  measured_var_remote_service_demand    =
407402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (double) measured_square_sum_remote_service_demand/confidence_iterations
407502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      -measured_mean_remote_service_demand*measured_mean_remote_service_demand;
407602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
407702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if(confidence_iterations>1){
407802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     result_confid= (double) interval -
407902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2.0 * confid(confidence_level,confidence_iterations-1)*
408002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         sqrt(measured_var_result/(confidence_iterations-1.0)) /
408102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           measured_mean_result;
408202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
408302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     loc_cpu_confid= (double) interval -
408402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2.0 * confid(confidence_level,confidence_iterations-1)*
408502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         sqrt(measured_var_local_cpu/(confidence_iterations-1.0)) /
408602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           measured_mean_local_cpu;
408702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
408802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     rem_cpu_confid= (double) interval -
408902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2.0 * confid(confidence_level,confidence_iterations-1)*
409002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         sqrt(measured_var_remote_cpu/(confidence_iterations-1.0)) /
409102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project           measured_mean_remote_cpu;
409202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
409302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     if(debug){
409402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       printf("Conf_itvl %2d: results:%4.1f%% loc_cpu:%4.1f%% rem_cpu:%4.1f%%\n",
409502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              confidence_iterations,
409602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (interval-result_confid)*100.0,
409702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (interval-loc_cpu_confid)*100.0,
409802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (interval-rem_cpu_confid)*100.0);
409902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     }
410002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
410102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     /* if the user has requested that we only wait for the result to
410202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	be confident rather than the result and CPU util(s) then do
410302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	so. raj 2007-08-08 */
410402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     if (!result_confidence_only) {
410502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       confidence = min(min(result_confid,loc_cpu_confid),rem_cpu_confid);
410602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     }
410702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     else {
410802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       confidence = result_confid;
410902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     }
411002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
411102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
411202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
411302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* here ends the IBM code */
411402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
411502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
411602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectretrieve_confident_values(float *elapsed_time,
411702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          double *thruput,
411802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          float *local_cpu_utilization,
411902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          float *remote_cpu_utilization,
412002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          float *local_service_demand,
412102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                          float *remote_service_demand)
412202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
412302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
412402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *elapsed_time            = (float)measured_mean_local_time;
412502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *thruput                 = measured_mean_result;
412602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *local_cpu_utilization   = (float)measured_mean_local_cpu;
412702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *remote_cpu_utilization  = (float)measured_mean_remote_cpu;
412802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *local_service_demand    = (float)measured_mean_local_service_demand;
412902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  *remote_service_demand   = (float)measured_mean_remote_service_demand;
413002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
413102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
413202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* display_confidence() is called when we could not achieve the */
413302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* desirec confidence in the results. it will print the achieved */
413402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* confidence to "where" raj 11/94 */
413502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
413602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectdisplay_confidence()
413702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
413802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
413902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
414002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "!!! WARNING\n");
414102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
414202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "!!! Desired confidence was not achieved within ");
414302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
414402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "the specified iterations.\n");
414502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
414602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "!!! This implies that there was variability in ");
414702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
414802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "the test environment that\n");
414902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
415002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "!!! must be investigated before going further.\n");
415102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
415202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "!!! Confidence intervals: Throughput      : %4.1f%%\n",
415302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          100.0 * (interval - result_confid));
415402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
415502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "!!!                       Local CPU util  : %4.1f%%\n",
415602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          100.0 * (interval - loc_cpu_confid));
415702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
415802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          "!!!                       Remote CPU util : %4.1f%%\n\n",
415902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          100.0 * (interval - rem_cpu_confid));
416002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
416102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4162