/*
Copyright (C) 1993-2012 Hewlett-Packard Company
*/
/* This file contains the test-specific definitions for netperf's BSD */
/* sockets tests */
/* well boys and girls, seems that while AF_INET is "2" and AF_UNSPEC
is "0" the world over, AF_INET6 is different values depending on
the platform... grrr. On HP-UX 11i it is "22" and on Linux 2.6 it
is "10" sooooo... we have to define our own space for netperf to
enable us to pass values around from machine to machine. raj
2005-02-08 */
#define NF_UNSPEC 0
#define NF_INET 4
#define NF_INET6 6
/* since it isn't clear that AF_RDS will be the same value everywhere
we will have an NF_RDS as well and will make it "lucky 7" raj
20091014 */
#define NF_RDS 7
/* it would also seem that the socket type defines differ from
platform to platform, which means we need to define our own values
to pass between netperf and netserver so they can be translated to
the local versions. NST == Netperf Socket Type raj 2008-01-14 */
#define NST_UNKN -1
#define NST_STREAM 1
#define NST_DGRAM 2
#define NST_DCCP 3
#define NST_SEQPACKET 4
#ifdef WANT_OMNI
#define OMNI_NO_DELAY 0x00000001
#define OMNI_USE_SENDFILE 0x00000002
#define OMNI_CONNECT_TEST 0x00000004
#define OMNI_MEASURE_CPU 0x00000008
#define OMNI_CHECKSUM_OFF 0x00000010
#define OMNI_ROUTING_ALLOWED 0x00000020
#define OMNI_WANT_IFNAME 0x00000040
#define OMNI_WANT_IFSLOT 0x00000080
#define OMNI_WANT_IFIDS 0x00000100
#define OMNI_WANT_DRVINFO 0x00000200
#define OMNI_CHECK_INTERVAL 0x00000400 /* deprecated 2015-04-20 */
#define OMNI_FASTOPEN 0x00000800
#define OMNI_MANAGE_FIREWALL 0x00001000
#define OMNI_USE_PKTINFO 0x00002000
#define OMNI_USE_CONNECTED 0x00004000
#define OMNI_WANT_DEFER_ACCEPT 0x00008000
/* room in the middle */
#define OMNI_WANT_KEEPALIVE 0x80000000
struct omni_request_struct {
int32_t send_buf_size; /* SO_SNDBUF */
uint32_t send_size; /* bytes per send() call */
uint32_t send_alignment; /* alignment of send buffer */
uint32_t send_offset; /* offset from send alignment */
uint32_t send_width; /* number of send buffers to use */
int32_t request_size; /* size of a request */
int32_t recv_buf_size; /* SO_RCVBUF */
uint32_t receive_size; /* size of buffers in recv */
uint32_t recv_alignment; /* alignment of recv buffer */
uint32_t recv_offset; /* offset from recv alignment */
uint32_t recv_width; /* number of recv buffers to use */
int32_t response_size; /* size of a response */
uint32_t flags; /* to convey things that didn't
really need to burn an entire
int */
float cpu_rate; /* do we know how fast the cpu is already? */
int32_t test_length; /* how long is the test? */
uint32_t so_rcvavoid; /* avoid copies on recv? */
uint32_t so_sndavoid; /* avoid copies on send? */
uint32_t send_dirty_count; /* bytes to dirty before calling send */
uint32_t recv_dirty_count; /* bytes to dirty before calling recv */
uint32_t recv_clean_count; /* bytes to access before calling recv */
uint32_t data_port; /* what port number should netserver use? */
uint32_t ipfamily; /* address family of the data connection */
uint32_t socket_type; /* dgram? stream? other? */
uint32_t protocol; /* the protocol of the data connection */
uint32_t direction; /* which way flows the data? */
uint32_t netperf_port; /* when netserver needs netperf's data port */
uint32_t interval_burst;/* how many things to do each interval */
uint32_t interval_usecs;/* how long each interval should be */
uint32_t netperf_ip[4]; /* when netserver needs netperf's data IP */
uint32_t netserver_ip[4]; /* when netperf tells netserver his IP */
int32_t socket_prio; /* what netserver should use for socket prio */
int32_t socket_tos; /* what netserver should use for socket tos */
/* there are 38 "ints" above here, add another and you will need to
adjust the define below */
#define OMNI_REQUEST_CONV_CUTOFF 38
char cong_control[16]; /* the requested congestion control alg */
char fill_file[32]; /* file from which netserver fills bufs */
/* total sizeof must be <= MAXSPECDATA*sizeof(int) */
};
struct omni_response_struct {
int32_t recv_buf_size;
uint32_t receive_size;
int32_t recv_width;
int32_t send_buf_size;
uint32_t send_size;
int32_t send_width;
uint32_t flags;
float cpu_rate;
uint32_t test_length;
uint32_t so_rcvavoid;
uint32_t so_sndavoid;
uint32_t data_port; /* connect to this port number */
uint32_t interval_burst;/* how many things to do each interval */
uint32_t interval_usecs;/* how long each interval should be */
/* these are here because they can be checked before actual data
connections are made, and the omni_results_struct is already
full */
uint32_t cpu_frequency; /* this should be megahertz */
uint32_t security_info;
int32_t socket_prio;
int32_t socket_tos;
/* there are 18 ints above here, add another and you need to adjust
the define below */
#define OMNI_RESPONSE_CONV_CUTOFF 18
char system_model[33];
char cpu_model[80]; /* seems like an awful lot doesn't
it. some clever person at Intel
decided to give Montecito processors a
name that long - and still didn't
include the 9NNN model number! */
char security_string[16];
/* total sizeof must be <= MAXSPECDATA*sizeof(int) */
};
struct omni_results_struct {
uint32_t bytes_received_hi; /* why? because we cannot easily send */
uint32_t bytes_received_lo; /* uint64_t or doubles between endianess */
uint32_t recv_calls;
int32_t recv_buf_size; /* SO_RCVBUF at end of test */
uint32_t bytes_sent_hi;
uint32_t bytes_sent_lo;
uint32_t send_calls;
int32_t send_buf_size; /* SO_SNDBUF at end of test */
uint32_t failed_sends;
uint32_t trans_received;
float elapsed_time; /* length of test in seconds */
float cpu_util;
float cpu_percent_user;
float cpu_percent_system;
float cpu_percent_iowait;
float cpu_percent_irq;
float cpu_percent_swintr;
float serv_dem;
uint32_t cpu_method; /* how was CPU util measured? */
uint32_t num_cpus; /* number of CPUs in remote */
int32_t peak_cpu_id; /* ID of the most utilized CPU */
float peak_cpu_util; /* its individual utilization */
int32_t vendor;
int32_t device; /* pci device id of the probable egress
interface */
int32_t subvendor;
int32_t subdevice;
int32_t transport_retrans;
/* there are 27 ints above here, add another and you need to adjust
the define below */
#define OMNI_RESULTS_CONV_CUTOFF 27
char ifname[16]; /* the probable egress interface */
char driver[32]; /* size based on linux/ethtool.h */
char version[32];
char firmware[32];
char bus[32];
char ifslot[16]; /* slot id of the probable egress interface */
char cong_control[16]; /* what the congestion control alg was */
/* total sizeof must be <= MAXSPECDATA*sizeof(int) */
};
#endif /* WANT_OMNI */
struct tcp_stream_request_struct {
int send_buf_size;
int recv_buf_size; /* how big does the client want it - the */
/* receive socket buffer that is */
int receive_size; /* how many bytes do we want to receive at one */
/* time? */
int recv_alignment; /* what is the alignment of the receive */
/* buffer? */
int recv_offset; /* and at what offset from that alignment? */
int no_delay; /* do we disable the nagle algorithm for send */
/* coalescing? */
int measure_cpu; /* does the client want server cpu utilization */
/* measured? */
float cpu_rate; /* do we know how fast the cpu is already? */
int test_length; /* how long is the test? */
int so_rcvavoid; /* do we want the remote to avoid copies on */
/* receives? */
int so_sndavoid; /* do we want the remote to avoid send copies? */
int dirty_count; /* how many integers in the receive buffer */
/* should be made dirty before calling recv? */
int clean_count; /* how many integers should be read from the */
/* recv buffer before calling recv? */
int port; /* the port to which the recv side should bind
to allow netperf to run through those evil
firewall things */
int ipfamily; /* the address family of ipaddress */
};
struct tcp_stream_response_struct {
int recv_buf_size; /* how big does the client want it */
int receive_size;
int no_delay;
int measure_cpu; /* does the client want server cpu */
int test_length; /* how long is the test? */
int send_buf_size;
int data_port_number; /* connect to me here */
float cpu_rate; /* could we measure */
int so_rcvavoid; /* could the remote avoid receive copies? */
int so_sndavoid; /* could the remote avoid send copies? */
};
struct tcp_stream_results_struct {
double bytes_received;
unsigned int recv_calls;
float elapsed_time; /* how long the test ran */
float cpu_util; /* -1 if not measured */
float serv_dem; /* -1 if not measured */
int cpu_method; /* how was cpu util measured? */
int num_cpus; /* how many CPUs had the remote? */
int recv_buf_size; /* how large was it at the end? */
int send_buf_size; /* how large was it at the end? */
};
struct tcp_maerts_request_struct {
int send_buf_size;
int recv_buf_size; /* how big does the client want it - the */
/* receive socket buffer that is */
int send_size; /* how many bytes do we want netserver to send
at one time? */
int send_alignment; /* what is the alignment of the send */
/* buffer? */
int send_offset; /* and at what offset from that alignment? */
int no_delay; /* do we disable the nagle algorithm for send */
/* coalescing? */
int measure_cpu; /* does the client want server cpu utilization */
/* measured? */
float cpu_rate; /* do we know how fast the cpu is already? */
int test_length; /* how long is the test? */
int so_rcvavoid; /* do we want the remote to avoid copies on */
/* receives? */
int so_sndavoid; /* do we want the remote to avoid send copies? */
int dirty_count; /* how many integers in the send buffer */
/* should be made dirty before calling recv? */
int clean_count; /* how many integers should be read from the */
/* recv buffer before calling recv? */
int port; /* the port to which the recv side should bind
to allow netperf to run through those evil
firewall things */
int ipfamily;
};
struct tcp_maerts_response_struct {
int recv_buf_size; /* how big does the client want it */
int send_size;
int no_delay;
int measure_cpu; /* does the client want server cpu */
int test_length; /* how long is the test? */
int send_buf_size;
int data_port_number; /* connect to me here */
float cpu_rate; /* could we measure */
int so_rcvavoid; /* could the remote avoid receive copies? */
int so_sndavoid; /* could the remote avoid send copies? */
};
struct tcp_maerts_results_struct {
double bytes_sent;
unsigned int send_calls;
float elapsed_time; /* how long the test ran */
float cpu_util; /* -1 if not measured */
float serv_dem; /* -1 if not measured */
int cpu_method; /* how was cpu util measured? */
int num_cpus; /* how many CPUs had the remote? */
};
struct tcp_rr_request_struct {
int recv_buf_size; /* how big does the client want it */
int send_buf_size;
int recv_alignment;
int recv_offset;
int send_alignment;
int send_offset;
int request_size;
int response_size;
int no_delay;
int measure_cpu; /* does the client want server cpu */
float cpu_rate; /* do we know how fast the cpu is? */
int test_length; /* how long is the test? */
int so_rcvavoid; /* do we want the remote to avoid receive */
/* copies? */
int so_sndavoid; /* do we want the remote to avoid send copies? */
int port; /* the port to which the recv side should bind
to allow netperf to run through those evil
firewall things */
int ipfamily;
};
struct tcp_rr_response_struct {
int recv_buf_size; /* how big does the client want it */
int no_delay;
int measure_cpu; /* does the client want server cpu */
int test_length; /* how long is the test? */
int send_buf_size;
int data_port_number; /* connect to me here */
float cpu_rate; /* could we measure */
int so_rcvavoid; /* could the remote avoid receive copies? */
int so_sndavoid; /* could the remote avoid send copies? */
};
struct tcp_rr_results_struct {
unsigned int bytes_received; /* ignored initially */
unsigned int recv_calls; /* ignored initially */
unsigned int trans_received; /* not ignored */
float elapsed_time; /* how long the test ran */
float cpu_util; /* -1 if not measured */
float serv_dem; /* -1 if not measured */
int cpu_method; /* how was cpu util measured? */
int num_cpus; /* how many CPUs had the remote? */
};
struct tcp_conn_rr_request_struct {
int recv_buf_size; /* how big does the client want it */
int send_buf_size;
int recv_alignment;
int recv_offset;
int send_alignment;
int send_offset;
int request_size;
int response_size;
int no_delay;
int measure_cpu; /* does the client want server cpu */
float cpu_rate; /* do we know how fast the cpu is? */
int test_length; /* how long is the test? */
int so_rcvavoid; /* do we want the remote to avoid receive */
/* copies? */
int so_sndavoid; /* do we want the remote to avoid send copies? */
int port; /* the port to which the recv side should bind
to allow netperf to run through those evil
firewall things */
int ipfamily;
};
struct tcp_conn_rr_response_struct {
int recv_buf_size; /* how big does the client want it */
int no_delay;
int measure_cpu; /* does the client want server cpu */
int test_length; /* how long is the test? */
int send_buf_size;
int data_port_number; /* connect to me here */
float cpu_rate; /* could we measure */
int so_rcvavoid; /* could the remote avoid receive copies? */
int so_sndavoid; /* could the remote avoid send copies? */
};
struct tcp_conn_rr_results_struct {
unsigned int bytes_received; /* ignored initially */
unsigned int recv_calls; /* ignored initially */
unsigned int trans_received; /* not ignored */
float elapsed_time; /* how long the test ran */
float cpu_util; /* -1 if not measured */
float serv_dem; /* -1 if not measured */
int cpu_method; /* how was cpu util measured? */
int num_cpus; /* how many CPUs had the remote? */
};
struct tcp_tran_rr_request_struct {
int recv_buf_size; /* how big does the client want it */
int send_buf_size;
int recv_alignment;
int recv_offset;
int send_alignment;
int send_offset;
int request_size;
int response_size;
int no_delay;
int measure_cpu; /* does the client want server cpu */
float cpu_rate; /* do we know how fast the cpu is? */
int test_length; /* how long is the test? */
int so_rcvavoid; /* do we want the remote to avoid receive */
/* copies? */
int so_sndavoid; /* do we want the remote to avoid send copies? */
int port; /* the port to which the recv side should bind
to allow netperf to run through those evil
firewall things */
int ipfamily;
};
struct tcp_tran_rr_response_struct {
int recv_buf_size; /* how big does the client want it */
int no_delay;
int measure_cpu; /* does the client want server cpu */
int test_length; /* how long is the test? */
int send_buf_size;
int data_port_number; /* connect to me here */
float cpu_rate; /* could we measure */
int so_rcvavoid; /* could the remote avoid receive copies? */
int so_sndavoid; /* could the remote avoid send copies? */
};
struct tcp_tran_rr_results_struct {
unsigned int bytes_received; /* ignored initially */
unsigned int recv_calls; /* ignored initially */
unsigned int trans_received; /* not ignored */
float elapsed_time; /* how long the test ran */
float cpu_util; /* -1 if not measured */
float serv_dem; /* -1 if not measured */
int cpu_method; /* how was cpu util measured? */
int num_cpus; /* how many CPUs had the remote? */
};
struct udp_stream_request_struct {
int recv_buf_size;
int message_size;
int recv_connected;
int recv_alignment;
int recv_offset;
int checksum_off;
int measure_cpu;
float cpu_rate;
int test_length;
int so_rcvavoid; /* do we want the remote to avoid receive */
/* copies? */
int so_sndavoid; /* do we want the remote to avoid send copies? */
int port; /* the port to which the recv side should bind
to allow netperf to run through those evil
firewall things */
int ipfamily;
};
struct udp_stream_response_struct {
int recv_buf_size;
int send_buf_size;
int measure_cpu;
int test_length;
int data_port_number;
float cpu_rate;
int so_rcvavoid; /* could the remote avoid receive copies? */
int so_sndavoid; /* could the remote avoid send copies? */
};
struct udp_stream_results_struct {
unsigned int messages_recvd;
unsigned int bytes_received;
float elapsed_time;
float cpu_util;
int cpu_method; /* how was cpu util measured? */
int num_cpus; /* how many CPUs had the remote? */
};
struct udp_rr_request_struct {
int recv_buf_size; /* how big does the client want it */
int send_buf_size;
int recv_alignment;
int recv_offset;
int send_alignment;
int send_offset;
int request_size;
int response_size;
int no_delay;
int measure_cpu; /* does the client want server cpu */
float cpu_rate; /* do we know how fast the cpu is? */
int test_length; /* how long is the test? */
int so_rcvavoid; /* do we want the remote to avoid receive */
/* copies? */
int so_sndavoid; /* do we want the remote to avoid send copies? */
int port; /* the port to which the recv side should bind
to allow netperf to run through those evil
firewall things */
int ipfamily;
};
struct udp_rr_response_struct {
int recv_buf_size; /* how big does the client want it */
int no_delay;
int measure_cpu; /* does the client want server cpu */
int test_length; /* how long is the test? */
int send_buf_size;
int data_port_number; /* connect to me here */
float cpu_rate; /* could we measure */
int so_rcvavoid; /* could the remote avoid receive copies? */
int so_sndavoid; /* could the remote avoid send copies? */
};
struct udp_rr_results_struct {
unsigned int bytes_received; /* ignored initially */
unsigned int recv_calls; /* ignored initially */
unsigned int trans_received; /* not ignored */
float elapsed_time; /* how long the test ran */
float cpu_util; /* -1 if not measured */
float serv_dem; /* -1 if not measured */
int cpu_method; /* how was cpu util measured? */
int num_cpus; /* how many CPUs had the remote? */
};
struct tcp_cc_request_struct {
int recv_buf_size; /* how big does the client want it */
int send_buf_size;
int recv_alignment;
int recv_offset;
int send_alignment;
int send_offset;
int request_size;
int response_size;
int no_delay;
int measure_cpu; /* does the client want server cpu */
float cpu_rate; /* do we know how fast the cpu is? */
int test_length; /* how long is the test? */
int so_rcvavoid; /* do we want the remote to avoid receive */
/* copies? */
int so_sndavoid; /* do we want the remote to avoid send copies? */
int port; /* the port to which the recv side should bind
to allow netperf to run through those evil
firewall things */
int ipfamily;
};
struct tcp_cc_response_struct {
int recv_buf_size; /* how big does the client want it */
int no_delay;
int measure_cpu; /* does the client want server cpu */
int test_length; /* how long is the test? */
int send_buf_size;
int data_port_number; /* connect to me here */
float cpu_rate; /* could we measure */
int so_rcvavoid; /* could the remote avoid receive copies? */
int so_sndavoid; /* could the remote avoid send copies? */
};
struct tcp_cc_results_struct {
unsigned int bytes_received; /* ignored initially */
unsigned int recv_calls; /* ignored initially */
unsigned int trans_received; /* not ignored */
float elapsed_time; /* how long the test ran */
float cpu_util; /* -1 if not measured */
float serv_dem; /* -1 if not measured */
int cpu_method; /* how was cpu util measured? */
int num_cpus; /* how many CPUs had the remote? */
};
extern int
socket_type, /* initially used by the "omni" tests */
rss_size_req, /* requested remote socket send buffer size */
rsr_size_req, /* requested remote socket recv buffer size */
rss_size, /* remote socket send buffer size */
rsr_size, /* remote socket recv buffer size */
rsr_size_end,
rss_size_end,
lss_size_req, /* requested local socket send buffer size */
lsr_size_req, /* requested local socket recv buffer size */
lss_size, /* local socket send buffer size */
lsr_size, /* local socket recv buffer size */
lss_size_end,
lsr_size_end,
req_size, /* request size */
rsp_size, /* response size */
send_size, /* how big are individual sends */
recv_size, /* how big are individual receives */
loc_nodelay, /* don't/do use NODELAY locally */
rem_nodelay, /* don't/do use NODELAY remotely */
loc_sndavoid, /* avoid send copies locally */
loc_rcvavoid, /* avoid recv copies locally */
rem_sndavoid, /* avoid send copies remotely */
rem_rcvavoid, /* avoid recv_copies remotely */
routing_allowed, /* do we set/clear SO_DONTROUTE on data sock */
multicast_ttl, /* what should the TTL be on mcast dgrams */
want_keepalive, /* do we bother setting SO_KEEPALIVE? */
transport_mss_req;
#ifdef WANT_OMNI
extern void scan_omni_args(int argc, char *argv[]);
#endif
extern void scan_sockets_args(int argc, char *argv[]);
extern struct addrinfo *complete_addrinfo(char *controlhost,
char *data_address,
char *port,
int family,
int type,
int protocol,
int flags);
extern void complete_addrinfos(struct addrinfo **remote,
struct addrinfo **local,
char remote_host[],
int type,
int protocol,
int flags);
extern int af_to_nf(int af);
extern int nf_to_af(int nf);
extern int nst_to_hst(int nst);
extern int hst_to_nst(int hst);
extern char *hst_to_str(int hst);
extern char *protocol_to_str(int protocol);
extern void print_top_test_header(char test_name[],
struct addrinfo *source,
struct addrinfo *destination);
extern void set_port_number(struct addrinfo *res,
unsigned short port);
extern void set_hostname_and_port(char *hostname,
char *portstr,
int family,
int port);
extern void set_sockaddr_family_addr_port(struct sockaddr_storage *sockaddr,
int family,
void *addr,
int port);
extern int get_sockaddr_family_addr_port(struct sockaddr_storage *sockaddr,
int family,
void *addr,
int *port);
extern void send_tcp_mss(char remote_host[]);
extern void send_tcp_stream(char remote_host[]);
extern void send_tcp_maerts(char remote_host[]);
extern void send_tcp_rr(char remote_host[]);
extern void send_tcp_conn_rr(char remote_host[]);
extern void send_tcp_cc(char remote_host[]);
extern void send_udp_stream(char remote_host[]);
extern void send_udp_rr(char remote_host[]);
extern void send_omni(char remote_host[]);
extern void print_uuid(char remote_host[]);
extern void recv_omni();
extern void recv_tcp_stream();
extern void recv_tcp_maerts();
extern void recv_tcp_rr();
extern void recv_tcp_conn_rr();
extern void recv_tcp_cc();
extern void recv_udp_stream();
extern void recv_udp_rr();
extern void loc_cpu_rate();
extern void rem_cpu_rate();
#ifdef HAVE_ICSC_EXS
extern void send_exs_tcp_stream(char remotehost[]);
#endif /* HAVE_ICSC_EXS */
#ifdef HAVE_SENDFILE
extern void sendfile_tcp_stream(char remotehost[]);
#endif /* HAVE_SENDFILE */
#if !defined(HAVE_STRUCT_SOCKADDR_STORAGE) && !defined(sockaddr_storage)
#define sockaddr_storage sockaddr_in
#endif
#ifdef DO_NBRR
extern void send_tcp_nbrr(char remote_host[]);
extern void recv_tcp_nbrr();
#endif
extern SOCKET create_data_socket(struct addrinfo *res);