102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef lint
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar	nettest_sctp[]="\
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)nettest_sctp.c (c) Copyright 2005-2007 Hewlett-Packard Co. Version 2.4.3";
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define DIRTY
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define WANT_HISTOGRAM
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define WANT_INTERVALS
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* lint */
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	nettest_sctp.c						*/
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      scan_sctp_args()        get the sctp command line args  */
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*                                                              */
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	the actual test routines...				*/
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_sctp_stream()	perform a sctp stream test	*/
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_sctp_stream()					*/
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_sctp_rr()		perform a sctp request/response	*/
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_sctp_rr()						*/
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_sctp_stream_udp()	perform a sctp request/response	*/
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_sctp_stream_upd()	using UDP style API		*/
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	send_sctp_rr_udp()	perform a sctp request/response	*/
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*	recv_sctp_rr_upd()	using UDP style API		*/
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*								*/
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/*      relies on create_data_socket in nettest_bsd.c           */
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/****************************************************************/
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_CONFIG_H
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <config.h>
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(WANT_SCTP)
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <fcntl.h>
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <signal.h>
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <string.h>
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <time.h>
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef NOSTDLIBH
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <malloc.h>
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* NOSTDLIBH */
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdlib.h>
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* NOSTDLIBH */
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if !defined(__VMS)
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/ipc.h>
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* !defined(__VMS) */
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <unistd.h>
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/socket.h>
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/in.h>
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/tcp.h>
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netinet/sctp.h>
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <arpa/inet.h>
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <netdb.h>
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* would seem that not all sctp.h files define a MSG_EOF, but that
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   MSG_EOF can be the same as MSG_FIN so lets work with that
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   assumption.  initial find by Jon Pedersen. raj 2006-02-01 */
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef MSG_EOF
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef MSG_FIN
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define MSG_EOF MSG_FIN
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#error Must have either MSG_EOF or MSG_FIN defined
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* get some of the functions from nettest_bsd.c */
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "nettest_bsd.h"
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "nettest_sctp.h"
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __sgi
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/time.h>
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __sgi */
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "hist.h"
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectextern int first_burst_size;
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* these variables are specific to SCTP tests. declare */
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* them static to make them global only to this file. */
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  msg_count = 0,	/* number of messages to transmit on association */
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  non_block = 0,	/* default to blocking sockets */
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  num_associations = 1; /* number of associations on the endpoint */
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  int confidence_iteration;
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  char  local_cpu_method;
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic  char  remote_cpu_method;
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval time_one;
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic struct timeval time_two;
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic HIST time_hist;
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar sctp_usage[] = "\n\
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectUsage: netperf [global options] -- [test options] \n\
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSCTP Sockets Test Options:\n\
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -b number         Send number requests at the start of _RR tests\n\
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -D [L][,R]        Set SCTP_NODELAY locally and/or remotely\n\
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -h                Display this text\n\
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -H name,fam       Use name (or IP) and family as target of data connection\n\
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -L name,fam       Use name (or IP) and family as source of data connextion\n\
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -m bytes          Set the size of each sent message\n\
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -M bytes          Set the size of each received messages\n\
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -P local[,remote] Set the local/remote port for the data socket\n\
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -r req,[rsp]      Set request/response sizes (_RR tests)\n\
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -s send[,recv]    Set local socket send/recv buffer sizes\n\
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -S send[,recv]    Set remote socket send/recv buffer sizes\n\
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -V 		      Enable copy avoidance if supported\n\
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -N number	      Specifies the number of messages to send (_STREAM tests)\n\
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -B		      run the test in non-blocking mode\n\
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -T number	      Number of associations to create (_MANY tests)\n\
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -4                Use AF_INET (eg IPv4) on both ends of the data conn\n\
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    -6                Use AF_INET6 (eg IPv6) on both ends of the data conn\n\
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project\n\
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectFor those options taking two parms, at least one must be specified;\n\
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectspecifying one value without a comma will set both parms to that\n\
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvalue, specifying a value with a leading comma will set just the second\n\
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectparm, a value with a trailing comma will set just the first. To set\n\
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecteach parm to unique values, specify both and separate them with a\n\
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcomma.\n";
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* This routine is intended to retrieve interesting aspects of tcp */
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for the data connection. at first, it attempts to retrieve the */
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* maximum segment size. later, it might be modified to retrieve */
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* other information, but it must be information that can be */
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* retrieved quickly as it is called during the timing of the test. */
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* for that reason, a second routine may be created that can be */
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* called outside of the timing loop */
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_sctp_info(socket, mss)
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int socket;
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int *mss;
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int sock_opt_len;
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_opt_info(socket,
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    0,
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    SCTP_MAXSEG,
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    mss,
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    &sock_opt_len) < 0) {
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lss_size = -1;
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsctp_enable_events(socket, ev_mask)
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int socket;
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int ev_mask;
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sctp_event_subscribe ev;
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bzero(&ev, sizeof(ev));
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ev_mask & SCTP_SNDRCV_INFO_EV)
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_data_io_event = 1;
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ev_mask & SCTP_ASSOC_CHANGE_EV)
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_association_event = 1;
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ev_mask & SCTP_PEERADDR_CHANGE_EV)
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_address_event = 1;
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ev_mask & SCTP_SND_FAILED_EV)
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_send_failure_event = 1;
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ev_mask & SCTP_REMOTE_ERROR_EV)
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_peer_error_event = 1;
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ev_mask & SCTP_SHUTDOWN_EV)
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_shutdown_event = 1;
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ev_mask & SCTP_PD_EV)
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_partial_delivery_event = 1;
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (ev_mask & SCTP_ADAPT_EV)
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_SCTP_ADAPTATION_LAYER_EVENT
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_adaptation_layer_event = 1;
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ev.sctp_adaption_layer_event = 1;
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (setsockopt(socket,
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   IPPROTO_SCTP,
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SCTP_EVENTS
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   SCTP_EVENTS,
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   SCTP_SET_EVENTS,
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   (const char*)&ev,
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   sizeof(ev)) != 0 ) {
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "sctp_enable_event: could not set sctp events errno %d\n",
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsctp_disposition_t
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsctp_process_event(socket, buf)
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int socket;
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    void *buf;
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sctp_assoc_change *sac;
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sctp_send_failed *ssf;
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sctp_paddr_change *spc;
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    struct sctp_remote_error *sre;
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    union sctp_notification *snp;
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    snp = buf;
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (snp->sn_header.sn_type) {
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case SCTP_ASSOC_CHANGE:
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where, "\tSCTP_ASSOC_CHANGE event, type:");
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fflush(where);
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sac = &snp->sn_assoc_change;
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	switch (sac->sac_type) {
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    case SCTP_COMM_UP:
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if (debug) {
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fprintf(where, "  SCTP_COMM_UP\n");
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fflush(where);
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		break;
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    case SCTP_RESTART:
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if (debug) {
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fprintf(where, "  SCTP_RESTART\n");
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fflush(where);
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		break;
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    case SCTP_CANT_STR_ASSOC:
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if (debug) {
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fprintf(where, "  SCTP_CANT_STR_ASSOC\n");
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fflush(where);
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		break;	/* FIXME ignore above status changes */
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    case SCTP_COMM_LOST:
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if (debug) {
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fprintf(where, "  SCTP_COMM_LOST\n");
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fflush(where);
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		return SCTP_CLOSE;
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    case SCTP_SHUTDOWN_COMP:
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		if (debug) {
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fprintf(where, "  SCTP_SHUTDOWN_COMPLETE\n");
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    fflush(where);
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		}
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		return SCTP_CLOSE;
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		break;
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case SCTP_SEND_FAILED:
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where, "\tSCTP_SEND_FAILED event\n");
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fflush(where);
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	ssf = &snp->sn_send_failed;
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;  /* FIXME ??? ignore this for now */
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case SCTP_PEER_ADDR_CHANGE:
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where, "\tSCTP_PEER_ADDR_CHANGE event\n");
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fflush(where);
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	spc = &snp->sn_paddr_change;
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;	/* FIXME ??? ignore this for now */
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case SCTP_REMOTE_ERROR:
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where, "\tSCTP_REMOTE_ERROR event\n");
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fflush(where);
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sre = &snp->sn_remote_error;
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;	/* FIXME ??? ignore this for now */
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case SCTP_SHUTDOWN_EVENT:
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where, "\tSCTP_SHUTDOWN event\n");
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fflush(where);
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	return SCTP_CLOSE;
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    default:
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where, "unknown type: %hu\n", snp->sn_header.sn_type);
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    return SCTP_OK;
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the SCTP unidirectional data transfer test */
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* (a.k.a. stream) for the sockets interface. It receives its */
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* parameters via global variables from the shell and writes its */
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* output to the standard output. */
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_sctp_stream(remote_host)
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar	remote_host[];
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f   %7.2f   \n";
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f\n";
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Sends   %-8.8s Recvs\n\
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv             Send (avg)          Recv (avg)\n\
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt2 = "\n\
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int interval_count;
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigset_t signal_set;
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-size greater than our send window. this will insure that we */
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	*message_int_ptr;
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int len;
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int nummessages = 0;
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int send_socket;
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_remaining;
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int sctp_mss;
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int timed_out;
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can send > 32 bits worth of bytes */
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) at some point, this should probably become a */
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 64bit integral type, but those are not entirely common yet */
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent = 0.0;
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	i;
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo	*remote_res;
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo	*local_res;
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo	*local_remote_res;
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo	*local_local_res;
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_request_struct	*sctp_stream_request;
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_response_struct	*sctp_stream_response;
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_results_struct	*sctp_stream_result;
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_request  =
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_request_struct *)netperf_request.content.test_specific_data;
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response =
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_response_struct *)netperf_response.content.test_specific_data;
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_result   =
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_results_struct *)netperf_response.content.test_specific_data;
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_hist = HIST_new();
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* complete_addrinfos will either succede or exit the process */
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_SCTP,
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("SCTP STREAM TEST", local_res, remote_res);
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages    =	0;
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent     =	0.0;
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 	0;
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    timed_out	   =    0;
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket == INVALID_SOCKET){
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sctp_stream: sctp stream data socket");
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_sctp_stream: send_socket obtained...\n");
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have either retrieved the socket buffer sizes, */
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* or have tried to set them, so now, we may want to set the send */
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size based on that (because the user either did not use a -m */
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* option, or used one with an argument of 0). If the socket buffer */
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size is not available, we will set the send size to 4KB - no */
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular reason, just arbitrary... */
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_size == 0) {
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lss_size > 0) {
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = lss_size;
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = 4096;
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer ring with the requested alignment and offset. */
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* note also that we have allocated a quantity */
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of memory that is at least one send-size greater than our socket */
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffer size. We want to be sure that there are at least two */
49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers allocated - this can be a bit of a problem when the */
49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size is bigger than the socket size, so we must check... the */
50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user may have wanted to explicitly set the "width" of our send */
50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers, we should respect that wish... */
50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) {
50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_width = (lss_size/send_size) + 1;
50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (send_width == 1) send_width++;
50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* only allocate the send ring once. this is a networking test, */
50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* not a memory allocation test. this way, we do not need a */
51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* deallocate_buffer_ring() routine, and I don't feel like */
51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* writing one anyway :) raj 11/94 */
51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       send_size,
51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. */
52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the socket */
53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* paramters on the other side at this point, hence the reason for */
53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the values being passed in the setup message. If the user did */
53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not specify any of the parameters, they will be passed as 0, which */
53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will indicate to the remote that no changes beyond the system's */
53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default should be used. Alignment is the exception, it will */
53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default to 1, which will be no alignment alterations. */
53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type	=	DO_SCTP_STREAM;
53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->send_buf_size	=	rss_size_req;
53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->recv_buf_size	=	rsr_size_req;
54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->receive_size	=	recv_size;
54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->no_delay	=	rem_nodelay;
54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->recv_alignment	=	remote_recv_align;
54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->recv_offset	=	remote_recv_offset;
54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->measure_cpu	=	remote_cpu_usage;
54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->cpu_rate	=	remote_cpu_rate;
54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_stream_request->test_length	=	test_time;
54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (msg_count)
55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  test_bytes = send_size * msg_count;
55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_stream_request->test_length	=	test_bytes;
55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->so_rcvavoid	=	rem_rcvavoid;
55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->so_sndavoid	=	rem_sndavoid;
55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->dirty_count    =       rem_dirty_count;
55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->clean_count    =       rem_clean_count;
56002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
56102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->port		=	htonl(atoi(remote_data_port));
56202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->ipfamily	=	af_to_nf(remote_res->ai_family);
56302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->non_blocking   =	non_block;
56402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
56502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
56602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
56702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
56802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: send_sctp_stream: requesting sctp stream test\n");
56902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
57002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
57202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant 	*/
57402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket parameters for this test type. We will put them back into */
57502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the variables here so they can be displayed if desired.  The	*/
57602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote will have calibrated CPU if necessary, and will have done	*/
57702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the needed set-up we will have calibrated the cpu locally	*/
57802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before sending the request, and will grab the counter value right*/
57902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the connect returns. The remote will grab the counter right*/
58002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the accept call. This saves the hassle of extra messages	*/
58102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* being sent for the sctp tests.					*/
58202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
58402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
58602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
58702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote listen done.\n");
58802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size	      =	sctp_stream_response->recv_buf_size;
58902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size	      =	sctp_stream_response->send_buf_size;
59002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay     =	sctp_stream_response->no_delay;
59102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage=	sctp_stream_response->measure_cpu;
59202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate = sctp_stream_response->cpu_rate;
59302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have to make sure that the server port number is in */
59502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* network order */
59602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res, (short)sctp_stream_response->data_port_number);
59702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid	= sctp_stream_response->so_rcvavoid;
59902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid	= sctp_stream_response->so_sndavoid;
60002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
60102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
60202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
60302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
60402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
60502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
60602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
60702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
60802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
61002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
61102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
61202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
61302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
61402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
61502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) == INVALID_SOCKET) {
61602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sctp_stream: data socket connect failed");
61702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
61802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
61902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
62002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_enable_events(send_socket, SCTP_ASSOC_CHANGE_EV);
62102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
62202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (non_block) {
62302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* now that we are connected, mark the socket as non-blocking */
62402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (!set_nonblock(send_socket)) {
62502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("netperf: fcntl");
62602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
62702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
62802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
62902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either */
63102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the connect would have failed, or the previous response would */
63202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have indicated a problem. I failed to see the value of the */
63302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* extra  message after the accept on the remote. If it failed, */
63402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we'll see it here. If it didn't, we might as well start pumping */
63502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data. */
63602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
63702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a stream test, they can be */
63802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* either time or byte-count based. */
63902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
64102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
64202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
64302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = 0;
64402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in previous revisions, we had the same code repeated throught */
64502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* all the test suites. this was unnecessary, and meant more */
64602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* work for me when I wanted to switch to POSIX signals, so I */
64702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have abstracted this out into a routine in netlib.c. if you */
64802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* are experiencing signal problems, you might want to look */
64902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there. raj 11/94 */
65002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
65102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
65202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
65302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
65402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = test_bytes;
65502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
65602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
65702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
65902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
66002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
66102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
66302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
66402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
66502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) || (demo_mode)) {
66602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the */
66702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer, unless we are in demo_mode */
66802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate);
66902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
67002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst;
67102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */
67202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
67302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
67402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "send_sctp_stream: unable to get sigmask errno %d\n",
67502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
67602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
67702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
67802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
67902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
68002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
68202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize the random number generator for putting dirty stuff */
68302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* into the send buffer. raj */
68402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    srand((int) getpid());
68502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
68602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before we start, initialize a few variables */
68802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
68902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
69002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
69102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
69202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
69302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. */
69402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (bytes_remaining > 0)) {
69602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
69702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
69802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to dirty some number of consecutive integers in the buffer */
69902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we are about to send. we may also want to bring some number of */
70002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* them cleanly into the cache. The clean ones will follow any dirty */
70102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* ones into the cache. at some point, we might want to replace */
70202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the rand() call with something from a table to reduce our call */
70302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* overhead during the test, but it is not a high priority item. */
70402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr = (int *)(send_ring->buffer_ptr);
70502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (i = 0; i < loc_dirty_count; i++) {
70602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	*message_int_ptr = rand();
70702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	message_int_ptr++;
70802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
70902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (i = 0; i < loc_clean_count; i++) {
71002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	loc_dirty_count = *message_int_ptr;
71102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	message_int_ptr++;
71202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
71302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
71402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
71502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
71602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before we go into send and then again just after */
71702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we come out raj 8/94 */
71802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
71902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
72002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
72102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while ((len=sctp_sendmsg(send_socket,
72202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       send_ring->buffer_ptr, send_size,
72302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       NULL, 0,
72402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       0, 0, 0, 0, 0)) != send_size) {
72502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (non_block && errno == EAGAIN)
72602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    continue;
72702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else if ((len >=0) || SOCKET_EINTR(len)) {
72802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* the test was interrupted, must be the end of test */
72902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
73002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
73102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
73202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("netperf: data send error");
73302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	printf("len was %d\n",len);
73402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
73502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
73602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
73702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (timed_out)
73802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;	/* we timed out durint sendmsg, done with test */
73902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
74102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp the exit from the send call and update the histogram */
74202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_two);
74302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_add(time_hist,delta_micro(&time_one,&time_two));
74402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
74502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
74602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
74702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
74802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	units_this_tick += send_size;
74902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
75002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter */
75102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to decide to sleep for a little bit */
75202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) {
75302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* call sigsuspend and wait for the interval timer to get us */
75402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* out */
75502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug > 1) {
75602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"about to suspend\n");
75702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
75802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
75902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sigsuspend(&signal_set) == EFAULT) {
76002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
76102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "send_sctp_stream: fault with sigsuspend.\n");
76202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
76302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
76402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
76502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	interval_count = interval_burst;
76602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
76702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
76802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
76902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
77002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...we may also want to wrap back to the "beginning" */
77102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* of the bufferspace, so we will mod the number of messages sent */
77202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by the send width, and use that to calculate the offset to add */
77302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to the base pointer. */
77402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
77502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
77602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (bytes_remaining) {
77702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bytes_remaining -= send_size;
77802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
77902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
78002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
78102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test is over. Flush the buffers to the remote end. We do a */
78202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* graceful release to insure that all data has been taken by the */
78302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote. */
78402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
78502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but first, if the verbosity is greater than 1, find-out what */
78602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the sctp maximum segment_size was (if possible) */
78702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
78802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_mss = -1;
78902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      get_sctp_info(send_socket, &sctp_mss);
79002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
79102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
79202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    shutdown(send_socket, SHUT_WR);
79302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
79402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test server will signal to us when it wants to shutdown.
79502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * In blocking mode, we can call recvmsg.  In non-blocking
79602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * mode, we need to select on the socket for reading.
79702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * We'll assume that all returns are succefull
79802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     */
79902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (non_block) {
80002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fd_set readfds;
80102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
80202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	FD_ZERO(&readfds);
80302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	FD_SET(send_socket, &readfds);
80402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	select(send_socket+1, &readfds, NULL, NULL, NULL);
80502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } else {
80602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sctp_recvmsg(send_socket, send_ring->buffer_ptr, send_size, NULL,
80702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		0, NULL, 0);
80802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
80902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
81002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
81102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
81202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
81302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
81402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured and how */
81502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* long did we really */
81602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* run? */
81702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
81802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are finished with the socket, so close it to prevent hitting */
81902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the limit on maximum open files. */
82002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
82102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
82302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated service demand and all those interesting things. If it */
82402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wasn't supposed to care, it will return obvious values. */
82502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
82602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
82702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
82802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
82902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
83002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
83102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
83202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
83302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
83402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
83502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
83602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
83702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
83802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
83902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
84002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
84102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
84202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our thruput was for the test. In the future, */
84302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we may want to include a calculation of the thruput measured by */
84402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the remote, but it should be the case that for a sctp stream test, */
84502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that the two numbers should be *very* close... We calculate */
84602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* bytes_sent regardless of the way the test length was controlled. */
84702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If it was time, we needed to, and if it was by bytes, the user may */
84802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have specified a number of bytes that wasn't a multiple of the */
84902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size, so we really didn't send what he asked for ;-) */
85002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent	= ntohd(sctp_stream_result->bytes_received);
85202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= (double) calc_thruput(bytes_sent);
85402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
85502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
85602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
85702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
85802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
85902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
86002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
86102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
86202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
86302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
86402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_sent,
86502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
86602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
86702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
86802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
86902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
87002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
87102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
87202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
87302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
87502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
87602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= sctp_stream_result->cpu_util;
87702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_sent,
87802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
87902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
88002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      sctp_stream_result->num_cpus);
88102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
88202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
88302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
88402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
88502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
88602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
88702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
88802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
88902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
89002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
89102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
89202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
89302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
89402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
89502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
89602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
89702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
89802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
89902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
90102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
90202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
90302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
90402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
90502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
90602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
90702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
90902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
91002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
91102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
91202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have finished making all the runs that we */
91302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be making. so, we should extract what the calcuated values */
91402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are for all the confidence stuff. we could make the values */
91502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* global, but that seemed a little messy, and it did not seem worth */
91602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the mucking with header files. so, we create a routine much */
91702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* like calcualte_confidence, which just returns the mean values. */
91802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 11/94 */
91902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
92002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
92102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
92202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
92302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
92402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
92502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
92602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
92702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
92802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
92902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
93002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
93102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
93202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
93302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
93402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
93502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
93602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
93702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
93802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
93902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
94002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
94102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
94202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
94302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
94402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
94502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(sctp_stream_result->cpu_method);
94602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
94702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
94802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
94902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
95002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
95102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
95202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
95302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
95402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
95502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
95602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
95702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
95802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
95902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
96002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
96102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
96202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
96302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
96402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
96502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
96602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
96702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
96802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
96902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
97002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
97102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
97202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
97302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
97402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,		        /* remote recvbuf size */
97502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
97602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
97702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
97802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		        /* what was the xfer rate */
97902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
98002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
98102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
98202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
98302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
98402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
98502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
98602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
98702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
98802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
98902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
99002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
99102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
99202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
99302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
99402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
99502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
99602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
99702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
99802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
99902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
100002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
100102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
100202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size, 		/* remote recvbuf size */
100302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size, 		/* local sendbuf size */
100402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
100502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
100602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);/* how fast did it go */
100702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
100802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
100902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
101002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
101202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
101302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
101402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
101502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
101602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
101702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
101802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
101902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
102002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sctp statistics, the alignments of the sends and receives */
102102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
102202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this stuff needs to be worked-out in the presence of confidence */
102402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* intervals and multiple iterations of the test... raj 11/94 */
102502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
102602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
102702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
102802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
102902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
103002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
103102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
103202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
103302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
103402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
103502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
103602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
103702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
103802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)sctp_stream_result->recv_calls,
103902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_stream_result->recv_calls);
104002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
104102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt2,
104202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_mss);
104302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
104402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
104502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n\nHistogram of time spent in send() call.\n");
104602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
104702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
104802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
104902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
105002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
105202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
105602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This is the server-side routine for the sctp stream test. It is */
105702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* implemented as one routine. I could break things-out somewhat, but */
105802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* didn't feel it was necessary. */
105902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
106102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_sctp_stream()
106202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
106302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
106402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in myaddr_in; /* needed to get port number */
106502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage peeraddr;	/* used in accept */
106602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	s_listen,s_data;
106702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	addrlen;
106802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
106902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	receive_calls;
107002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
107102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double   bytes_received;
107202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
107302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
107402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
107502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
107602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
107702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
107802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int  msg_flags = 0;
107902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
108002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
108102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   *message_int_ptr;
108202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   dirty_count;
108302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   clean_count;
108402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   i;
108502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
108602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
108702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
108802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fd_set readfds;
108902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct timeval timeout;
109002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
109102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_request_struct	*sctp_stream_request;
109302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_response_struct	*sctp_stream_response;
109402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_results_struct	*sctp_stream_results;
109502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
109602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
109702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  FD_ZERO(&readfds);
109802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_sec = 1;
109902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_usec = 0;
110002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
110102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
110202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_request	=
110302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_request_struct *)netperf_request.content.test_specific_data;
110402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response	=
110502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_response_struct *)netperf_response.content.test_specific_data;
110602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results	=
110702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_results_struct *)netperf_response.content.test_specific_data;
110802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
110902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
111002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_sctp_stream: entered...\n");
111102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
111202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
111302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
111402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
111502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
111602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
111702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
111802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
111902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
112002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
112102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
112302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
112402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
112502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
112602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
112702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
112802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_stream: setting the response type...\n");
112902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
113002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
113102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = SCTP_STREAM_RESPONSE;
113302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
113502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_stream: the response type is set...\n");
113602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
113702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
113802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
113902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
114002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
114102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
114202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
114302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_stream: requested alignment of %d\n",
114402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_stream_request->recv_alignment);
114502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
114602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
114702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
114802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
114902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
115002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
115102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
115202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = sctp_stream_request->send_buf_size;
115302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = sctp_stream_request->recv_buf_size;
115402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = sctp_stream_request->no_delay;
115502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = sctp_stream_request->so_rcvavoid;
115602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = sctp_stream_request->so_sndavoid;
115702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  non_block = sctp_stream_request->non_blocking;
115802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
115902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
116002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
116102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(sctp_stream_request->ipfamily),
116202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			sctp_stream_request->port);
116302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
116402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
116502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
116602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
116702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(sctp_stream_request->ipfamily),
116802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
116902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_SCTP,
117002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
117102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
117202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
117302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
117402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen < 0) {
117502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
117602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
117702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
117802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
117902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
118002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what sort of sizes did we end-up with? */
118102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_stream_request->receive_size == 0) {
118202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lsr_size > 0) {
118302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = lsr_size;
118402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
118502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
118602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = 4096;
118702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
118802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
118902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
119002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_size = sctp_stream_request->receive_size;
119102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
119202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
119302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to set-up our recv_ring in a manner analagous to what we */
119402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* do on the sending side. this is more for the sake of symmetry */
119502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* than for the needs of say copy avoidance, but it might also be */
119602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* more realistic - this way one could conceivably go with a */
119702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* double-buffering scheme when taking the data an putting it into */
119802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the filesystem or something like that. raj 7/94 */
119902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) {
120102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_width = (lsr_size/recv_size) + 1;
120202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 1) recv_width++;
120302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
120402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
120502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
120602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   recv_size,
120702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_stream_request->recv_alignment,
120802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_stream_request->recv_offset);
120902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
121002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
121102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_stream: set recv_size = %d, align = %d, offset = %d.\n",
121202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   recv_size, sctp_stream_request->recv_alignment,
121302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		   sctp_stream_request->recv_offset);
121402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
121502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
121602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
121702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
121802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
121902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
122002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
122102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == -1){
122202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
122302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
122402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
122502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
122602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
122702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
122802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
122902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
123002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
123102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
123202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
123402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
123502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
123602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
123702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
123802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
123902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
124002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
124102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
124202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->cpu_rate = (float)0.0; 	/* assume no cpu */
124302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_stream_request->measure_cpu) {
124402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_response->measure_cpu = 1;
124502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_response->cpu_rate =
124602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(sctp_stream_request->cpu_rate);
124702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
124802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
124902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_response->measure_cpu = 0;
125002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
125102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
125202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
125302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
125402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->send_buf_size = lss_size;
125502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->recv_buf_size = lsr_size;
125602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->no_delay = loc_nodelay;
125702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->so_rcvavoid = loc_rcvavoid;
125802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->so_sndavoid = loc_sndavoid;
125902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->receive_size = recv_size;
126002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
126202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == -1) {
126302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
126402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
126502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
126602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
126702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
126802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
126902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
127102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr);
127302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
127402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data = accept(s_listen,
127502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      (struct sockaddr *)&peeraddr,
127602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      &addrlen)) == INVALID_SOCKET) {
127702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
127802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
127902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
128002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
128102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_enable_events(s_data, SCTP_ASSOC_CHANGE_EV | SCTP_SHUTDOWN_EV);
128302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
128402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now that we are connected, mark the socket as non-blocking */
128502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (non_block) {
128602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "setting socket as nonblocking\n");
128702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
128802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!set_nonblock(s_data)) {
128902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	close(s_data);
129002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
129102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
129202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
129302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
129502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass */
129602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* attributes across an accept() call. Including this goes against */
129702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* my better judgement :( raj 11/95 */
129802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
129902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
130002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
130202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
130402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
130502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(sctp_stream_request->measure_cpu);
130702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
130802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
130902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
131002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
131202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to dirty some number of consecutive integers in the buffer */
131302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are about to recv. we may also want to bring some number of */
131402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* them cleanly into the cache. The clean ones will follow any dirty */
131502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ones into the cache. */
131602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
131702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dirty_count = sctp_stream_request->dirty_count;
131802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  clean_count = sctp_stream_request->clean_count;
131902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_int_ptr = (int *)recv_ring->buffer_ptr;
132002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < dirty_count; i++) {
132102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *message_int_ptr = rand();
132202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr++;
132302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
132402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < clean_count; i++) {
132502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dirty_count = *message_int_ptr;
132602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr++;
132702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
132802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
132902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_received = 0;
133102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  receive_calls  = 0;
133202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
133302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((len = sctp_recvmsg(s_data,
133402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    recv_ring->buffer_ptr, recv_size,
133502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    NULL, 0, NULL, &msg_flags)) != 0) {
133602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (len == SOCKET_ERROR) {
133702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (non_block && errno == EAGAIN) {
133802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   if (debug){
133902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     fprintf(where,
134002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    "recv_sctp_stream: sctp_recvmsg timed out, trying again\n");
134102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     fflush(where);
134202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   }
134302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   Set_errno(0);
134402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   continue;
134502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
134602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
134702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where,
134802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    "recv_sctp_stream: sctp_recvmsg error %d, exiting",
134902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    errno);
135002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fflush(where);
135102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        }
135202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = errno;
135302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
135402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	close(s_data);
135502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
135602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
135702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
135802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (msg_flags & MSG_NOTIFICATION) {
135902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 msg_flags = 0;
136002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 if (debug) {
136102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   fprintf(where,
136202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    "recv_sctp_stream: Got notification... processing\n");
136302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     fflush(where);
136402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
136502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sctp_process_event(s_data, recv_ring->buffer_ptr) == SCTP_CLOSE)
136602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;	/* break out of the recvmsg loop */
136702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
136802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	continue;
136902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
137002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_received += len;
137202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    receive_calls++;
137302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* more to the next buffer in the recv_ring */
137502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
137602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
137702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef PAUSE
137802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sleep(1);
137902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* PAUSE */
138002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
138102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
138202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr = (int *)(recv_ring->buffer_ptr);
138302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < dirty_count; i++) {
138402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *message_int_ptr = rand();
138502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
138602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
138702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < clean_count; i++) {
138802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      dirty_count = *message_int_ptr;
138902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
139002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
139102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
139202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
139402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	FD_SET(s_data,&readfds);
139502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	select(s_data+1,&readfds,NULL,NULL,&timeout);
139602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
139702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
139802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
139902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* perform a shutdown to signal the sender that */
140102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have received all the data sent. raj 4/93 */
140202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (close(s_data) == -1) {
140402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
140502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
140602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
140702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
140802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
140902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(sctp_stream_request->measure_cpu,&elapsed_time);
141002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
141202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
141302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
141402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
141502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_stream: got %g bytes\n",
141602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
141702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
141802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_stream: got %d recvs\n",
141902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
142002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
142102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
142202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
142302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->bytes_received	= htond(bytes_received);
142402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->elapsed_time	= elapsed_time;
142502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->recv_calls	= receive_calls;
142602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
142702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_stream_request->measure_cpu) {
142802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_results->cpu_util	= calc_cpu_util(0.0);
142902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
143002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
143102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
143202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
143302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_stream: test complete, sending results.\n");
143402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
143502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 bytes_received %g receive_calls %d\n",
143602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received,
143702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
143802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
143902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 len %d\n",
144002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    len);
144102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
144202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
144302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->cpu_method = cpu_method;
144502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->num_cpus   = lib_num_loc_cpus;
144602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
144702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
144802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
144902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_listen);
145002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
145102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
145202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
145302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
145402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This routine implements the SCTP unidirectional data transfer test */
145502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* (a.k.a. stream) for the sockets interface. It receives its */
145602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* parameters via global variables from the shell and writes its */
145702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* output to the standard output. */
145802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
145902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
146002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
146102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_sctp_stream_1toMany(remote_host)
146202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar	remote_host[];
146302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
146402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
146502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
146602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          \n\
146702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              \n\
146802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  \n\
146902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %s/sec  \n\n";
147002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
147202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
147302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1 =
147502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f   %7.2f   \n";
147602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
147702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
147802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectRecv   Send    Send                          Utilization       Service Demand\n\
147902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Socket  Message  Elapsed              Send     Recv     Send    Recv\n\
148002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize   Size    Size     Time     Throughput  local    remote   local   remote\n\
148102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes   bytes    secs.    %-8.8s/s  %% %c      %% %c      us/KB   us/KB\n\n";
148202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
148302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
148402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
148502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
148602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1 =
148702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6d %6d %6d    %-6.2f     %7.2f   %-6.2f   %-6.2f   %-6.3f  %-6.3f\n";
148802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
148902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\n\
149002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset         %-8.8s %-8.8s    Sends   %-8.8s Recvs\n\
149102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote  Xfered   Per                 Per\n\
149202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv             Send (avg)          Recv (avg)\n\
149302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d   %5d  %5d   %5d %6.4g  %6.2f    %6d   %6.2f %6d\n";
149402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
149502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt2 = "\n\
149602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectMaximum\n\
149702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSegment\n\
149802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSize (bytes)\n\
149902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%6d\n";
150002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
150302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
150502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int interval_count;
150602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigset_t signal_set;
150702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
150802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
150902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what we want is to have a buffer space that is at least one */
151002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-size greater than our send window. this will insure that we */
151102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are never trying to re-use a buffer that may still be in the hands */
151202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of the transport. This buffer will be malloc'd after we have found */
151302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the size of the local senc socket buffer. We will want to deal */
151402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with alignment and offset concerns as well. */
151502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
151602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
151702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	*message_int_ptr;
151802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
151902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
152102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int len;
152302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int nummessages = 0;
152402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int *send_socket;
152502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int bytes_remaining;
152602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int sctp_mss;
152702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
152802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with links like fddi, one can send > 32 bits worth of bytes */
152902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* during a test... ;-) at some point, this should probably become a */
153002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* 64bit integral type, but those are not entirely common yet */
153102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_sent = 0.0;
153202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
153402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	i;
153502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
153602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int j;
153702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
153802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
153902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
154002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
154102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
154202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
154302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
154402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
154502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
154602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
154702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *last_remote_res;
154802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *last_local_res;
154902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_request_struct	*sctp_stream_request;
155102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_response_struct	*sctp_stream_response;
155202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_results_struct	*sctp_stream_result;
155302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
155402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_request  =
155502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_request_struct *)netperf_request.content.test_specific_data;
155602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response =
155702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_response_struct *)netperf_response.content.test_specific_data;
155802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_result   =
155902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_results_struct *)netperf_response.content.test_specific_data;
156002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
156202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_hist = HIST_new();
156302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
156402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
156502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
156602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
156702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
156802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_SEQPACKET,
156902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_SCTP,
157002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
157102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
157302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("SCTP 1-TO-MANY STREAM TEST",local_res,remote_res);
157402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
157502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
157602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
157702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
157802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
157902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_socket = malloc(sizeof (int) * num_associations);
158102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_socket == NULL) {
158202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "send_sctp_stream_1toMany: failed to allocation sockets!\n");
158302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
158402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
158502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
158602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
158702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
158802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
158902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
159002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
159102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
159202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
159402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
159502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int		j=0;
159702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int		timed_out = 0;
159802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
159902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
160102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
160202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages    =	0;
160402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent     =	0.0;
160502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up       = 	0;
160602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
160702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we have either retrieved the socket buffer sizes, */
160802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* or have tried to set them, so now, we may want to set the send */
160902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size based on that (because the user either did not use a -m */
161002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* option, or used one with an argument of 0). If the socket buffer */
161102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* size is not available, we will set the send size to 4KB - no */
161202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* particular reason, just arbitrary... */
161302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_size == 0) {
161402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (lss_size > 0) {
161502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = lss_size;
161602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
161702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
161802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_size = 4096;
161902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
162002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
162102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
162202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffer ring with the requested alignment and offset. */
162302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* note also that we have allocated a quantity */
162402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* of memory that is at least one send-size greater than our socket */
162502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffer size. We want to be sure that there are at least two */
162602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers allocated - this can be a bit of a problem when the */
162702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size is bigger than the socket size, so we must check... the */
162802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* user may have wanted to explicitly set the "width" of our send */
162902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* buffers, we should respect that wish... */
163002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) {
163102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_width = (lss_size/send_size) + 1;
163202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (send_width == 1) send_width++;
163302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
163402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
163502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
163602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* only allocate the send ring once. this is a networking test, */
163702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* not a memory allocation test. this way, we do not need a */
163802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* deallocate_buffer_ring() routine, and I don't feel like */
163902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* writing one anyway :) raj 11/94 */
164002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
164102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       send_size,
164202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
164302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
164402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
164502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
164602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
164702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
164802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
164902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
165002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
165102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back. */
165202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
165402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
165502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
165602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
165702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the socket */
165802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* paramters on the other side at this point, hence the reason for */
165902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the values being passed in the setup message. If the user did */
166002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not specify any of the parameters, they will be passed as 0, which */
166102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will indicate to the remote that no changes beyond the system's */
166202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default should be used. Alignment is the exception, it will */
166302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default to 1, which will be no alignment alterations. */
166402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
166502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type	=	DO_SCTP_STREAM_MANY;
166602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->send_buf_size	=	rss_size_req;
166702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->recv_buf_size	=	rsr_size_req;
166802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->receive_size	=	recv_size;
166902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->no_delay	=	rem_nodelay;
167002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->recv_alignment	=	remote_recv_align;
167102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->recv_offset	=	remote_recv_offset;
167202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->measure_cpu	=	remote_cpu_usage;
167302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->cpu_rate	=	remote_cpu_rate;
167402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
167502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_stream_request->test_length	=	test_time;
167602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
167702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
167802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (msg_count)
167902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  test_bytes = send_size * msg_count;
168002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
168102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_stream_request->test_length	=	test_bytes*num_associations;
168202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
168302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->so_rcvavoid	=	rem_rcvavoid;
168402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->so_sndavoid	=	rem_sndavoid;
168502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
168602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->dirty_count    =       rem_dirty_count;
168702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->clean_count    =       rem_clean_count;
168802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
168902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->port		= 	(atoi(remote_data_port));
169002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->ipfamily	=	af_to_nf(remote_res->ai_family);
169102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_request->non_blocking   =	non_block;
169202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
169502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
169602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: send_sctp_stream_1toMany: requesting sctp stream test\n");
169702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
169802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
169902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
170002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
170102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant 	*/
170202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket parameters for this test type. We will put them back into */
170302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the variables here so they can be displayed if desired.  The	*/
170402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote will have calibrated CPU if necessary, and will have done	*/
170502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the needed set-up we will have calibrated the cpu locally	*/
170602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before sending the request, and will grab the counter value right*/
170702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the connect returns. The remote will grab the counter right*/
170802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the accept call. This saves the hassle of extra messages	*/
170902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* being sent for the sctp tests.					*/
171002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
171202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
171302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
171402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
171502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote listen done.\n");
171602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size	      =	sctp_stream_response->recv_buf_size;
171702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size	      =	sctp_stream_response->send_buf_size;
171802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay     =	sctp_stream_response->no_delay;
171902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage=	sctp_stream_response->measure_cpu;
172002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate = sctp_stream_response->cpu_rate;
172102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
172202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we have to make sure that the server port number is in */
172302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* network order */
172402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res, (unsigned short)sctp_stream_response->data_port_number);
172502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid	= sctp_stream_response->so_rcvavoid;
172602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid	= sctp_stream_response->so_sndavoid;
172702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
172802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
172902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
173002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
173102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
173202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
173302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
173402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
173502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
173702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
173802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
173902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the the array of data sockets  and connect them to the server */
174002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (j = 0; j < num_associations; j++) {
174202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_socket[j] = create_data_socket(local_res);
174302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (send_socket[j] < 0){
174502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("netperf: send_sctp_stream_1toMany: sctp stream data socket");
174602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
174702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
174802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
174902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug) {
175002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"send_sctp_stream_1toMany: send_socket obtained...\n");
175102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
175202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
175302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/*Connect up to the remote port on the data socket  */
175402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (connect(send_socket[j],
175502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    remote_res->ai_addr,
175602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    remote_res->ai_addrlen) == INVALID_SOCKET){
175702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("netperf: send_sctp_stream_1toMany: data socket connect failed");
175802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
175902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
176002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
176102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* Do it after connect is successfull, so that we don't see COMM_UP */
176202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sctp_enable_events(send_socket[j], SCTP_ASSOC_CHANGE_EV);
176302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
176402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (non_block) {
176502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* now that we are connected, mark the socket as non-blocking */
176602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if (!set_nonblock(send_socket[j])) {
176702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      perror("netperf: fcntl");
176802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      exit(1);
176902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
177002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
177102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
177202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
177302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either */
177402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the connect would have failed, or the previous response would */
177502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have indicated a problem. I failed to see the value of the */
177602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* extra  message after the accept on the remote. If it failed, */
177702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we'll see it here. If it didn't, we might as well start pumping */
177802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* data. */
177902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a stream test, they can be */
178102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* either time or byte-count based. */
178202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
178302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
178402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
178502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
178602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = 0;
178702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in previous revisions, we had the same code repeated throught */
178802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* all the test suites. this was unnecessary, and meant more */
178902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* work for me when I wanted to switch to POSIX signals, so I */
179002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* have abstracted this out into a routine in netlib.c. if you */
179102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* are experiencing signal problems, you might want to look */
179202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there. raj 11/94 */
179302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
179402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
179502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
179602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
179702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      bytes_remaining = test_bytes * num_associations;
179802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
179902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
180002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
180202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
180302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
180402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
180602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
180702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
180802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) || (demo_mode)) {
180902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the */
181002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer, unless we are in demo_mode */
181102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate);
181202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
181302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst;
181402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */
181502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
181602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
181702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "send_sctp_stream_1toMany: unable to get sigmask errno %d\n",
181802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
181902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
182002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
182102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
182202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
182302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
182402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
182502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize the random number generator for putting dirty stuff */
182602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* into the send buffer. raj */
182702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    srand((int) getpid());
182802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
182902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before we start, initialize a few variables */
183102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
183302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
183402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
183502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
183602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. */
183702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
183802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (bytes_remaining > 0)) {
183902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
184002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
184102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to dirty some number of consecutive integers in the buffer */
184202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we are about to send. we may also want to bring some number of */
184302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* them cleanly into the cache. The clean ones will follow any dirty */
184402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* ones into the cache. at some point, we might want to replace */
184502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the rand() call with something from a table to reduce our call */
184602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* overhead during the test, but it is not a high priority item. */
184702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr = (int *)(send_ring->buffer_ptr);
184802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (i = 0; i < loc_dirty_count; i++) {
184902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	*message_int_ptr = rand();
185002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	message_int_ptr++;
185102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
185202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (i = 0; i < loc_clean_count; i++) {
185302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	loc_dirty_count = *message_int_ptr;
185402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	message_int_ptr++;
185502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
185602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
185702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
185802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
185902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before we go into send and then again just after */
186002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we come out raj 8/94 */
186102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      gettimeofday(&time_one,NULL);
186202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
186302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
186402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (j = 0; j < num_associations; j++) {
186502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
186602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if((len=sctp_sendmsg(send_socket[j],
186702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       send_ring->buffer_ptr,
186802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       send_size,
186902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       (struct sockaddr *)remote_res->ai_addr,
187002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       remote_res->ai_addrlen,
187102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       0, 0, 0, 0, 0)) != send_size) {
187202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if ((len >=0) || SOCKET_EINTR(len)) {
187302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* the test was interrupted, must be the end of test */
187402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      timed_out = 1;
187502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
187602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    } else if (non_block && errno == EAGAIN) {
187702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		j--;	 /* send again on the same socket */
187802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		Set_errno(0);
187902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		continue;
188002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
188102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    perror("netperf: data send error");
188202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    printf("len was %d\n",len);
188302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
188402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
188502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
188602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
188702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (timed_out)
188802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;	/* test is over, try next iteration */
188902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
189102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp the exit from the send call and update the histogram */
189202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      gettimeofday(&time_two,NULL);
189302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_add(time_hist,delta_micro(&time_one,&time_two));
189402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
189502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
189602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
189702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
189802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	units_this_tick += send_size;
189902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
190002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter */
190102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to decide to sleep for a little bit */
190202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) {
190302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* call sigsuspend and wait for the interval timer to get us */
190402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* out */
190502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug > 1) {
190602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"about to suspend\n");
190702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
190802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
190902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sigsuspend(&signal_set) == EFAULT) {
191002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
191102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "send_sctp_stream_1toMany: fault with sigsuspend.\n");
191202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
191302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
191402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
191502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	interval_count = interval_burst;
191602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
191702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
191802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
191902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* now we want to move our pointer to the next position in the */
192002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* data buffer...we may also want to wrap back to the "beginning" */
192102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* of the bufferspace, so we will mod the number of messages sent */
192202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* by the send width, and use that to calculate the offset to add */
192302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to the base pointer. */
192402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
192502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
192602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (bytes_remaining) {
192702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	bytes_remaining -= send_size;
192802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
192902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
193002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test is over. Flush the buffers to the remote end. We do a */
193202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* graceful release to insure that all data has been taken by the */
193302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote. */
193402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
193502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* but first, if the verbosity is greater than 1, find-out what */
193602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the sctp maximum segment_size was (if possible) */
193702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (verbosity > 1) {
193802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_mss = -1;
193902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      get_sctp_info(send_socket[0], &sctp_mss);
194002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
194102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* signal the server that we are all done writing, this will
194302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * initiate a shutdonw of one of the associations on the
194402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * server and trigger an event telling the server it's all done
194502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     */
194602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_sendmsg(send_socket[0], NULL, 0, remote_res->ai_addr,
194702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		 remote_res->ai_addrlen, 0, MSG_EOF, 0, 0, 0);
194802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
194902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
195002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The test server will initiate closure of all associations
195102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * when it's done reading. We want a basic mechanism to catch this
195202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * and are using SCTP events for this.
195302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * In blocking mode, we can call recvmsg with the last socket we created.
195402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * In non-blocking  mode, we need to select on the socket for reading.
195502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * We'll assume that all returns are succefull and signify
195602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * closure.
195702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * It is sufficient to do this on a single socket in the client.
195802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * We choose to do it on a socket other then the one that send MSG_EOF.
195902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * This means that anything comming in on that socket will be a shutdown.
196002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     */
196102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (non_block) {
196202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fd_set readfds;
196302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
196402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	FD_ZERO(&readfds);
196502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	FD_SET(send_socket[num_associations-1], &readfds);
196602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	select(send_socket[num_associations-1]+1, &readfds, NULL, NULL, NULL);
196702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } else {
196802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	sctp_recvmsg(send_socket[num_associations], send_ring->buffer_ptr,
196902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     send_size, NULL, 0, NULL, 0);
197002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
197102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
197302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
197402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
197502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
197602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured and how */
197702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* long did we really */
197802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* run? */
197902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are finished with our sockets, so close them to prevent hitting */
198102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the limit on maximum open files. */
198202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (j = 0; j < num_associations; j++)
198302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	close(send_socket[j]);
198402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
198602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated service demand and all those interesting things. If it */
198702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* wasn't supposed to care, it will return obvious values. */
198802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
198902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
199002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
199102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
199202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
199302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
199402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
199502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
199602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
199702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
199802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
199902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
200002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
200102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
200302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
200402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
200502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our thruput was for the test. In the future, */
200602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we may want to include a calculation of the thruput measured by */
200702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the remote, but it should be the case that for a sctp stream test, */
200802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* that the two numbers should be *very* close... We calculate */
200902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* bytes_sent regardless of the way the test length was controlled. */
201002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If it was time, we needed to, and if it was by bytes, the user may */
201102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* have specified a number of bytes that wasn't a multiple of the */
201202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* send_size, so we really didn't send what he asked for ;-) */
201302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_sent	= ntohd(sctp_stream_result->bytes_received);
201502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= (double) calc_thruput(bytes_sent);
201702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
201802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
201902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
202002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
202102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
202202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
202302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
202402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
202502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
202602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= calc_cpu_util(0.0);
202702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= calc_service_demand(bytes_sent,
202802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
202902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
203002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0);
203102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
203202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
203302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
203402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
203502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
203602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
203702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
203802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
203902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization	= sctp_stream_result->cpu_util;
204002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand	= calc_service_demand(bytes_sent,
204102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      0.0,
204202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      remote_cpu_utilization,
204302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						      sctp_stream_result->num_cpus);
204402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
204502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
204602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
204702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
204802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
204902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
205002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
205102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
205202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
205302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
205402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
205502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
205602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
205702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
205802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
205902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
206002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
206102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
206202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
206302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
206402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
206502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
206602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
206702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
206802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
206902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
207002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
207302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
207402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
207502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at this point, we have finished making all the runs that we */
207602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will be making. so, we should extract what the calcuated values */
207702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* are for all the confidence stuff. we could make the values */
207802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* global, but that seemed a little messy, and it did not seem worth */
207902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* all the mucking with header files. so, we create a routine much */
208002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* like calcualte_confidence, which just returns the mean values. */
208102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* raj 11/94 */
208202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
208302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
208402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
208502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
208602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
208702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
208802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
208902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
209002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
209102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
209202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
209302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
209402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
209502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
209602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
209702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
209802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
209902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
210002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
210102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
210202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
210302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
210402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
210502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
210602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
210702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
210802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(sctp_stream_result->cpu_method);
210902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
211002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
211102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
211202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
211302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
211402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
211502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
211602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
211702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
211802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
211902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
212002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
212102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
212202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
212302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
212402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
212502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
212602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
212702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
212802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
212902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
213002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		format_units(),
213102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
213202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
213302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
213402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
213502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
213602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1,		/* the format string */
213702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size,		        /* remote recvbuf size */
213802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		        /* local sendbuf size */
213902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
214002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
214102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput, 		        /* what was the xfer rate */
214202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
214302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
214402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
214502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
214602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
214702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
214802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
214902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
215002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
215102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
215202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
215302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
215402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
215502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
215602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
215702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
215802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
215902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
216002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
216102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
216202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
216302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
216402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1,		/* the format string */
216502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size, 		/* remote recvbuf size */
216602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size, 		/* local sendbuf size */
216702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      send_size,		/* how large were the sends */
216802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
216902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);/* how fast did it go */
217002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
217102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
217202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
217302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
217402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
217502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
217602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
217702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
217802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
217902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
218102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
218202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
218302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sctp statistics, the alignments of the sends and receives */
218402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
218502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this stuff needs to be worked-out in the presence of confidence */
218702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* intervals and multiple iterations of the test... raj 11/94 */
218802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
218902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
219002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
219102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
219202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
219302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "Bytes",
219402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
219502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_align,
219602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
219702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
219802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent,
219902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)nummessages,
220002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    nummessages,
220102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_sent / (double)sctp_stream_result->recv_calls,
220202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_stream_result->recv_calls);
220302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
220402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt2,
220502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_mss);
220602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
220702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
220802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\n\nHistogram of time spent in send() call.\n");
220902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
221002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
221102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
221202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
221302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
221502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
221802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* This is the server-side routine for the sctp stream test. It is */
221902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* implemented as one routine. I could break things-out somewhat, but */
222002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* didn't feel it was necessary. */
222102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
222302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_sctp_stream_1toMany()
222402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
222502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
222602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in myaddr_in;
222702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	s_recv;
222802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	addrlen;
222902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
223002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int	receive_calls;
223102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
223202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double   bytes_received;
223302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	msg_flags = 0;
223402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
223502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
223602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
223702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
223802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
223902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
224002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
224102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
224202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   *message_int_ptr;
224302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   dirty_count;
224402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   clean_count;
224502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   i;
224602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
224702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
224802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
224902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fd_set readfds;
225002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct timeval timeout;
225102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
225202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_request_struct	*sctp_stream_request;
225402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_response_struct	*sctp_stream_response;
225502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_stream_results_struct	*sctp_stream_results;
225602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
225702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
225802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  FD_ZERO(&readfds);
225902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_sec = 1;
226002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  timeout.tv_usec = 0;
226102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
226202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
226302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_request	=
226402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_request_struct *)netperf_request.content.test_specific_data;
226502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response	=
226602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_response_struct *)netperf_response.content.test_specific_data;
226702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results	=
226802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_stream_results_struct *)netperf_response.content.test_specific_data;
226902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
227102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_sctp_stream: entered...\n");
227202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
227302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
227402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
227502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
227602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
227702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
227802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
227902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
228002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
228102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
228202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
228402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
228502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
228602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
228702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
228802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
228902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_stream_1toMany: setting the response type...\n");
229002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
229102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
229202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = SCTP_STREAM_MANY_RESPONSE;
229402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
229502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
229602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_stream_1toMany: the response type is set...\n");
229702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
229802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
229902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We now alter the message_ptr variable to be at the desired */
230102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* alignment with the desired offset. */
230202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
230402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_stream_1toMany: requested alignment of %d\n",
230502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_stream_request->recv_alignment);
230602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
230702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
230802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
230902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
231002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
231102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
231202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
231302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = sctp_stream_request->send_buf_size;
231402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = sctp_stream_request->recv_buf_size;
231502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = sctp_stream_request->no_delay;
231602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = sctp_stream_request->so_rcvavoid;
231702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = sctp_stream_request->so_sndavoid;
231802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  non_block = sctp_stream_request->non_blocking;
231902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
232102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
232202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(sctp_stream_request->ipfamily),
232302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			sctp_stream_request->port);
232402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
232502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
232602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
232702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
232802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(sctp_stream_request->ipfamily),
232902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_SEQPACKET,
233002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_SCTP,
233102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
233202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
233302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_recv = create_data_socket(local_res);
233402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
233502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_recv < 0) {
233602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
233702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
233802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
233902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
234002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
234102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* what sort of sizes did we end-up with? */
234202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_stream_request->receive_size == 0) {
234302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lsr_size > 0) {
234402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = lsr_size;
234502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
234602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
234702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = 4096;
234802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
234902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
235002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
235102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_size = sctp_stream_request->receive_size;
235202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
235302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
235402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to set-up our recv_ring in a manner analagous to what we */
235502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* do on the sending side. this is more for the sake of symmetry */
235602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* than for the needs of say copy avoidance, but it might also be */
235702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* more realistic - this way one could conceivably go with a */
235802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* double-buffering scheme when taking the data an putting it into */
235902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the filesystem or something like that. raj 7/94 */
236002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) {
236202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_width = (lsr_size/recv_size) + 1;
236302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 1) recv_width++;
236402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
236502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
236602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
236702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   recv_size,
236802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_stream_request->recv_alignment,
236902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_stream_request->recv_offset);
237002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
237202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_stream: receive alignment and offset set...\n");
237302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
237402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
237502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
237602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
237702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_recv, 5) == -1) {
237802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
237902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_recv);
238002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
238102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
238302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
238402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
238502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
238602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
238702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_recv,
238802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in,
238902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  &addrlen) == -1){
239002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
239102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_recv);
239202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
239302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
239402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
239502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
239602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
239702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
239802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
239902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
240002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
240202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
240302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
240402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
240502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
240602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
240702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a -1 to */
240802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
240902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
241002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->cpu_rate = (float)0.0; 	/* assume no cpu */
241102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_stream_request->measure_cpu) {
241202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_response->measure_cpu = 1;
241302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_response->cpu_rate =
241402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      calibrate_local_cpu(sctp_stream_request->cpu_rate);
241502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
241602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
241702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_response->measure_cpu = 0;
241802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
241902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
242102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
242202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->send_buf_size = lss_size;
242302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->recv_buf_size = lsr_size;
242402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->no_delay = loc_nodelay;
242502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->so_rcvavoid = loc_rcvavoid;
242602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->so_sndavoid = loc_sndavoid;
242702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_response->receive_size = recv_size;
242802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
242902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
243002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_enable_events(s_recv, SCTP_ASSOC_CHANGE_EV | SCTP_SHUTDOWN_EV);
243302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
243402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now that we are connected, mark the socket as non-blocking */
243502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (non_block) {
243602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (!set_nonblock(s_recv)) {
243702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	close(s_recv);
243802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
243902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
244002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
244102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
244402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
244502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(sctp_stream_request->measure_cpu);
244702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
244802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when the sender does a shutdown, which will */
244902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* return a length of zero   */
245002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
245202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we want to dirty some number of consecutive integers in the buffer */
245302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are about to recv. we may also want to bring some number of */
245402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* them cleanly into the cache. The clean ones will follow any dirty */
245502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ones into the cache. */
245602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
245702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  dirty_count = sctp_stream_request->dirty_count;
245802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  clean_count = sctp_stream_request->clean_count;
245902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  message_int_ptr = (int *)recv_ring->buffer_ptr;
246002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < dirty_count; i++) {
246102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    *message_int_ptr = rand();
246202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr++;
246302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
246402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < clean_count; i++) {
246502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    dirty_count = *message_int_ptr;
246602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr++;
246702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
246802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
246902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bytes_received = 0;
247102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  receive_calls  = 0;
247202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
247302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((len = sctp_recvmsg(s_recv, recv_ring->buffer_ptr, recv_size,
247402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     NULL, 0,  /* we don't care who it's from */
247502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			     NULL, &msg_flags)) != 0) {
247602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (len < 0) {
247702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (non_block && errno == EAGAIN) {
247802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	Set_errno(0);
247902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	continue;
248002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
248102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
248202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
248302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      close(s_recv);
248402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
248502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
248602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
248702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (msg_flags & MSG_NOTIFICATION) {
248802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sctp_process_event(s_recv, recv_ring->buffer_ptr) == SCTP_CLOSE)
248902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
249002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	continue;
249202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
249302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_received += len;
249502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    receive_calls++;
249602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
249702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* more to the next buffer in the recv_ring */
249802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
249902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef PAUSE
250102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sleep(1);
250202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* PAUSE */
250302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
250402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DIRTY
250502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    message_int_ptr = (int *)(recv_ring->buffer_ptr);
250602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < dirty_count; i++) {
250702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      *message_int_ptr = rand();
250802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
250902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
251002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (i = 0; i < clean_count; i++) {
251102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      dirty_count = *message_int_ptr;
251202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      message_int_ptr++;
251302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
251402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DIRTY */
251502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
251602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef DO_SELECT
251702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	FD_SET(s_recv,&readfds);
251802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	select(s_recv+1,&readfds,NULL,NULL,&timeout);
251902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* DO_SELECT */
252002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
252102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
252202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
252302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* perform a shutdown to signal the sender.  in this case, sctp
252402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * will close all associations on this socket
252502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   */
252602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (close(s_recv) == -1) {
252702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = errno;
252802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
252902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
253002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
253102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
253202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(sctp_stream_request->measure_cpu,&elapsed_time);
253302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
253402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
253502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
253602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
253702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
253802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_stream: got %g bytes\n",
253902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received);
254002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
254102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_stream: got %d recvs\n",
254202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
254302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
254402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
254502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
254602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->bytes_received	= htond(bytes_received);
254702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->elapsed_time	= elapsed_time;
254802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->recv_calls	= receive_calls;
254902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_stream_request->measure_cpu) {
255102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_stream_results->cpu_util	= calc_cpu_util(0.0);
255202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  };
255302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
255402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
255502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
255602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_stream: test complete, sending results.\n");
255702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
255802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 bytes_received %g receive_calls %d\n",
255902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    bytes_received,
256002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    receive_calls);
256102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
256202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "                 len %d\n",
256302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    len);
256402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
256502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
256602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
256702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->cpu_method = cpu_method;
256802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_stream_results->num_cpus   = lib_num_loc_cpus;
256902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
257002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
257102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the sending (netperf) side of the SCTP_RR */
257402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test. */
257502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
257602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
257702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_sctp_rr(remote_host)
257802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     char	remote_host[];
257902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
258002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
258102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
258202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
258302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
258402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
258502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
258602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
258702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
258802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
258902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
259002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
259102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
259202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
259302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
259402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
259502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
259602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
259702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
259802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
259902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
260002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
260202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
260302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
260502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f  %-6.2f %-6.2f %-6.3f  %-6.3f\n";
260602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
260702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
260802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
260902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
261002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
261102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
261202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
261302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
261402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
261502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
261602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
261702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
261802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
261902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len;
262102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
262202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
262302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	send_socket;
262402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
262502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   msg_flags = 0;
262602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
262702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
262802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
262902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
263002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
263202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
263302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
263402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
263502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
263602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
263702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
263802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
263902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage peer;
264102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
264202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
264302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_request_struct	*sctp_rr_request;
264502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_response_struct	*sctp_rr_response;
264602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_results_struct	*sctp_rr_result;
264702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
264802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
264902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	interval_count;
265002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigset_t signal_set;
265102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
265202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
265302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_request =
265402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_request_struct *)netperf_request.content.test_specific_data;
265502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response =
265602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_response_struct *)netperf_response.content.test_specific_data;
265702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_result =
265802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_results_struct *)netperf_response.content.test_specific_data;
265902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
266102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_hist = HIST_new();
266202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
266302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
266502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
266602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
266702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
266802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
266902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* complete_addrinfos will either succede or exit the process */
267002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
267102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
267202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
267302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_STREAM,
267402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_SCTP,
267502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
267602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
267702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
267802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("SCTP REQUEST/RESPONSE TEST", local_res, remote_res);
267902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
268002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
268102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
268202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
268302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
268402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = NULL;
268502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
268602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
268702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
268802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
268902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
269002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
269102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
269202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
269302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
269402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
269602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
269702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
269802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
269902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
270002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages     = 0;
270202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd     = 0.0;
270302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up        = 0;
270402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    timed_out       = 0;
270502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
270602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
270702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffers with the requested alignment and offset. */
270802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since this is a request/response test, default the send_width and */
270902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* recv_width to 1 and not two raj 7/94 */
271002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 1;
271202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) recv_width = 1;
271302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
271402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
271502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
271602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       req_size,
271702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
271802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
271902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
272002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
272102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
272202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
272302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       rsp_size,
272402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
272502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
272602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
272702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
272802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket                        */
272902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_socket = create_data_socket(local_res);
273002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_socket < 0){
273202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sctp_rr: sctp stream data socket");
273302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
273402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
273502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
273602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
273702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"send_sctp_rr: send_socket obtained...\n");
273802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
273902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
274002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
274102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
274202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
274302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
274402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
274502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back.*/
274602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
274702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
274802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
274902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
275002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
275102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the socket */
275202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* paramters on the other side at this point, hence the reason for */
275302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the values being passed in the setup message. If the user did */
275402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not specify any of the parameters, they will be passed as 0, which */
275502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will indicate to the remote that no changes beyond the system's */
275602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default should be used. Alignment is the exception, it will */
275702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default to 8, which will be no alignment alterations. */
275802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
275902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type	=	DO_SCTP_RR;
276002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->recv_buf_size	=	rsr_size_req;
276102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->send_buf_size	=	rss_size_req;
276202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->recv_alignment     =	remote_recv_align;
276302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->recv_offset        =	remote_recv_offset;
276402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->send_alignment     =	remote_send_align;
276502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->send_offset	=	remote_send_offset;
276602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->request_size	=	req_size;
276702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->response_size	=	rsp_size;
276802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->no_delay	        =	rem_nodelay;
276902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->measure_cpu	=	remote_cpu_usage;
277002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->cpu_rate	        =	remote_cpu_rate;
277102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->so_rcvavoid	        =	rem_rcvavoid;
277202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->so_sndavoid	        =	rem_sndavoid;
277302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
277402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_rr_request->test_length	=	test_time;
277502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
277602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
277702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_rr_request->test_length	=	test_trans * -1;
277802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
277902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->non_blocking	= 	non_block;
278002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->ipfamily           = af_to_nf(remote_res->ai_family);
278102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
278202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
278302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_sctp_rr: requesting SCTP rr test\n");
278402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
278502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
278602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
278702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
278802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant 	*/
278902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket parameters for this test type. We will put them back into */
279002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the variables here so they can be displayed if desired.  The	*/
279102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote will have calibrated CPU if necessary, and will have done	*/
279202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the needed set-up we will have calibrated the cpu locally	*/
279302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before sending the request, and will grab the counter value right*/
279402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the connect returns. The remote will grab the counter right*/
279502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the accept call. This saves the hassle of extra messages	*/
279602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* being sent for the sctp tests.					*/
279702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
279802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
279902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
280002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
280102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
280202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote listen done.\n");
280302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size          = sctp_rr_response->recv_buf_size;
280402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size          = sctp_rr_response->send_buf_size;
280502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay       = sctp_rr_response->no_delay;
280602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage  = sctp_rr_response->measure_cpu;
280702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate   = sctp_rr_response->cpu_rate;
280802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* make sure that port numbers are in network order */
280902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res,
281002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      (unsigned short)sctp_rr_response->data_port_number);
281102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
281202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
281302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
281402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
281502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
281602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
281702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
281802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
281902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
282002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
282102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
282202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
282302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*Connect up to the remote port on the data socket  */
282402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (connect(send_socket,
282502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addr,
282602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_res->ai_addrlen) <0){
282702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: send_sctp_rr data socket connect failed");
282802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
282902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
283002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* don't need events for 1-to-1 API with request-response tests */
283202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_enable_events(send_socket, 0);
283302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
283402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set non-blocking if needed */
283502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (non_block) {
283602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       if (!set_nonblock(send_socket)) {
283702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    close(send_socket);
283802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
283902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
284002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
284102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either the */
284302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect would have failed, or the previous response would have */
284402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indicated a problem. I failed to see the value of the extra */
284502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* message after the accept on the remote. If it failed, we'll see it */
284602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here. If it didn't, we might as well start pumping data. */
284702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
284802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a request/response test, they */
284902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can be either time or transaction based. */
285002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
285102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
285202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
285302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
285402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = 0;
285502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
285602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
285702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
285802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
285902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = test_bytes;
286002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
286102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
286202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
286402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
286502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
286602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
286802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
286902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
287002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) || (demo_mode)) {
287102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the */
287202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer, unless we are in demo_mode */
287302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate);
287402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
287502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst;
287602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */
287702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
287802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
287902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "send_sctp_rr: unable to get sigmask errno %d\n",
288002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
288102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
288202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
288302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
288402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
288502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
288602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
288702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
288802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
288902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
289002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. I think I */
289102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* just arbitrarily decrement trans_remaining for the timed test, but */
289202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will not do that just yet... One other question is whether or not */
289302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the send buffer and the receive buffer should be the same buffer. */
289402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
289502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
289602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
289702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int i;
289802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (i = 0; i < first_burst_size; i++) {
289902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 	if((len=sctp_sendmsg(send_socket,
290002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 			     send_ring->buffer_ptr, req_size,
290102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 			     NULL, 0,	/* don't need addrs with 1-to-1 */
290202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 			     0, 0, 0, 0, 0)) != req_size) {
290302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we should never hit the end of the test in the first burst */
290402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_sctp_rr: initial burst data send error");
290502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
290602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
290702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
290802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
290902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
291002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
291102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (trans_remaining > 0)) {
291202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send the request. we assume that if we use a blocking socket, */
291302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the request will be sent at one shot. */
291402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
291502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
291602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* timestamp just before our call to send, and then again just */
291702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* after the receive raj 8/94 */
291802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_one);
291902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
292002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
292102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      while ((len=sctp_sendmsg(send_socket,
292202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       send_ring->buffer_ptr, req_size,
292302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       NULL, 0, /* don't need addrs with 1-to-1 */
292402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			       0, 0, 0, 0, 0)) != req_size) {
292502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (non_block && errno == EAGAIN) {
292602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* try sending again */
292702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    continue;
292802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} else if (SOCKET_EINTR(len) || (errno == 0)) {
292902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we hit the end of a */
293002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* timed test. */
293102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
293202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
293302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
293402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("send_sctp_rr: data send error");
293502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
293602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
293702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
293802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (timed_out) {
293902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we timed out while sending. break out another level */
294002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
294102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
294202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = send_ring->next;
294302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
294402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* receive the response */
294502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsp_bytes_left = rsp_size;
294602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_message_ptr  = recv_ring->buffer_ptr;
294702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      do {
294802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	msg_flags = 0;
294902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((rsp_bytes_recvd=sctp_recvmsg(send_socket,
295002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					 temp_message_ptr, rsp_bytes_left,
295102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					 NULL, 0,
295202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					 NULL, &msg_flags)) < 0) {
295302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if (errno == EINTR) {
295402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* We hit the end of a timed test. */
295502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
295602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
295702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  } else if (non_block && errno == EAGAIN) {
295802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      continue;
295902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
296002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_sctp_rr: data recv error");
296102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
296202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
296302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_bytes_left -= rsp_bytes_recvd;
296402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  += rsp_bytes_recvd;
296502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }	while (!(msg_flags & MSG_EOR));
296602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = recv_ring->next;
296802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
296902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (timed_out) {
297002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we may have been in a nested while loop - we need */
297102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* another call to break. */
297202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
297302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
297402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
297502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
297602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_timestamp(&time_two);
297702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      HIST_add(time_hist,delta_micro(&time_one,&time_two));
297802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
297902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
298002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (demo_mode) {
298102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	units_this_tick += 1;
298202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
298302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* in this case, the interval count is the count-down couter */
298402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* to decide to sleep for a little bit */
298502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if ((interval_burst) && (--interval_count == 0)) {
298602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* call sigsuspend and wait for the interval timer to get us */
298702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* out */
298802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug > 1) {
298902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,"about to suspend\n");
299002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
299102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
299202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (sigsuspend(&signal_set) == EFAULT) {
299302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
299402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "send_sctp_rr: fault with signal set!\n");
299502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
299602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
299702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
299802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	interval_count = interval_burst;
299902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
300002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
300102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
300202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nummessages++;
300302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (trans_remaining) {
300402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	trans_remaining--;
300502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
300602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
300702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug > 3) {
300802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if ((nummessages % 100) == 0) {
300902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fprintf(where,
301002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  "Transaction %d completed\n",
301102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  nummessages);
301202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  fflush(where);
301302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
301402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
301502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
301602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
301702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* At this point we used to call shutdown on the data socket to be */
301802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sure all the data was delivered, but this was not germane in a */
301902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* request/response test, and it was causing the tests to "hang" when */
302002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* they were being controlled by time. So, I have replaced this */
302102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* shutdown call with a call to close that can be found later in the */
302202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* procedure. */
302302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
302502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
302602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
302702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
302802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured? how long */
302902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* did we really run? */
303002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
303102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
303202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated CPU utilization. If it wasn't supposed to care, it */
303302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will return obvious values. */
303402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
303502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
303602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
303702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
303802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
303902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
304002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
304102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
304202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: remote error %d",
304302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
304402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
304502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
304602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
304702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
304802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
304902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our throughput was for the test. */
305002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
305202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= nummessages/elapsed_time;
305302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
305402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
305502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
305602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
305702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
305802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
305902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
306002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
306102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization = calc_cpu_util(0.0);
306202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
306302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
306402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
306502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand  = calc_service_demand((double) nummessages*1024,
306602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
306702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
306802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0);
306902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
307002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
307102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
307202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
307302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
307402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
307502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
307602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = sctp_rr_result->cpu_util;
307702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
307802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
307902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
308002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand = calc_service_demand((double) nummessages*1024,
308102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
308202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    remote_cpu_utilization,
308302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    sctp_rr_result->num_cpus);
308402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
308502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
308602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
308702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
308802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
308902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
309002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
309102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
309202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
309302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
309402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
309502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
309602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
309702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
309802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
309902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
310102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
310202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
310302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
310402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
310502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
310602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
310702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
310802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
310902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
311002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
311102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
311402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are now done with the socket, so close it */
311602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(send_socket);
311702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
311802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
311902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
312102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
312202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
312302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
312402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
312502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
312602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
312702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
312802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
312902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
313002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
313102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
313202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
313302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
313402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
313502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
313602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
313702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
313802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
313902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
314002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
314102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
314202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
314402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
314502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(sctp_rr_result->cpu_method);
314602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
314702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
314802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
314902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
315002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
315102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
315202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
315302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
315402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
315502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
315602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
315702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
315802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
315902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
316002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
316102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
316202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
316302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
316402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
316502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
316602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
316702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
316802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
316902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
317002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
317102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
317202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
317302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
317402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
317502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
317602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
317702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
317802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
317902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
318002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
318102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
318202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
318302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
318402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
318502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
318602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
318702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
318802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
318902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
319002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
319102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
319202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
319302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
319402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
319502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
319602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
319702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
319802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
319902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
320002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
320102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
320202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
320302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
320402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
320502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
320602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
320702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
320802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
320902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
321002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
321102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
321202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
321302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
321402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
321502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
321602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
321702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
321802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
321902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
322002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
322102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
322302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
322402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
322502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
322602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
322702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
322802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how to handle the verbose information in the presence of */
322902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence intervals is yet to be determined... raj 11/94 */
323002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
323102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
323202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
323302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
323402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
323502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
323602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
323702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
323802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
323902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
324002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
324102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset);
324202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
324402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
324502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
324602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
324702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
324802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
324902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
325002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
325202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
325402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive (netserver) side of a TCP_RR */
325502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test */
325602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
325702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_sctp_rr()
325802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
325902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
326002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
326102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
326202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
326302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
326402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char local_name[BUFSIZ];
326502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char port_buffer[PORTBUFSIZE];
326602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
326702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in        myaddr_in, peeraddr_in;
326802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	s_listen, s_data;
326902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	addrlen;
327002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
327102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
327202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
327302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
327402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_recvd;
327502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	request_bytes_remaining;
327602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
327702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
327802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
327902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_request_struct	*sctp_rr_request;
328002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_response_struct	*sctp_rr_response;
328102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_results_struct	*sctp_rr_results;
328202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
328302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_request =
328402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_request_struct *)netperf_request.content.test_specific_data;
328502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response =
328602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_response_struct *)netperf_response.content.test_specific_data;
328702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results =
328802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_results_struct *)netperf_response.content.test_specific_data;
328902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
329002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
329102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_sctp_rr: entered...\n");
329202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
329302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
329402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
329502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
329602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
329702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
329802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
329902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
330002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
330102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
330202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
330402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
330502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
330602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
330702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
330802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
330902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr: setting the response type...\n");
331002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
331102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
331202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
331302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = SCTP_RR_RESPONSE;
331402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
331502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
331602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr: the response type is set...\n");
331702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
331802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
331902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
332002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* allocate the recv and send rings with the requested alignments */
332102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and offsets. raj 7/94 */
332202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
332302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr: requested recv alignment of %d offset %d\n",
332402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_rr_request->recv_alignment,
332502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_rr_request->recv_offset);
332602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr: requested send alignment of %d offset %d\n",
332702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_rr_request->send_alignment,
332802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_rr_request->send_offset);
332902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
333002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
333102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
333202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at some point, these need to come to us from the remote system */
333302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
333402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
333502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
333602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
333702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->response_size,
333802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->send_alignment,
333902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->send_offset);
334002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
334202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->request_size,
334302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->recv_alignment,
334402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->recv_offset);
334502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
334802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
334902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
335002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr: grabbing a socket...\n");
335102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
335202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
335302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
335402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
335502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
335602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
335702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
335802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = sctp_rr_request->send_buf_size;
335902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = sctp_rr_request->recv_buf_size;
336002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = sctp_rr_request->no_delay;
336102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = sctp_rr_request->so_rcvavoid;
336202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = sctp_rr_request->so_sndavoid;
336302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  non_block = sctp_rr_request->non_blocking;
336402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
336502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
336602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			port_buffer,
336702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(sctp_rr_request->ipfamily),
336802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			sctp_rr_request->port);
336902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
337102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
337202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
337302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(sctp_rr_request->ipfamily),
337402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_STREAM,
337502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_SCTP,
337602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
337702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
337802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_listen = create_data_socket(local_res);
337902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_listen < 0) {
338102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
338202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
338302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
338502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
338602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
338702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
338802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_listen, 5) == -1) {
338902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
339002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
339102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
339202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
339402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
339502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
339702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
339802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
339902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_listen,
340002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in, &addrlen) == -1){
340102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
340202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
340302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
340402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
340502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
340602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
340702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
340802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
340902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
341002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
341102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
341202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
341302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
341402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
341502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
341602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
341702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
341802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
341902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
342002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->cpu_rate = (float)0.0; 	/* assume no cpu */
342202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->measure_cpu = 0;
342302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_rr_request->measure_cpu) {
342502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_response->measure_cpu = 1;
342602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_response->cpu_rate = calibrate_local_cpu(sctp_rr_request->cpu_rate);
342702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
342802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
342902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
343002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
343102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
343202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->send_buf_size = lss_size;
343302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->recv_buf_size = lsr_size;
343402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->no_delay = loc_nodelay;
343502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->so_rcvavoid = loc_rcvavoid;
343602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->so_sndavoid = loc_sndavoid;
343702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->test_length = sctp_rr_request->test_length;
343802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
343902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr_in);
344102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((s_data = accept(s_listen,
344302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       (struct sockaddr *)&peeraddr_in,
344402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       &addrlen)) == -1) {
344502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Let's just punt. The remote will be given some information */
344602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_listen);
344702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
344802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
344902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
345002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we do not need events on a 1-to-1 RR test.  The test will finish
345202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * once all transactions are done.
345302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   */
345402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
345502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now that we are connected, mark the socket as non-blocking */
345602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (non_block) {
345702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!set_nonblock(s_data)) {
345802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: set_nonblock");
345902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
346002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
346102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
346202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef KLUDGE_SOCKET_OPTIONS
346402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this is for those systems which *INCORRECTLY* fail to pass */
346502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* attributes across an accept() call. Including this goes against */
346602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* my better judgement :( raj 11/95 */
346702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
346802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kludge_socket_options(s_data);
346902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
347002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* KLUDGE_SOCKET_OPTIONS */
347102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
347202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
347302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr: accept completes on the data connection.\n");
347402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
347502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
347602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
347702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
347802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
347902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(sctp_rr_request->measure_cpu);
348102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when we hit the end of the test time, or when */
348302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have exchanged the requested number of transactions. */
348402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
348502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_rr_request->test_length > 0) {
348602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
348702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
348802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(sctp_rr_request->test_length + PAD_TIME);
348902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
349002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
349102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
349202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = sctp_rr_request->test_length * -1;
349302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
349402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
349602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
349702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
349802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    int msg_flags = 0;
349902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
350002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_message_ptr = recv_ring->buffer_ptr;
350102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    request_bytes_remaining = sctp_rr_request->request_size;
350202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while(!(msg_flags & MSG_EOR)) {
350302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((request_bytes_recvd=sctp_recvmsg(s_data,
350402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					temp_message_ptr,
350502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					request_bytes_remaining,
350602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					NULL, 0,
350702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					NULL, &msg_flags)) < 0) {
350802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (errno == EINTR) {
350902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* the timer popped */
351002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
351102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
351202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} else if (non_block && errno == EAGAIN) {
351302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    continue;  /* while request_bytes_remaining */
351402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
351502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = errno;
351602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
351702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
351802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
351902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      request_bytes_remaining -= request_bytes_recvd;
352002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_message_ptr += request_bytes_recvd;
352102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
352202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
352302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
352402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
352502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
352602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
352702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
352802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
352902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo55\n");
353002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
353102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
353202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
353302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
353402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
353602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote
353702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * In 1-to-1 API destination addr is not needed.
353802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     */
353902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((bytes_sent=sctp_sendmsg(s_data,
354002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    send_ring->buffer_ptr,
354102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    sctp_rr_request->response_size,
354202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    NULL, 0,
354302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    0, 0, 0, 0, 0)) == -1) {
354402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (errno == EINTR) {
354502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
354602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
354702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
354802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      } else if (non_block && errno == EAGAIN) {
354902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 continue;
355002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
355102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
355202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 982;
355302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
355402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
355502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
355602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
355702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
355802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
355902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
356002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
356102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo6\n");
356202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
356302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
356402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
356502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
356602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
356802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
356902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
357002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
357102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
357202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
357302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
357402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
357702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
357802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
357902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(sctp_rr_request->measure_cpu,&elapsed_time);
358002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  stop_timer();
358202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
358302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
358402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
358502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
358602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
358702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
358802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
358902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
359002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
359102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
359202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
359302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
359402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_rr: got %d transactions\n",
359502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
359602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
359702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
359802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
359902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->bytes_received = (trans_received *
360002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    (sctp_rr_request->request_size +
360102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     sctp_rr_request->response_size));
360202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->trans_received = trans_received;
360302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->elapsed_time   = elapsed_time;
360402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->cpu_method     = cpu_method;
360502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->num_cpus       = lib_num_loc_cpus;
360602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_rr_request->measure_cpu) {
360702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
360802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
360902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
361102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
361202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_rr: test complete, sending results.\n");
361302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
361402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
361502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
361702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
361802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
361902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_data);
362002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_listen);
362102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
362302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* this routine implements the sending (netperf) side of the
362702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   SCTP_RR_1TOMANY test */
362802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
362902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
363002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsend_sctp_rr_1toMany(remote_host)
363102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     char	remote_host[];
363202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
363302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
363402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_title = "\
363502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
363602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request  Resp.   Elapsed  Trans.\n\
363702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size     Size    Time     Rate         \n\
363802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  Bytes  bytes    bytes   secs.    per sec   \n\n";
363902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_0 =
364102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%7.2f\n";
364202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_1 = "\
364402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d   %-6d  %-6.2f   %7.2f   \n";
364502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *tput_fmt_1_line_2 = "\
364602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
364702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
364802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_title = "\
364902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal /Remote\n\
365002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSocket Size   Request Resp.  Elapsed Trans.   CPU    CPU    S.dem   S.dem\n\
365102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv   Size    Size   Time    Rate     local  remote local   remote\n\
365202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbytes  bytes  bytes   bytes  secs.   per sec  %% %c    %% %c    us/Tr   us/Tr\n\n";
365302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
365402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_0 =
365502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    "%6.3f %c\n";
365602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
365702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_1 = "\
365802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d %-6d  %-6d %-6.2f  %-6.2f  %-6.2f %-6.2f %-6.3f  %-6.3f\n";
365902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *cpu_fmt_1_line_2 = "\
366102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%-6d %-6d\n";
366202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char *ksink_fmt = "\
366402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectAlignment      Offset\n\
366502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectLocal  Remote  Local  Remote\n\
366602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source ProjectSend   Recv    Send   Recv\n\
366702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project%5d  %5d   %5d  %5d\n";
366802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
366902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
367002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int			timed_out = 0;
367102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float			elapsed_time;
367202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
367302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	len, j = 0;
367402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
367502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	nummessages;
367602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	*send_socket;
367702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
367802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	bytes_xferd;
367902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int   msg_flags = 0;
368002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
368102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
368202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
368302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
368402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_left;
368502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	rsp_bytes_recvd;
368602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
368702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_cpu_utilization;
368802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	local_service_demand;
368902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_cpu_utilization;
369002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	remote_service_demand;
369102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  double	thruput;
369202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage peer;
369402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
369502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *remote_res;
369602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
369702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_request_struct	*sctp_rr_request;
369802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_response_struct	*sctp_rr_response;
369902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_results_struct	*sctp_rr_result;
370002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
370202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	interval_count;
370302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sigset_t signal_set;
370402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
370502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
370602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_request =
370702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_request_struct *)netperf_request.content.test_specific_data;
370802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response =
370902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_response_struct *)netperf_response.content.test_specific_data;
371002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_result =
371102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_results_struct *)netperf_response.content.test_specific_data;
371202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
371402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  time_hist = HIST_new();
371502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
371602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
371702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are now disconnected from the code that established the */
371802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* control socket, and since we want to be able to use different */
371902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* protocols and such, we are passed the name of the remote host and */
372002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* must turn that into the test specific addressing information. */
372102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  complete_addrinfos(&remote_res,
372302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     &local_res,
372402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     remote_host,
372502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     SOCK_SEQPACKET,
372602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     IPPROTO_SCTP,
372702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     0);
372802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
372902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ( print_headers ) {
373002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    print_top_test_header("SCTP 1-TO-MANY REQUEST/RESPONSE TEST",local_res,remote_res);
373102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
373202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
373302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* initialize a few counters */
373402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
373502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = NULL;
373602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = NULL;
373702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  confidence_iteration = 1;
373802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  init_stat();
373902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
374002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_socket = malloc(sizeof(int) * num_associations);
374102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_socket == NULL) {
374202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
374302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "Could not create the socket array for %d associations",
374402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      num_associations);
374502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
374602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
374702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
374802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
374902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have a great-big while loop which controls the number of times */
375002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we run a particular test. this is for the calculation of a */
375102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence interval (I really should have stayed awake during */
375202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probstats :). If the user did not request confidence measurement */
375302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* (no confidence is the default) then we will only go though the */
375402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* loop once. the confidence stuff originates from the folks at IBM */
375502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
375602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while (((confidence < 0) && (confidence_iteration < iteration_max)) ||
375702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 (confidence_iteration <= iteration_min)) {
375802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
375902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* initialize a few counters. we have to remember that we might be */
376002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* going through the loop more than once. */
376102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
376202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nummessages     = 0;
376302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd     = 0.0;
376402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up        = 0;
376502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    timed_out       = 0;
376602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
376702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
376802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* set-up the data buffers with the requested alignment and offset. */
376902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* since this is a request/response test, default the send_width and */
377002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* recv_width to 1 and not two raj 7/94 */
377102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
377202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_width == 0) send_width = 1;
377302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_width == 0) recv_width = 1;
377402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
377502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (send_ring == NULL) {
377602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_ring = allocate_buffer_ring(send_width,
377702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       req_size,
377802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_align,
377902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_send_offset);
378002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
378102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
378202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (recv_ring == NULL) {
378302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_ring = allocate_buffer_ring(recv_width,
378402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       rsp_size,
378502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_align,
378602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				       local_recv_offset);
378702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
378802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
378902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* If the user has requested cpu utilization measurements, we must */
379002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate the cpu(s). We will perform this task within the tests */
379102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* themselves. If the user has specified the cpu rate, then */
379202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calibrate_local_cpu will return rather quickly as it will have */
379302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* nothing to do. If local_cpu_rate is zero, then we will go through */
379402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the "normal" calibration stuff and return the rate back.*/
379502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
379602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage) {
379702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_rate = calibrate_local_cpu(local_cpu_rate);
379802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
379902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
380002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Tell the remote end to do a listen. The server alters the socket */
380102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* paramters on the other side at this point, hence the reason for */
380202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the values being passed in the setup message. If the user did */
380302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* not specify any of the parameters, they will be passed as 0, which */
380402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will indicate to the remote that no changes beyond the system's */
380502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default should be used. Alignment is the exception, it will */
380602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* default to 8, which will be no alignment alterations. */
380702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
380802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_request.content.request_type =	DO_SCTP_RR_MANY;
380902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->recv_buf_size     =	rsr_size_req;
381002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->send_buf_size     =	rss_size_req;
381102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->recv_alignment    =	remote_recv_align;
381202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->recv_offset       =	remote_recv_offset;
381302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->send_alignment    =	remote_send_align;
381402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->send_offset       =	remote_send_offset;
381502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->request_size      =	req_size;
381602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->response_size     =	rsp_size;
381702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->no_delay	       =	rem_nodelay;
381802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->measure_cpu       =	remote_cpu_usage;
381902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->cpu_rate	       =	remote_cpu_rate;
382002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->so_rcvavoid       =	rem_rcvavoid;
382102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->so_sndavoid       =	rem_sndavoid;
382202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
382302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_rr_request->test_length     =	test_time;
382402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
382502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
382602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_rr_request->test_length     =	test_trans * num_associations
382702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						* -1;
382802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
382902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->non_blocking      = 	non_block;
383002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->port              =       atoi(remote_data_port);
383102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_request->ipfamily          =       af_to_nf(remote_res->ai_family);
383202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug > 1) {
383302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: send_sctp_rr_1toMany: requesting SCTP rr test\n");
383402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
383502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
383602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_request();
383702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
383802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The response from the remote will contain all of the relevant 	*/
383902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* socket parameters for this test type. We will put them back into */
384002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the variables here so they can be displayed if desired.  The	*/
384102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* remote will have calibrated CPU if necessary, and will have done	*/
384202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* all the needed set-up we will have calibrated the cpu locally	*/
384302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* before sending the request, and will grab the counter value right*/
384402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the connect returns. The remote will grab the counter right*/
384502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* after the accept call. This saves the hassle of extra messages	*/
384602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* being sent for the sctp tests.					*/
384702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
384802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
384902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
385002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
385102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rsr_size          = sctp_rr_response->recv_buf_size;
385202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rss_size          = sctp_rr_response->send_buf_size;
385302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay       = sctp_rr_response->no_delay;
385402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_usage  = sctp_rr_response->measure_cpu;
385502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_rate   = sctp_rr_response->cpu_rate;
385602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* make sure that port numbers are in network order */
385702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      set_port_number(remote_res,
385802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      (unsigned short)sctp_rr_response->data_port_number);
385902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
386002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
386102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
386202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
386302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "netperf: remote error %d",
386402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
386502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
386602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
386702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
386802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
386902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
387002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
387102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /*set up the data socket list  */
387202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (j = 0; j < num_associations; j++) {
387302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_socket[j] = create_data_socket(local_res);
387402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
387502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (send_socket < 0){
387602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("netperf: send_sctp_rr_1toMany: sctp stream data socket");
387702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
387802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
387902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
388002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /*Connect up to the remote port on the data socket  */
388102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (connect(send_socket[j],
388202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  remote_res->ai_addr,
388302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  remote_res->ai_addrlen) < 0){
388402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	perror("netperf: data socket connect failed");
388502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
388602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
388702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
388802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
388902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The client end of the 1-to-Many test uses 1-to-1 sockets.
389002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * it doesn't need events.
389102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       */
389202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sctp_enable_events(send_socket[j], 0);
389302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
389402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (non_block) {
389502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        if (!set_nonblock(send_socket[j])) {
389602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  close(send_socket[j]);
389702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
389802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
389902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
390002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
390102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Data Socket set-up is finished. If there were problems, either the */
390302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* connect would have failed, or the previous response would have */
390402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* indicated a problem. I failed to see the value of the extra */
390502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* message after the accept on the remote. If it failed, we'll see it */
390602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* here. If it didn't, we might as well start pumping data. */
390702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
390802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Set-up the test end conditions. For a request/response test, they */
390902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* can be either time or transaction based. */
391002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
391102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (test_time) {
391202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The user wanted to end the test after a period of time. */
391302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 0;
391402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = 0;
391502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_timer(test_time);
391602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
391702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
391802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* The tester wanted to send a number of bytes. */
391902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining = test_bytes * num_associations;
392002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      times_up = 1;
392102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
392202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
392302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The cpu_start routine will grab the current time and possibly */
392402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* value of the idle counter for later use in measuring cpu */
392502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* utilization and/or service demand and thruput. */
392602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
392702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_start(local_cpu_usage);
392802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
392902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_INTERVALS
393002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((interval_burst) || (demo_mode)) {
393102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* zero means that we never pause, so we never should need the */
393202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* interval timer, unless we are in demo_mode */
393302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      start_itimer(interval_wate);
393402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
393502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interval_count = interval_burst;
393602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* get the signal set for the call to sigsuspend */
393702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &signal_set) != 0) {
393802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
393902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "send_sctp_rr_1toMany: unable to get sigmask errno %d\n",
394002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno);
394102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
394202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
394302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
394402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_INTERVALS */
394502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
394602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We use an "OR" to control test execution. When the test is */
394702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* controlled by time, the byte count check will always return false. */
394802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* When the test is controlled by byte count, the time test will */
394902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* always return false. When the test is finished, the whole */
395002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* expression will go false and we will stop sending data. I think I */
395102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* just arbitrarily decrement trans_remaining for the timed test, but */
395202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will not do that just yet... One other question is whether or not */
395302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the send buffer and the receive buffer should be the same buffer. */
395402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
395502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
395602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    {
395702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int i;
395802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (j = 0; j < num_associations; j++) {
395902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  for (i = 0; i < first_burst_size; i++) {
396002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if((len=sctp_sendmsg(send_socket[j],
396102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 send_ring->buffer_ptr, send_size,
396202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_res->ai_addr,
396302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_res->ai_addrlen,
396402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 0, 0, 0, 0, 0)) != req_size) {
396502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* we should never hit the end of the test in the first burst */
396602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      perror("send_sctp_rr_1toMany: initial burst data send error");
396702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      exit(1);
396802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
396902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
397002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
397102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
397202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
397302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((!times_up) || (trans_remaining > 0)) {
397502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* send the request. we assume that if we use a blocking socket, */
397602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the request will be sent at one shot. */
397702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
397802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* this is a fairly poor way of testing 1toMany connections.
397902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * For each association we measure round trip time to account for
398002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * any delay in lookups and delivery.  To stress the server a bit
398102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * more we would need a distributed client test, or at least multiple
398202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * processes.  I want to force as much paralellism as possible, but
398302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * this will do for the fist take. vlad
398402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       */
398502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (j = 0; j < num_associations; j++) {
398602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
398702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* timestamp just before our call to send, and then again just */
398802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* after the receive raj 8/94 */
398902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	gettimeofday(&time_one,NULL);
399002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
399102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
399202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	while ((len=sctp_sendmsg(send_socket[j],
399302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 send_ring->buffer_ptr, send_size,
399402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 remote_res->ai_addr,
399502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 remote_res->ai_addrlen,
399602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				 0, 0, 0, 0, 0)) != req_size) {
399702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if (non_block && errno == EAGAIN) {
399802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* try sending again */
399902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    continue;
400002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  } else if ((errno == EINTR) || (errno == 0)) {
400102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* we hit the end of a */
400202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* timed test. */
400302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    timed_out = 1;
400402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    break;
400502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
400602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  perror("send_sctp_rr_1toMany: data send error");
400702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
400802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
400902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
401002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (timed_out) {
401102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we may have been in a nested while loop - we need */
401202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* another call to break. */
401302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
401402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
401502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
401602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* setup for the next time */
401702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_ring = send_ring->next;
401802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
401902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_bytes_left = rsp_size;
402002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	temp_message_ptr  = recv_ring->buffer_ptr;
402102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	while (!(msg_flags & MSG_EOR)) {
402202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if((rsp_bytes_recvd = sctp_recvmsg(send_socket[j],
402302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     temp_message_ptr,
402402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     rsp_bytes_left,
402502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     NULL, 0,
402602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     NULL, &msg_flags)) < 0) {
402702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    if (errno == EINTR) {
402802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      /* We hit the end of a timed test. */
402902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      timed_out = 1;
403002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      break;
403102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    } else if (non_block && errno == EAGAIN) {
403202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      continue;
403302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    }
403402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    perror("send_sctp_rr_1toMany: data recv error");
403502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    exit(1);
403602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
403702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  rsp_bytes_left -= rsp_bytes_recvd;
403802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  temp_message_ptr  += rsp_bytes_recvd;
403902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
404002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	recv_ring = recv_ring->next;
404102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
404202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (timed_out) {
404302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* we may have been in a nested while loop - we need */
404402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* another call to break. */
404502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
404602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
404702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
404802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
404902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	gettimeofday(&time_two,NULL);
405002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	HIST_add(time_hist,delta_micro(&time_one,&time_two));
405102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
405202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
405302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	nummessages++;
405402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (trans_remaining) {
405502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  trans_remaining--;
405602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
405702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
405802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (debug > 3) {
405902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  if ((nummessages % 100) == 0) {
406002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fprintf(where,
406102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    "Transaction %d completed\n",
406202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		    nummessages);
406302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    fflush(where);
406402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  }
406502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
406602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
406702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
406802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
406902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* At this point we used to call shutdown on the data socket to be */
407002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* sure all the data was delivered, but this was not germane in a */
407102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* request/response test, and it was causing the tests to "hang" when */
407202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* they were being controlled by time. So, I have replaced this */
407302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* shutdown call with a call to close that can be found later in the */
407402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* procedure. */
407502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
407602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this call will always give us the elapsed time for the test, and */
407702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will also store-away the necessaries for cpu utilization */
407802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
407902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    cpu_stop(local_cpu_usage,&elapsed_time);	/* was cpu being */
408002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* measured? how long */
408102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						/* did we really run? */
408202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
408302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Get the statistics from the remote end. The remote will have */
408402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* calculated CPU utilization. If it wasn't supposed to care, it */
408502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* will return obvious values. */
408602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
408702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_response();
408802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!netperf_response.content.serv_errno) {
408902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug)
409002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"remote results obtained\n");
409102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
409202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
409302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      Set_errno(netperf_response.content.serv_errno);
409402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"netperf: remote error %d",
409502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      netperf_response.content.serv_errno);
409602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("");
409702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
409802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
409902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
410002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
410102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* We now calculate what our throughput was for the test. */
410202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
410302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    bytes_xferd	= (req_size * nummessages) + (rsp_size * nummessages);
410402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    thruput	= nummessages/elapsed_time;
410502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
410602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (local_cpu_usage || remote_cpu_usage) {
410702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* We must now do a little math for service demand and cpu */
410802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* utilization for the system(s) */
410902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* Of course, some of the information might be bogus because */
411002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* there was no idle counter in the kernel(s). We need to make */
411102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* a note of this for the user's benefit...*/
411202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
411302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization = calc_cpu_util(0.0);
411402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
411502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
411602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
411702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand  = calc_service_demand((double) nummessages*1024,
411802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
411902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
412002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0);
412102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
412202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
412302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_cpu_utilization	= (float) -1.0;
412402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_service_demand	= (float) -1.0;
412502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
412602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
412702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (remote_cpu_usage) {
412802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = sctp_rr_result->cpu_util;
412902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* since calc_service demand is doing ms/Kunit we will */
413002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* multiply the number of transaction by 1024 to get */
413102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* "good" numbers */
413202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand = calc_service_demand((double) nummessages*1024,
413302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    0.0,
413402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    remote_cpu_utilization,
413502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project						    sctp_rr_result->num_cpus);
413602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
413702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
413802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_cpu_utilization = (float) -1.0;
413902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_service_demand  = (float) -1.0;
414002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
414102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
414202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
414302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
414402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we were not measuring cpu, for the confidence stuff, we */
414502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* should make it -1.0 */
414602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_cpu_utilization	= (float) -1.0;
414702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_service_demand	= (float) -1.0;
414802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_cpu_utilization = (float) -1.0;
414902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_service_demand  = (float) -1.0;
415002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
415102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
415202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* at this point, we want to calculate the confidence information. */
415302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* if debugging is on, calculate_confidence will print-out the */
415402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* parameters we pass it */
415502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
415602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    calculate_confidence(confidence_iteration,
415702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 elapsed_time,
415802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 thruput,
415902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_cpu_utilization,
416002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_cpu_utilization,
416102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 local_service_demand,
416202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			 remote_service_demand);
416302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
416402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
416502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    confidence_iteration++;
416602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
416702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we are now done with the socket, so close it */
416802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (j = 0; j < num_associations; j++)
416902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	close(send_socket[j]);
417002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
417102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
417202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  retrieve_confident_values(&elapsed_time,
417302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &thruput,
417402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_cpu_utilization,
417502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_cpu_utilization,
417602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &local_service_demand,
417702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			    &remote_service_demand);
417802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
417902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We are now ready to print all the information. If the user */
418002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* has specified zero-level verbosity, we will just print the */
418102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* local service demand, or the remote service demand. If the */
418202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* user has requested verbosity level 1, he will get the basic */
418302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "streamperf" numbers. If the user has specified a verbosity */
418402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* of greater than 1, we will display a veritable plethora of */
418502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* background information from outside of this block as it it */
418602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* not cpu_measurement specific...  */
418702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
418802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (confidence < 0) {
418902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we did not hit confidence, but were we asked to look for it? */
419002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (iteration_max > 1) {
419102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      display_confidence();
419202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
419302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
419402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
419502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (local_cpu_usage || remote_cpu_usage) {
419602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_cpu_method = format_cpu_method(cpu_method);
419702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    remote_cpu_method = format_cpu_method(sctp_rr_result->cpu_method);
419802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
419902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
420002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
420102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_cpu_usage) {
420202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
420302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
420402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_service_demand,
420502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method);
420602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
420702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
420802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
420902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_fmt_0,
421002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_service_demand,
421102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
421202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
421302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
421402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
421502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
421602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
421702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
421802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		cpu_title,
421902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		local_cpu_method,
422002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		remote_cpu_method);
422102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
422202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
422302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
422402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_1,		/* the format string */
422502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,		/* local sendbuf size */
422602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
422702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
422802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* guess */
422902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time,		/* how long was the test */
423002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput,
423102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_cpu_utilization,	/* local cpu */
423202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_cpu_utilization,	/* remote cpu */
423302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      local_service_demand,	/* local service demand */
423402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      remote_service_demand);	/* remote service demand */
423502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
423602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      cpu_fmt_1_line_2,
423702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size,
423802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
423902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
424002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
424102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
424202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
424302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The tester did not wish to measure service demand. */
424402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
424502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (verbosity) {
424602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
424702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
424802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_0,
424902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
425002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
425102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 1:
425202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 2:
425302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (print_headers) {
425402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,tput_title,format_units());
425502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
425602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
425702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
425802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_1,	/* the format string */
425902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lss_size,
426002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lsr_size,
426102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      req_size,		/* how large were the requests */
426202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsp_size,		/* how large were the responses */
426302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      elapsed_time, 		/* how long did it take */
426402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      thruput);
426502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
426602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      tput_fmt_1_line_2,
426702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rss_size, 		/* remote recvbuf size */
426802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      rsr_size);
426902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
427002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
427102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
427202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
427302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
427402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would be a good thing to include information about some of the */
427502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* other parameters that may have been set for this test, but at the */
427602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* moment, I do not wish to figure-out all the  formatting, so I will */
427702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just put this comment here to help remind me that it is something */
427802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* that should be done at a later time. */
427902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
428002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* how to handle the verbose information in the presence of */
428102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* confidence intervals is yet to be determined... raj 11/94 */
428202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (verbosity > 1) {
428302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* The user wanted to know it all, so we will give it to him. */
428402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* This information will include as much as we can find about */
428502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* TCP statistics, the alignments of the sends and receives */
428602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and all that sort of rot... */
428702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
428802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
428902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ksink_fmt,
429002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_align,
429102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset,
429202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    local_send_offset,
429302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    remote_recv_offset);
429402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
429502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_HISTOGRAM
429602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\nHistogram of request/response times\n");
429702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
429802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    HIST_report(time_hist);
429902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_HISTOGRAM */
430002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
430102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
430202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
430302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
430402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
430502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
430602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine implements the receive (netserver) side of a TCP_RR */
430702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* test */
430802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
430902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectrecv_sctp_rr_1toMany()
431002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
431102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
431202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *send_ring;
431302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct ring_elt *recv_ring;
431402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
431502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
431602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_in        myaddr_in; 	/* needed to get the port number */
431702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct sockaddr_storage   peeraddr;   /* to communicate with peer */
431802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct addrinfo *local_res;
431902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char   local_name[BUFSIZ];
432002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char   port_buffer[PORTBUFSIZE];
432102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int    msg_flags;
432202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
432302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	s_rcv;
432402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int 	addrlen;
432502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char	*temp_message_ptr;
432602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_received;
432702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	trans_remaining;
432802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_sent;
432902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	bytes_recvd;
433002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	recv_buf_size;
433102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int	timed_out = 0;
433202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float	elapsed_time;
433302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
433402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_request_struct	*sctp_rr_request;
433502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_response_struct	*sctp_rr_response;
433602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct	sctp_rr_results_struct	*sctp_rr_results;
433702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
433802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_request =
433902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_request_struct *)netperf_request.content.test_specific_data;
434002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response =
434102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_response_struct *)netperf_response.content.test_specific_data;
434202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results =
434302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    (struct sctp_rr_results_struct *)netperf_response.content.test_specific_data;
434402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
434502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
434602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"netserver: recv_sctp_rr_1toMany: entered...\n");
434702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
434802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
434902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
435002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* We want to set-up the listen socket with all the desired */
435102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* parameters and then let the initiator know that all is ready. If */
435202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket size defaults are to be used, then the initiator will have */
435302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* sent us 0's. If the socket sizes cannot be changed, then we will */
435402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send-back what they are. If that information cannot be determined, */
435502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we send-back -1's for the sizes. If things go wrong for any */
435602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reason, we will drop back ten yards and punt. */
435702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
435802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* If anything goes wrong, we want the remote to know about it. It */
435902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* would be best if the error that the remote reports to the user is */
436002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual error we encountered, rather than some bogus unexpected */
436102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* response type message. */
436202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
436302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
436402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr_1toMany: setting the response type...\n");
436502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
436602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
436702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
436802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.response_type = SCTP_RR_MANY_RESPONSE;
436902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
437002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
437102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr_1toMany: the response type is set...\n");
437202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
437302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
437402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
437502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* allocate the recv and send rings with the requested alignments */
437602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* and offsets. raj 7/94 */
437702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
437802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr_1toMany: requested recv alignment of %d offset %d\n",
437902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_rr_request->recv_alignment,
438002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_rr_request->recv_offset);
438102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr_1toMany: requested send alignment of %d offset %d\n",
438202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_rr_request->send_alignment,
438302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    sctp_rr_request->send_offset);
438402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
438502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
438602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
438702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* at some point, these need to come to us from the remote system */
438802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (send_width == 0) send_width = 1;
438902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (recv_width == 0) recv_width = 1;
439002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
439102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_ring = allocate_buffer_ring(send_width,
439202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->response_size,
439302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->send_alignment,
439402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->send_offset);
439502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
439602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  recv_ring = allocate_buffer_ring(recv_width,
439702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->request_size,
439802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->recv_alignment,
439902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				   sctp_rr_request->recv_offset);
440002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
440102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
440202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* create_data_socket expects to find some things in the global */
440302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* variables, so set the globals based on the values in the request. */
440402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* once the socket has been created, we will set the response values */
440502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* based on the updated value of those globals. raj 7/94 */
440602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lss_size_req = sctp_rr_request->send_buf_size;
440702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lsr_size_req = sctp_rr_request->recv_buf_size;
440802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_nodelay = sctp_rr_request->no_delay;
440902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_rcvavoid = sctp_rr_request->so_rcvavoid;
441002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  loc_sndavoid = sctp_rr_request->so_sndavoid;
441102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  non_block = sctp_rr_request->non_blocking;
441202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
441302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  set_hostname_and_port(local_name,
441402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		        port_buffer,
441502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			nf_to_af(sctp_rr_request->ipfamily),
441602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			sctp_rr_request->port);
441702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
441802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_res = complete_addrinfo(local_name,
441902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				local_name,
442002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				port_buffer,
442102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				nf_to_af(sctp_rr_request->ipfamily),
442202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				SOCK_SEQPACKET,
442302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				IPPROTO_SCTP,
442402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				0);
442502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
442602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Grab a socket to listen on, and then listen on it. */
442702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
442802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"recv_sctp_rr_1toMany: grabbing a socket...\n");
442902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
443002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
443102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
443202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  s_rcv = create_data_socket(local_res);
443302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
443402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (s_rcv < 0) {
443502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
443602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
443702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
443802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
443902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
444002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
444102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now, let's set-up the socket to listen for connections */
444202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (listen(s_rcv, 5) == -1) {
444302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
444402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_rcv);
444502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
444602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
444702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
444802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
444902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
445002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
445102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now get the port number assigned by the system  */
445202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(myaddr_in);
445302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (getsockname(s_rcv,
445402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		  (struct sockaddr *)&myaddr_in, &addrlen) == -1){
445502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    netperf_response.content.serv_errno = errno;
445602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    close(s_rcv);
445702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_response();
445802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
445902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
446002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
446102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
446202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now myaddr_in contains the port and the internet address this is */
446302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* returned to the sender also implicitly telling the sender that the */
446402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* socket buffer sizing has been done. */
446502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
446602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->data_port_number = (int) ntohs(myaddr_in.sin_port);
446702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  netperf_response.content.serv_errno   = 0;
446802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
446902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* But wait, there's more. If the initiator wanted cpu measurements, */
447002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* then we must call the calibrate routine, which will return the max */
447102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rate back to the initiator. If the CPU was not to be measured, or */
447202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* something went wrong with the calibration, we will return a 0.0 to */
447302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the initiator. */
447402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
447502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->cpu_rate = (float)0.0; 	/* assume no cpu */
447602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->measure_cpu = 0;
447702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
447802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_rr_request->measure_cpu) {
447902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_response->measure_cpu = 1;
448002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_response->cpu_rate = calibrate_local_cpu(sctp_rr_request->cpu_rate);
448102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
448202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
448302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
448402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* before we send the response back to the initiator, pull some of */
448502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the socket parms from the globals */
448602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->send_buf_size = lss_size;
448702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->recv_buf_size = lsr_size;
448802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->no_delay = loc_nodelay;
448902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->so_rcvavoid = loc_rcvavoid;
449002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->so_sndavoid = loc_sndavoid;
449102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_response->test_length = sctp_rr_request->test_length;
449202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
449302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
449402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Don't need events */
449502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_enable_events(s_rcv, 0);
449602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
449702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now that we are connected, mark the socket as non-blocking */
449802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (non_block) {
449902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!set_nonblock(s_rcv)) {
450002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: set_nonblock");
450102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
450202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
450302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
450402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
450502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* FIXME:  The way 1-to-Many test operates right now, we are including
450602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * association setup time into our measurements.  The reason for this
450702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * is that the client creates multiple endpoints and connects each
450802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * endpoint to us using the connect call.  On this end we simply call
450902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * recvmsg() to get data becuase there is no equivalen of accept() for
451002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * 1-to-Many API.
451102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * I think this is OK, but if it were to be fixed, the server side
451202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * would need to know how many associations are being setup and
451302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * have a recvmsg() loop with SCTP_ASSOC_CHANGE events waiting for
451402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * all the associations to be be established.
451502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   * I am punting on this for now.
451602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   */
451702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
451802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
451902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  addrlen = sizeof(peeraddr);
452002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
452102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Now it's time to start receiving data on the connection. We will */
452202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first grab the apropriate counters and then start grabbing. */
452302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
452402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_start(sctp_rr_request->measure_cpu);
452502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
452602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop will exit when we hit the end of the test time, or when */
452702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we have exchanged the requested number of transactions. */
452802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
452902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_rr_request->test_length > 0) {
453002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 0;
453102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = 0;
453202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_timer(sctp_rr_request->test_length + PAD_TIME);
453302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
453402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
453502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    times_up = 1;
453602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_remaining = sctp_rr_request->test_length * -1;
453702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
453802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
453902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  trans_received = 0;
454002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
454102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((!times_up) || (trans_remaining > 0)) {
454202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
454302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_buf_size = sctp_rr_request->request_size;
454402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
454502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Receive the data.  We don't particularly care which association
454602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * the data came in on.  We'll simply be doing a receive untill
454702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * we get and MSG_EOR flag (meaning that a single transmission was
454802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * received) and a send to the same address, so the RR would be for
454902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * the same associations.
455002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * We can get away with this because the client will establish all
455102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * the associations before transmitting any data.  Any partial data
455202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * will not have EOR thus will we will not send a response untill
455302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     * we get everything.
455402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     */
455502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
455602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    do {
455702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      msg_flags = 0;
455802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if((bytes_recvd = sctp_recvmsg(s_rcv,
455902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     recv_ring->buffer_ptr,
456002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     recv_buf_size,
456102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     (struct sockaddr *)&peeraddr, &addrlen,
456202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     0, &msg_flags)) == SOCKET_ERROR) {
456302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (SOCKET_EINTR(bytes_recvd)) {
456402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* the timer popped */
456502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  timed_out = 1;
456602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  break;
456702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	} else if (non_block & errno == EAGAIN) {
456802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    /* do recvmsg again */
456902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    continue;
457002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
457102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	netperf_response.content.serv_errno = errno;
457202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_response();
457302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(1);
457402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
457502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    } while(!(msg_flags & MSG_EOR));
457602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
457702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    recv_ring = recv_ring->next;
457802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
457902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
458002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
458102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
458202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
458302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo5\n");
458402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
458502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
458602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
458702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
458802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
458902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* Now, send the response to the remote */
459002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    while ((bytes_sent=sctp_sendmsg(s_rcv,
459102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      send_ring->buffer_ptr,
459202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      sctp_rr_request->response_size,
459302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      (struct sockaddr *)&peeraddr, addrlen,
459402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      0, 0, 0, 0, 0)) == SOCKET_ERROR) {
459502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (SOCKET_EINTR(bytes_sent)) {
459602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* the test timer has popped */
459702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	timed_out = 1;
459802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
459902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      } else if (non_block && errno == EAGAIN) {
460002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 continue;
460102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
460202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
460302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      netperf_response.content.serv_errno = 992;
460402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_response();
460502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
460602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
460702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
460802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (timed_out) {
460902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
461002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,"yo6\n");
461102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
461202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
461302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we hit the end of the test based on time - lets */
461402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* bail out of here now... */
461502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
461602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
461702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
461802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    send_ring = send_ring->next;
461902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
462002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    trans_received++;
462102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (trans_remaining) {
462202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      trans_remaining--;
462302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
462402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
462502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
462602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
462702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* The loop now exits due to timeout or transaction count being */
462802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reached */
462902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
463002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_stop(sctp_rr_request->measure_cpu,&elapsed_time);
463102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
463202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  stop_timer();
463302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
463402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (timed_out) {
463502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ended the test by time, which was at least 2 seconds */
463602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* longer than we wanted to run. so, we want to subtract */
463702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* PAD_TIME from the elapsed_time. */
463802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed_time -= PAD_TIME;
463902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
464002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
464102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* send the results to the sender			*/
464202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
464302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
464402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
464502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_rr: got %d transactions\n",
464602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    trans_received);
464702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
464802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
464902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
465002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->bytes_received = (trans_received *
465102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				    (sctp_rr_request->request_size +
465202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project				     sctp_rr_request->response_size));
465302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->trans_received = trans_received;
465402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->elapsed_time   = elapsed_time;
465502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->cpu_method     = cpu_method;
465602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sctp_rr_results->num_cpus       = lib_num_loc_cpus;
465702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (sctp_rr_request->measure_cpu) {
465802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sctp_rr_results->cpu_util	= calc_cpu_util(elapsed_time);
465902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
466002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
466102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
466202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
466302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "recv_sctp_rr: test complete, sending results.\n");
466402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
466502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
466602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
466702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are now done with the sockets */
466802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  close(s_rcv);
466902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  send_response();
467102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
467302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
467602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_sctp_usage()
467702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
467802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
467902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  printf("%s",sctp_usage);
468002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  exit(1);
468102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
468202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
468302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
468402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectscan_sctp_args(argc, argv)
468502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     int	argc;
468602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     char	*argv[];
468702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
468802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
468902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
469002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define SOCKETS_ARGS "BDhH:I:L:m:M:P:r:s:S:VN:T:46"
469102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
469202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  extern char	*optarg;	  /* pointer to option string	*/
469302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
469402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int		c;
469502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
469602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  char
469702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    arg1[BUFSIZ],  /* argument holders		*/
469802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    arg2[BUFSIZ];
469902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
470002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (no_control) {
470102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
470202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "The SCTP tests do not know how to deal with no control tests\n");
470302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
470402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
470502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
470602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strncpy(local_data_port,"0",sizeof(local_data_port));
470702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strncpy(remote_data_port,"0",sizeof(remote_data_port));
470802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
470902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* Go through all the command line arguments and break them */
471002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* out. For those options that take two parms, specifying only */
471102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the first will set both to that value. Specifying only the */
471202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* second will leave the first untouched. To change only the */
471302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* first, use the form "first," (see the routine break_args.. */
471402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
471502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while ((c= getopt(argc, argv, SOCKETS_ARGS)) != EOF) {
471602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (c) {
471702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '?':
471802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '4':
471902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_data_family = AF_INET;
472002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_data_family = AF_INET;
472102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
472202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case '6':
472302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(AF_INET6)
472402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      remote_data_family = AF_INET6;
472502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      local_data_family = AF_INET6;
472602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
472702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(stderr,
472802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "This netperf was not compiled on an IPv6 capable host!\n");
472902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(stderr);
473002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
473102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
473202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
473302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'h':
473402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      print_sctp_usage();
473502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
473602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'b':
473702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WANT_FIRST_BURST
473802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      first_burst_size = atoi(optarg);
473902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* WANT_FIRST_BURST */
474002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Initial request burst functionality not compiled-in!\n");
474102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WANT_FIRST_BURST */
474202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
474302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'D':
474402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the nodelay flag */
474502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_nodelay = 1;
474602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_nodelay = 1;
474702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
474802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'H':
474902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args_explicit(optarg,arg1,arg2);
475002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0]) {
475102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure we leave room for the NULL termination boys and
475202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   girls. raj 2005-02-82 */
475302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_data_address = malloc(strlen(arg1)+1);
475402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_address,arg1,strlen(arg1));
475502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
475602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
475702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	remote_data_family = parse_address_family(arg2);
475802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
475902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'L':
476002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args_explicit(optarg,arg1,arg2);
476102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0]) {
476202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* make sure we leave room for the NULL termination boys and
476302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   girls. raj 2005-02-82 */
476402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_data_address = malloc(strlen(arg1)+1);
476502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(local_data_address,arg1,strlen(arg1));
476602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
476702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
476802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	local_data_family = parse_address_family(arg2);
476902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
477002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'P':
477102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the local and remote data port numbers for the tests to
477202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 allow them to run through those blankety blank end-to-end
477302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 breaking firewalls. raj 2004-06-15 */
477402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
477502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
477602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(local_data_port,arg1,sizeof(local_data_port));
477702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
477802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	strncpy(remote_data_port,arg2,sizeof(remote_data_port));
477902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
478002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 's':
478102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set local socket sizes */
478202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
478302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
478402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lss_size_req = convert(arg1);
478502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
478602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	lsr_size_req = convert(arg2);
478702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
478802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'S':
478902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set remote socket sizes */
479002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
479102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
479202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rss_size_req = convert(arg1);
479302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
479402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsr_size_req = convert(arg2);
479502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
479602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'r':
479702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the request/response sizes */
479802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break_args(optarg,arg1,arg2);
479902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg1[0])
480002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	req_size = convert(arg1);
480102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (arg2[0])
480202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	rsp_size = convert(arg2);
480302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
480402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'm':
480502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set size of the buffer for each sent message */
480602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      send_size = convert(optarg);
480702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
480802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'M':
480902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the size of the buffer for each received message */
481002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      recv_size = convert(optarg);
481102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
481202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 't':
481302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* set the test name */
481402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      strcpy(test_name,optarg);
481502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
481602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'W':
481702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* set the "width" of the user space data */
481802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* buffer. This will be the number of */
481902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* send_size buffers malloc'd in the */
482002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* *_STREAM test. It may be enhanced to set */
482102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* both send and receive "widths" but for now */
482202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* it is just the sending *_STREAM. */
482302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	send_width = convert(optarg);
482402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	break;
482502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'V':
482602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we want to do copy avoidance and will set */
482702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* it for everything, everywhere, if we really */
482802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* can. of course, we don't know anything */
482902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* about the remote... */
483002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_SND_COPYAVOID
483102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 1;
483202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
483302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_sndavoid = 0;
483402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Local send copy avoidance not available.\n");
483502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
483602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef SO_RCV_COPYAVOID
483702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 1;
483802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
483902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      loc_rcvavoid = 0;
484002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      printf("Local recv copy avoidance not available.\n");
484102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
484202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_sndavoid = 1;
484302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      rem_rcvavoid = 1;
484402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
484502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'N':
484602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* this opton allows the user to set the number of
484702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * messages to send.  This in effect modifies the test
484802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * time.  If we know the message size, then the we can
484902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       * express the test time as message_size * number_messages
485002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       */
485102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      msg_count = convert (optarg);
485202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (msg_count > 0)
485302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  test_time = 0;
485402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
485502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'B':
485602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      non_block = 1;
485702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
485802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 'T':
485902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      num_associations = atoi(optarg);
486002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (num_associations <= 1) {
486102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  printf("Number of SCTP associations must be >= 1\n");
486202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  exit(1);
486302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
486402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
486502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    };
486602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
486702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
486802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
486902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif  /* WANT_SCTP */
4870