* Added -Wall to CXXFLAGS and CFLAGS. This generated a lot of noise in the autotools generated files. * Added initial AUTHORS file. This is incomplete, but it's a start. 2008-03-12 Andrew Gallatin <gallatin@gmail.com> * Rework threading. This is done by having a condition variable for the reporting thread rather than using sched_yield and/or usleep. * Address performance issues on non Linux systems by avoiding system calls which are expensive on platforms other than Linux. * Fixes from FreeBSD ports: max_size_t is now 64 bits and not Iperf does not exit on ENOBUFS.
231 lines
7.5 KiB
C
231 lines
7.5 KiB
C
/*---------------------------------------------------------------
|
|
* Copyright (c) 1999,2000,2001,2002,2003
|
|
* The Board of Trustees of the University of Illinois
|
|
* All Rights Reserved.
|
|
*---------------------------------------------------------------
|
|
* Permission is hereby granted, free of charge, to any person
|
|
* obtaining a copy of this software (Iperf) and associated
|
|
* documentation files (the "Software"), to deal in the Software
|
|
* without restriction, including without limitation the
|
|
* rights to use, copy, modify, merge, publish, distribute,
|
|
* sublicense, and/or sell copies of the Software, and to permit
|
|
* persons to whom the Software is furnished to do
|
|
* so, subject to the following conditions:
|
|
*
|
|
*
|
|
* Redistributions of source code must retain the above
|
|
* copyright notice, this list of conditions and
|
|
* the following disclaimers.
|
|
*
|
|
*
|
|
* Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimers in the documentation and/or other materials
|
|
* provided with the distribution.
|
|
*
|
|
*
|
|
* Neither the names of the University of Illinois, NCSA,
|
|
* nor the names of its contributors may be used to endorse
|
|
* or promote products derived from this Software without
|
|
* specific prior written permission.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT
|
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
* ________________________________________________________________
|
|
* National Laboratory for Applied Network Research
|
|
* National Center for Supercomputing Applications
|
|
* University of Illinois at Urbana-Champaign
|
|
* http://www.ncsa.uiuc.edu
|
|
* ________________________________________________________________
|
|
*
|
|
* Reporter.h
|
|
* by Kevin Gibbs <kgibbs@nlanr.net>
|
|
*
|
|
* Since version 2.0 this handles all reporting.
|
|
* ________________________________________________________________ */
|
|
|
|
#ifndef REPORTER_H
|
|
#define REPORTER_H
|
|
|
|
#include "headers.h"
|
|
#include "Mutex.h"
|
|
|
|
struct thread_Settings;
|
|
struct server_hdr;
|
|
|
|
#include "Settings.hpp"
|
|
|
|
#define NUM_REPORT_STRUCTS 700
|
|
#define NUM_MULTI_SLOTS 5
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* This struct contains all important information from the sending or
|
|
* recieving thread.
|
|
*/
|
|
typedef struct ReportStruct {
|
|
int packetID;
|
|
max_size_t packetLen;
|
|
struct timeval packetTime;
|
|
struct timeval sentTime;
|
|
} ReportStruct;
|
|
|
|
/*
|
|
* The type field of ReporterData is a bitmask
|
|
* with one or more of the following
|
|
*/
|
|
#define TRANSFER_REPORT 0x00000001
|
|
#define SERVER_RELAY_REPORT 0x00000002
|
|
#define SETTINGS_REPORT 0x00000004
|
|
#define CONNECTION_REPORT 0x00000008
|
|
#define MULTIPLE_REPORT 0x00000010
|
|
|
|
typedef struct Transfer_Info {
|
|
void *reserved_delay;
|
|
int transferID;
|
|
int groupID;
|
|
int cntError;
|
|
int cntOutofOrder;
|
|
int cntDatagrams;
|
|
// Hopefully int64_t's
|
|
max_size_t TotalLen;
|
|
double jitter;
|
|
double startTime;
|
|
double endTime;
|
|
// chars
|
|
char mFormat; // -f
|
|
u_char mTTL; // -T
|
|
char mUDP;
|
|
char free;
|
|
} Transfer_Info;
|
|
|
|
typedef struct Connection_Info {
|
|
iperf_sockaddr peer;
|
|
Socklen_t size_peer;
|
|
iperf_sockaddr local;
|
|
Socklen_t size_local;
|
|
} Connection_Info;
|
|
|
|
typedef struct ReporterData {
|
|
char* mHost; // -c
|
|
char* mLocalhost; // -B
|
|
// int's
|
|
int type;
|
|
int cntError;
|
|
int lastError;
|
|
int cntOutofOrder;
|
|
int lastOutofOrder;
|
|
int cntDatagrams;
|
|
int lastDatagrams;
|
|
int PacketID;
|
|
int mBufLen; // -l
|
|
int mMSS; // -M
|
|
int mTCPWin; // -w
|
|
/* flags is a BitMask of old bools
|
|
bool mBufLenSet; // -l
|
|
bool mCompat; // -C
|
|
bool mDaemon; // -D
|
|
bool mDomain; // -V
|
|
bool mFileInput; // -F or -I
|
|
bool mNodelay; // -N
|
|
bool mPrintMSS; // -m
|
|
bool mRemoveService; // -R
|
|
bool mStdin; // -I
|
|
bool mStdout; // -o
|
|
bool mSuggestWin; // -W
|
|
bool mUDP;
|
|
bool mMode_time;*/
|
|
int flags;
|
|
// enums (which should be special int's)
|
|
ThreadMode mThreadMode; // -s or -c
|
|
ReportMode mode;
|
|
max_size_t TotalLen;
|
|
max_size_t lastTotal;
|
|
// doubles
|
|
double lastTransit;
|
|
// shorts
|
|
unsigned short mPort; // -p
|
|
// structs or miscellaneous
|
|
Transfer_Info info;
|
|
Connection_Info connection;
|
|
struct timeval startTime;
|
|
struct timeval packetTime;
|
|
struct timeval nextTime;
|
|
struct timeval intervalTime;
|
|
} ReporterData;
|
|
|
|
typedef struct MultiHeader {
|
|
int reporterindex;
|
|
int agentindex;
|
|
int groupID;
|
|
int threads;
|
|
ReporterData *report;
|
|
Transfer_Info *data;
|
|
Condition barrier;
|
|
struct timeval startTime;
|
|
} MultiHeader;
|
|
|
|
typedef struct ReportHeader {
|
|
int reporterindex;
|
|
int agentindex;
|
|
ReporterData report;
|
|
ReportStruct *data;
|
|
MultiHeader *multireport;
|
|
struct ReportHeader *next;
|
|
} ReportHeader;
|
|
|
|
typedef void* (* report_connection)( Connection_Info*, int );
|
|
typedef void (* report_settings)( ReporterData* );
|
|
typedef void (* report_statistics)( Transfer_Info* );
|
|
typedef void (* report_serverstatistics)( Connection_Info*, Transfer_Info* );
|
|
|
|
MultiHeader* InitMulti( struct thread_Settings *agent, int inID );
|
|
ReportHeader* InitReport( struct thread_Settings *agent );
|
|
void ReportPacket( ReportHeader *agent, ReportStruct *packet );
|
|
void CloseReport( ReportHeader *agent, ReportStruct *packet );
|
|
void EndReport( ReportHeader *agent );
|
|
Transfer_Info* GetReport( ReportHeader *agent );
|
|
void ReportServerUDP( struct thread_Settings *agent, struct server_hdr *server );
|
|
void ReportSettings( struct thread_Settings *agent );
|
|
void ReportConnections( struct thread_Settings *agent );
|
|
|
|
extern report_connection connection_reports[];
|
|
|
|
extern report_settings settings_reports[];
|
|
|
|
extern report_statistics statistics_reports[];
|
|
|
|
extern report_serverstatistics serverstatistics_reports[];
|
|
|
|
extern report_statistics multiple_reports[];
|
|
|
|
extern char buffer[64]; // Buffer for printing
|
|
|
|
#define rMillion 1000000
|
|
|
|
#define TimeDifference( left, right ) (left.tv_sec - right.tv_sec) + \
|
|
(left.tv_usec - right.tv_usec) / ((double) rMillion)
|
|
|
|
#define TimeAdd( left, right ) do { \
|
|
left.tv_usec += right.tv_usec; \
|
|
if ( left.tv_usec > rMillion ) { \
|
|
left.tv_usec -= rMillion; \
|
|
left.tv_sec++; \
|
|
} \
|
|
left.tv_sec += right.tv_sec; \
|
|
} while ( 0 )
|
|
#ifdef __cplusplus
|
|
} /* end extern "C" */
|
|
#endif
|
|
|
|
#endif // REPORTER_H
|