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