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