• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2          Copyright (C) 1993-2005 Hewlett-Packard Company
3  */
4  
5  #ifdef HAVE_CONFIG_H
6  #include "config.h"
7  #endif
8  
9  #if defined(HAVE_SYS_SOCKET_H)
10  # include <sys/socket.h>
11  #endif
12  #if defined(HAVE_NETDB_H)
13  # include <netdb.h>
14  #endif
15  #if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
16  # include "missing/getaddrinfo.h"
17  #endif
18  
19  #define PAD_TIME 4
20  /* library routine specifc defines                                      */
21  #define         MAXSPECDATA     62      /* how many ints worth of data  */
22                                          /* can tests send...            */
23  #define         MAXTIMES        4       /* how many times may we loop   */
24                                          /* to calibrate                 */
25  #define         MAXCPUS         256     /* how many CPU's can we track */
26  #define         MAXMESSAGESIZE  65536
27  #define         MAXALIGNMENT    16384
28  #define         MAXOFFSET        4096
29  #define         DATABUFFERLEN   MAXMESSAGESIZE+MAXALIGNMENT+MAXOFFSET
30  
31  #define         DEBUG_ON                1
32  #define         DEBUG_OFF               2
33  #define         DEBUG_OK                3
34  #define         NODE_IDENTIFY           4
35  #define         CPU_CALIBRATE           5
36  
37  #define         DO_TCP_STREAM           10
38  #define         TCP_STREAM_RESPONSE     11
39  #define         TCP_STREAM_RESULTS      12
40  
41  #define         DO_TCP_RR               13
42  #define         TCP_RR_RESPONSE         14
43  #define         TCP_RR_RESULTS          15
44  
45  #define         DO_UDP_STREAM           16
46  #define         UDP_STREAM_RESPONSE     17
47  #define         UDP_STREAM_RESULTS      18
48  
49  #define         DO_UDP_RR               19
50  #define         UDP_RR_RESPONSE         20
51  #define         UDP_RR_RESULTS          21
52  
53  #define         DO_DLPI_CO_STREAM       22
54  #define         DLPI_CO_STREAM_RESPONSE 23
55  #define         DLPI_CO_STREAM_RESULTS  24
56  
57  #define         DO_DLPI_CO_RR           25
58  #define         DLPI_CO_RR_RESPONSE     26
59  #define         DLPI_CO_RR_RESULTS      27
60  
61  #define         DO_DLPI_CL_STREAM       28
62  #define         DLPI_CL_STREAM_RESPONSE 29
63  #define         DLPI_CL_STREAM_RESULTS  30
64  
65  #define         DO_DLPI_CL_RR           31
66  #define         DLPI_CL_RR_RESPONSE     32
67  #define         DLPI_CL_RR_RESULTS      33
68  
69  #define         DO_TCP_CRR              34
70  #define         TCP_CRR_RESPONSE        35
71  #define         TCP_CRR_RESULTS         36
72  
73  #define         DO_STREAM_STREAM        37
74  #define         STREAM_STREAM_RESPONSE  38
75  #define         STREAM_STREAM_RESULTS   39
76  
77  #define         DO_STREAM_RR            40
78  #define         STREAM_RR_RESPONSE      41
79  #define         STREAM_RR_RESULTS       42
80  
81  #define         DO_DG_STREAM            43
82  #define         DG_STREAM_RESPONSE      44
83  #define         DG_STREAM_RESULTS       45
84  
85  #define         DO_DG_RR                46
86  #define         DG_RR_RESPONSE          47
87  #define         DG_RR_RESULTS           48
88  
89  #define         DO_FORE_STREAM          49
90  #define         FORE_STREAM_RESPONSE    50
91  #define         FORE_STREAM_RESULTS     51
92  
93  #define         DO_FORE_RR              52
94  #define         FORE_RR_RESPONSE        53
95  #define         FORE_RR_RESULTS         54
96  
97  #define         DO_HIPPI_STREAM         55
98  #define         HIPPI_STREAM_RESPONSE   56
99  #define         HIPPI_STREAM_RESULTS    57
100  
101  #define         DO_HIPPI_RR             52
102  #define         HIPPI_RR_RESPONSE       53
103  #define         HIPPI_RR_RESULTS        54
104  
105  #define         DO_XTI_TCP_STREAM       55
106  #define         XTI_TCP_STREAM_RESPONSE 56
107  #define         XTI_TCP_STREAM_RESULTS  57
108  
109  #define         DO_XTI_TCP_RR           58
110  #define         XTI_TCP_RR_RESPONSE     59
111  #define         XTI_TCP_RR_RESULTS      60
112  
113  #define         DO_XTI_UDP_STREAM       61
114  #define         XTI_UDP_STREAM_RESPONSE 62
115  #define         XTI_UDP_STREAM_RESULTS  63
116  
117  #define         DO_XTI_UDP_RR           64
118  #define         XTI_UDP_RR_RESPONSE     65
119  #define         XTI_UDP_RR_RESULTS      66
120  
121  #define         DO_XTI_TCP_CRR          67
122  #define         XTI_TCP_CRR_RESPONSE    68
123  #define         XTI_TCP_CRR_RESULTS     69
124  
125  #define         DO_TCP_TRR              70
126  #define         TCP_TRR_RESPONSE        71
127  #define         TCP_TRR_RESULTS         72
128  
129  #define         DO_TCP_NBRR             73
130  #define         TCP_NBRR_RESPONSE       74
131  #define         TCP_NBRR_RESULTS        75
132  
133  #define         DO_TCPIPV6_STREAM           76
134  #define         TCPIPV6_STREAM_RESPONSE     77
135  #define         TCPIPV6_STREAM_RESULTS      78
136  
137  #define         DO_TCPIPV6_RR               79
138  #define         TCPIPV6_RR_RESPONSE         80
139  #define         TCPIPV6_RR_RESULTS          81
140  
141  #define         DO_UDPIPV6_STREAM           82
142  #define         UDPIPV6_STREAM_RESPONSE     83
143  #define         UDPIPV6_STREAM_RESULTS      84
144  
145  #define         DO_UDPIPV6_RR               85
146  #define         UDPIPV6_RR_RESPONSE         86
147  #define         UDPIPV6_RR_RESULTS          87
148  
149  #define         DO_TCPIPV6_CRR              88
150  #define         TCPIPV6_CRR_RESPONSE        89
151  #define         TCPIPV6_CRR_RESULTS         90
152  
153  #define         DO_TCPIPV6_TRR              91
154  #define         TCPIPV6_TRR_RESPONSE        92
155  #define         TCPIPV6_TRR_RESULTS         93
156  
157  #define         DO_TCP_MAERTS               94
158  #define         TCP_MAERTS_RESPONSE         95
159  #define         TCP_MAERTS_RESULTS          96
160  
161  #define         DO_LWPSTR_STREAM           100
162  #define         LWPSTR_STREAM_RESPONSE     110
163  #define         LWPSTR_STREAM_RESULTS      120
164  
165  #define         DO_LWPSTR_RR               130
166  #define         LWPSTR_RR_RESPONSE         140
167  #define         LWPSTR_RR_RESULTS          150
168  
169  #define         DO_LWPDG_STREAM            160
170  #define         LWPDG_STREAM_RESPONSE      170
171  #define         LWPDG_STREAM_RESULTS       180
172  
173  #define         DO_LWPDG_RR                190
174  #define         LWPDG_RR_RESPONSE          200
175  #define         LWPDG_RR_RESULTS           210
176  
177  #define         DO_TCP_CC                  300
178  #define         TCP_CC_RESPONSE            301
179  #define         TCP_CC_RESULTS             302
180  
181  /* The DNS_RR test has been removed from netperf but we leave these
182     here for historical purposes.  Those wanting to do DNS_RR tests
183     should use netperf4 instead. */
184  #define         DO_DNS_RR                  400
185  #define         DNS_RR_RESPONSE            401
186  #define         DNS_RR_RESULTS             402
187  
188  #define         DO_SCTP_STREAM             500
189  #define         SCTP_STREAM_RESPONSE       501
190  #define         SCTP_STREAM_RESULT         502
191  
192  #define         DO_SCTP_STREAM_MANY        510
193  #define         SCTP_STREAM_MANY_RESPONSE  511
194  #define         SCTP_STREAM_MANY_RESULT    512
195  
196  #define         DO_SCTP_RR                 520
197  #define         SCTP_RR_RESPONSE           521
198  #define         SCTP_RR_RESULT             502
199  
200  #define         DO_SCTP_RR_MANY            530
201  #define         SCTP_RR_MANY_RESPONSE      531
202  #define         SCTP_RR_MANY_RESULT        532
203  
204  #define         DO_SDP_STREAM              540
205  #define         SDP_STREAM_RESPONSE        541
206  #define         SDP_STREAM_RESULTS         542
207  
208  #define         DO_SDP_RR                  543
209  #define         SDP_RR_RESPONSE            544
210  #define         SDP_RR_RESULTS             545
211  
212  #define         DO_SDP_MAERTS              546
213  #define         SDP_MAERTS_RESPONSE        547
214  #define         SDP_MAERTS_RESULTS         548
215  
216  #define         DO_SDP_CRR                 549
217  #define         SDP_CRR_RESPONSE           550
218  #define         SDP_CRR_RESULTS            551
219  
220  #define         DO_SDP_CC                  552
221  #define         SDP_CC_RESPONSE            553
222  #define         SDP_CC_RESULTS             554
223  
224  #if HAVE_INTTYPES_H
225  # include <inttypes.h>
226  #else
227  # if HAVE_STDINT_H
228  #  include <stdint.h>
229  # endif
230  #endif
231  
232  enum sock_buffer{
233    SEND_BUFFER,
234    RECV_BUFFER
235  };
236  
237   /* some of the fields in these structures are going to be doubles and */
238   /* such. so, we probably want to ensure that they will start on */
239   /* "double" boundaries. this will break compatability to pre-2.1 */
240   /* releases, but then, backwards compatability has never been a */
241   /* stated goal of netperf. raj 11/95 */
242  
243  union netperf_request_struct {
244    struct {
245      int     request_type;
246      int     dummy;
247      int     test_specific_data[MAXSPECDATA];
248    } content;
249    double dummy;
250  };
251  
252  union netperf_response_struct {
253    struct {
254      int response_type;
255      int serv_errno;
256      int test_specific_data[MAXSPECDATA];
257    } content;
258    double dummy;
259  };
260  
261  struct ring_elt {
262    struct ring_elt *next;  /* next element in the ring */
263    char *buffer_base;      /* in case we have to free it at somepoint */
264    char *buffer_ptr;       /* the aligned and offset pointer */
265  };
266  
267  /* +*+ SAF  Sorry about the hacks with errno; NT made me do it :(
268  
269   WinNT does define an errno.
270   It is mostly a legacy from the XENIX days.
271  
272   Depending upon the version of the C run time that is linked in, it is
273   either a simple variable (like UNIX code expects), but more likely it
274   is the address of a procedure to return the error number.  So any
275   code that sets errno is likely to be overwriting the address of this
276   procedure.  Worse, only a tiny fraction of NT's errors get set
277   through errno.
278  
279   So I have changed the netperf code to use a define Set_errno when
280   that is it's intent.  On non-windows platforms this is just an
281   assignment to errno.  But on NT this calls SetLastError.
282  
283   I also define errno (now only used on right side of assignments)
284   on NT to be GetLastError.
285  
286   Similarly, perror is defined on NT, but it only accesses the same
287   XENIX errors that errno covers.  So on NT this is redefined to be
288   Perror and it expands all GetLastError texts. */
289  
290  
291  #ifdef WIN32
292  /* INVALID_SOCKET == INVALID_HANDLE_VALUE == (unsigned int)(~0) */
293  /* SOCKET_ERROR == -1 */
294  #define ENOTSOCK WSAENOTSOCK
295  #define EINTR    WSAEINTR
296  #define ENOBUFS  WSAENOBUFS
297  #define EWOULDBLOCK    WSAEWOULDBLOCK
298  #define EAFNOSUPPORT  WSAEAFNOSUPPORT
299  /* I don't use a C++ style of comment because it upsets some C
300     compilers, possibly even when it is inside an ifdef WIN32... */
301  /* from public\sdk\inc\crt\errno.h */
302  #define ENOSPC          28
303  
304  #ifdef errno
305  /* delete the one from stdlib.h  */
306  /*#define errno       (*_errno()) */
307  #undef errno
308  #endif
309  #define errno GetLastError()
310  #define Set_errno(num) SetLastError((num))
311  
312  #define perror(text) PrintWin32Error(stderr, (text))
313  #define Print_errno(stream, text) PrintWin32Error((stream), (text))
314  
315  extern void PrintWin32Error(FILE *stream, LPSTR text);
316  
317  #if !defined(NT_PERF) && !defined(USE_LOOPER)
318  #define NT_PERF
319  #endif
320  #else
321  /* Really shouldn't use manifest constants! */
322  /*+*+SAF There are other examples of "== -1" and "<0" that probably */
323  /*+*+SAF should be cleaned up as well. */
324  #define INVALID_SOCKET -1
325  #define SOCKET_ERROR -1
326  
327  #define SOCKET int
328  #define Set_errno(num) errno = (num)
329  
330  #define Print_errno(stream, text) fprintf((stream), "%s  errno %d\n", (text), errno)
331  #endif
332  
333  /* Robin & Rick's kludge to try to have a timer signal EINTR by closing  */
334  /* the socket from another thread can also return several other errors. */
335  /* Let's define a macro to hide all of this. */
336  
337  #ifndef WIN32
338  #define SOCKET_EINTR(return_value) (errno == EINTR)
339  #define SOCKET_EADDRINUSE(return_value) (errno == EADDRINUSE)
340  #define SOCKET_EADDRNOTAVAIL(return_value) (errno == EADDRNOTAVAIL)
341  
342  #else
343  
344  /* not quite sure I like the extra cases for WIN32 but that is what my
345     WIN32 expert sugested.  I'm not sure what WSA's to put for
346     EADDRINUSE */
347  
348  #define SOCKET_EINTR(return_value) \
349  		(((return_value) == SOCKET_ERROR) && \
350  	     ((errno == EINTR) || \
351  	      (errno == WSAECONNABORTED) || \
352  	      (errno == WSAECONNRESET) ))
353  #define SOCKET_EADDRINUSE(return_value) \
354  		(((return_value) == SOCKET_ERROR) && \
355  	     ((errno == WSAEADDRINUSE) ))
356  #define SOCKET_EADDRNOTAVAIL(return_value) \
357  		(((return_value) == SOCKET_ERROR) && \
358  	     ((errno == WSAEADDRNOTAVAIL) ))
359  #endif
360  
361  #ifdef HAVE_SENDFILE
362  
363  struct sendfile_ring_elt {
364    struct sendfile_ring_elt *next; /* next element in the ring */
365    int fildes;                     /* the file descriptor of the source
366  				     file */
367    off_t offset;                   /* the offset from the beginning of
368  				     the file for this send */
369    size_t length;                  /* the number of bytes to send -
370  				     this is redundant with the
371  				     send_size variable but I decided
372  				     to include it anyway */
373    struct iovec *hdtrl;            /* a pointer to a header/trailer
374  				     that we do not initially use and
375  				     so should be set to NULL when the
376  				     ring is setup. */
377    int flags;                      /* the flags to pass to sendfile() -
378  				     presently unused and should be
379  				     set to zero when the ring is
380  				     setup. */
381  };
382  
383  #endif /* HAVE_SENDFILE */
384  
385   /* the diferent codes to denote the type of CPU utilization */
386   /* methods used */
387  #define CPU_UNKNOWN     0
388  #define HP_IDLE_COUNTER 1
389  #define PSTAT           2
390  #define TIMES           3
391  #define LOOPER          4
392  #define GETRUSAGE       5
393  #define NT_METHOD       6
394  #define KSTAT           7
395  #define PROC_STAT       8
396  #define SYSCTL          9
397  #define PERFSTAT       10
398  #define KSTAT_10       11
399  #define OSX            12
400  
401  #define BADCH ('?')
402  
403  #ifndef NETLIB
404  #ifdef WIN32
405  #ifndef _GETOPT_
406  #define _GETOPT_
407  
408  int getopt(int argc, char **argv, char *optstring);
409  
410  extern char *optarg;		/* returned arg to go with this option */
411  extern int optind;		/* index to next argv element to process */
412  extern int opterr;		/* should error messages be printed? */
413  extern int optopt;		/* */
414  
415  #endif /* _GETOPT_ */
416  
417  extern  SOCKET     win_kludge_socket, win_kludge_socket2;
418  #endif /* WIN32 */
419  
420  extern  int   local_proc_affinity, remote_proc_affinity;
421  
422  /* these are to allow netperf to be run easily through those evil,
423     end-to-end breaking things known as firewalls */
424  extern char local_data_port[10];
425  extern char remote_data_port[10];
426  
427  extern char *local_data_address;
428  extern char *remote_data_address;
429  
430  extern int local_data_family;
431  extern int remote_data_family;
432  
433  extern  union netperf_request_struct netperf_request;
434  extern  union netperf_response_struct netperf_response;
435  
436  extern  float    lib_local_cpu_util;
437  extern  float    lib_elapsed;
438  extern  float    lib_local_maxrate;
439  
440  extern  char    libfmt;
441  
442  extern  int     cpu_method;
443  extern  int     lib_num_loc_cpus;
444  extern  int     lib_num_rem_cpus;
445  extern  SOCKET  server_sock;
446  extern  int     times_up;
447  extern  FILE    *where;
448  extern  int     loops_per_msec;
449  extern  float   lib_local_per_cpu_util[];
450  
451  extern  void    netlib_init();
452  extern  int     netlib_get_page_size();
453  extern  void    install_signal_catchers();
454  extern  void    establish_control(char hostname[],
455  				  char port[],
456  				  int af,
457  				  char local_hostname[],
458  				  char local_port[],
459  				  int local_af);
460  extern  void    shutdown_control();
461  extern  void    init_stat();
462  extern  void    send_request();
463  extern  void    recv_response();
464  extern  void    send_response();
465  extern  void    recv_request();
466  extern  void    dump_request();
467  extern  void    dump_addrinfo(FILE *dumploc, struct addrinfo *info,
468  			      char *host, char *port, int family);
469  extern  void    start_timer(int time);
470  extern  void    stop_timer();
471  extern  void    cpu_start(int measure_cpu);
472  extern  void    cpu_stop(int measure_cpu, float *elapsed);
473  extern  void	calculate_confidence(int confidence_iterations,
474  		     float time,
475  		     double result,
476  		     float loc_cpu,
477  		     float rem_cpu,
478  		     float loc_sd,
479  		     float rem_sd);
480  extern  void	retrieve_confident_values(float *elapsed_time,
481  			  double *thruput,
482  			  float *local_cpu_utilization,
483  			  float *remote_cpu_utilization,
484  			  float *local_service_demand,
485  			  float *remote_service_demand);
486  extern  void    display_confidence();
487  extern  void    set_sock_buffer(SOCKET sd,
488  				enum sock_buffer which,
489  				int requested_size,
490  				int *effective_sizep);
491  extern  char   *format_units();
492  
493  extern  char    *inet_ftos(int family);
494  extern  char    *inet_ttos(int type);
495  extern  char    *inet_ptos(int protocol);
496  extern  double  ntohd(double net_double);
497  extern  double  htond(double host_double);
498  extern  int     inet_nton(int af, const void *src, char *dst, int cnt);
499  extern  void    libmain();
500  extern  double  calc_thruput(double units_received);
501  extern  double  calc_thruput_interval(double units_received,double elapsed);
502  extern  double  calc_thruput_omni(double units_received);
503  extern  double  calc_thruput_interval_omni(double units_received,double elapsed);
504  extern  float   calibrate_local_cpu(float local_cpu_rate);
505  extern  float   calibrate_remote_cpu();
506  extern  void    bind_to_specific_processor(int processor_affinity,int use_cpu_map);
507  extern int      set_nonblock (SOCKET sock);
508  
509  #ifndef WIN32
510  
511  /* WIN32 requires that at least one of the file sets to select be
512   non-null.  Since msec_sleep routine is only called by nettest_dlpi &
513   nettest_unix, let's duck this issue. */
514  
515  extern int msec_sleep( int msecs );
516  #endif  /* WIN32 */
517  extern  float   calc_cpu_util(float elapsed_time);
518  extern  float	calc_service_demand(double units_sent,
519  				    float elapsed_time,
520  				    float cpu_utilization,
521  				    int num_cpus);
522  extern  float	calc_service_demand_trans(double units_sent,
523  					  float elapsed_time,
524  					  float cpu_utilization,
525  					  int num_cpus);
526  #if defined(__hpux)
527  extern  void    catcher(int, siginfo_t *,void *);
528  #else
529  extern  void    catcher(int);
530  #endif /* __hpux */
531  extern  struct ring_elt *allocate_buffer_ring();
532  extern void access_buffer(char *buffer_ptr,
533  			  int length,
534  			  int dirty_count,
535  			  int clean_count);
536  
537  #ifdef HAVE_ICSC_EXS
538  extern  struct ring_elt *allocate_exs_buffer_ring();
539  #endif /* HAVE_ICSC_EXS */
540  #ifdef HAVE_SENDFILE
541  extern  struct sendfile_ring_elt *alloc_sendfile_buf_ring();
542  #endif /* HAVE_SENDFILE */
543  #ifdef WANT_DLPI
544  /* it seems that AIX in its finite wisdom has some bogus define in an
545     include file which defines "rem_addr" which then screws-up this extern
546     unless we change the names to protect the guilty. reported by Eric
547     Jones */
548  extern int dl_connect(int fd, unsigned char *remote_addr, int remote_addr_len);
549  extern int dl_bind(int fd, int sap, int mode, char *dlsap_ptr, int *dlsap_len);
550  extern  int     dl_open(char devfile[], int ppa);
551  #endif /* WANT_DLPI */
552  extern  char    format_cpu_method(int method);
553  extern unsigned int convert(char *string);
554  extern unsigned int convert_timespec(char *string);
555  
556  #ifdef WANT_INTERVALS
557  extern void start_itimer(unsigned int interval_len_msec);
558  #endif
559   /* these are all for the confidence interval stuff */
560  extern double confidence;
561  
562  #endif
563  
564  #ifdef WIN32
565  #define close(x)	closesocket(x)
566  #define strcasecmp(a,b) _stricmp(a,b)
567  #define getpid() ((int)GetCurrentProcessId())
568  #endif
569  
570  #ifdef WIN32
571  #if 0
572  /* Should really use safe string functions; but not for now... */
573  #include <strsafe.h>
574  /* Microsoft has deprecated _snprintf; it isn't guarenteed to null terminate the result buffer. */
575  /* They want us to call StringCbPrintf instead; it always null terminates the string. */
576  #endif
577  
578  #define snprintf _snprintf
579  #endif
580  
581  /* Define a macro to align a buffer with an offset from a power of 2
582     boundary. */
583  
584  #ifndef WIN32
585  #define ULONG_PTR unsigned long
586  #endif
587  
588  #define ALIGN_BUFFER(BufPtr, Align, Offset) \
589    (char *)(( (ULONG_PTR)(BufPtr) + \
590  			(ULONG_PTR) (Align) -1) & \
591  			~((ULONG_PTR) (Align) - 1)) + (ULONG_PTR)(Offset)
592  
593   /* if your system has bcopy and bzero, include it here, otherwise, we */
594   /* will try to use memcpy aand memset. fix from Bruce Barnett @ GE. */
595  #if defined(hpux) || defined (__VMS)
596  #define HAVE_BCOPY
597  #define HAVE_BZERO
598  #endif
599  
600  #ifdef WIN32
601  #define HAVE_MIN
602  #else
603  #define _stdcall
604  #define _cdecl
605  #endif
606  
607  #ifndef HAVE_BCOPY
608  #define bcopy(s,d,h) memcpy((d),(s),(h))
609  #endif /* HAVE_BCOPY */
610  
611  #ifndef HAVE_BZERO
612  #define bzero(p,h) memset((p),0,(h))
613  #endif /* HAVE_BZERO */
614  
615  #ifndef HAVE_MIN
616  #define min(a,b) ((a < b) ? a : b)
617  #endif /* HAVE_MIN */
618  
619  #ifdef USE_PERFSTAT
620  # include <libperfstat.h>
621  #endif
622