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
244enum sock_buffer{
245  SEND_BUFFER,
246  RECV_BUFFER
247};
248
249enum 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
275union 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
284union 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
293struct 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 */
319struct 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
382extern 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
464int getopt(int argc, char **argv, char *optstring);
465
466extern char *optarg;		/* returned arg to go with this option */
467extern int optind;		/* index to next argv element to process */
468extern int opterr;		/* should error messages be printed? */
469extern int optopt;		/* */
470
471#endif /* _GETOPT_ */
472
473extern  SOCKET     win_kludge_socket, win_kludge_socket2;
474#endif /* WIN32 */
475
476extern  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 */
480extern char local_data_port[10];
481extern char remote_data_port[10];
482
483extern char *local_data_address;
484extern char *remote_data_address;
485
486extern char *local_sysname, *remote_sysname;
487extern char *local_release, *remote_release;
488extern char *local_version, *remote_version;
489extern char *local_machine, *remote_machine;
490
491extern int local_data_family;
492extern int remote_data_family;
493extern int control_family;
494
495extern  union netperf_request_struct netperf_request;
496extern  union netperf_response_struct netperf_response;
497
498extern struct cpu_stats_struct lib_local_cpu_stats;
499extern struct cpu_stats_struct lib_remote_cpu_stats;
500extern float                   lib_elapsed;
501extern float                   lib_local_maxrate;
502
503extern  char    libfmt;
504
505extern  int     cpu_method;
506extern  int     lib_num_loc_cpus;
507extern  int     lib_num_rem_cpus;
508extern  SOCKET  server_sock;
509extern  int     times_up;
510extern  FILE    *where;
511extern  int     loops_per_msec;
512extern  float   lib_local_per_cpu_util[];
513
514extern enum netperf_output_modes netperf_output_mode;
515
516#if defined(WANT_INTERVALS) || defined(WANT_DEMO)
517
518extern int    demo_mode;
519extern double demo_interval;
520extern double demo_units;
521extern double units_this_tick;
522#if defined(WANT_DEMO)
523extern void   demo_rr_interval(uint32_t units);
524extern void   demo_rr_setup(uint32_t units);
525extern void   demo_stream_interval(uint32_t units);
526extern void   demo_interval_tick(uint32_t units);
527extern void   demo_interval_final();
528#endif
529#endif
530
531extern  void    netlib_init();
532extern  int     netlib_get_page_size();
533extern  void    install_signal_catchers();
534extern  struct addrinfo *resolve_host(char hostname[],
535				      char port[],
536				      int af);
537extern  void    establish_control(char hostname[],
538				  char port[],
539				  int af,
540				  char local_hostname[],
541				  char local_port[],
542				  int local_af);
543extern  void    shutdown_control();
544extern  void    init_stat();
545extern  void    send_request();
546extern  void    recv_response();
547extern  void    send_response();
548extern  int     recv_request();
549extern  int     recv_request_timed_n(int n, int seconds);
550extern  void    send_request_n(int n);  /* convert only the first N ints */
551extern  void    recv_response_n(int n); /* of the test-specific data via */
552extern  void    send_response_n(int n); /* htonl/ntonl as required */
553extern  int     recv_request_n(int n);
554extern  void    fixup_request_n(int n);
555extern  void    dump_request();
556extern  void    dump_addrinfo(FILE *dumploc, struct addrinfo *info,
557			      char *host, char *port, int family);
558extern  void    start_timer(int time);
559extern  void    stop_timer();
560extern  void    cpu_start(int measure_cpu);
561extern  void    cpu_stop(int measure_cpu, float *elapsed);
562extern  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);
569extern  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);
575extern  double  get_result_confid();
576extern  double  get_loc_cpu_confid();
577extern  double  get_rem_cpu_confid();
578extern  void    display_confidence();
579extern  void    get_sock_buffer(SOCKET sd,
580				enum sock_buffer which,
581				int *effective_sizep);
582extern  void    set_sock_buffer(SOCKET sd,
583				enum sock_buffer which,
584				int requested_size,
585				int *effective_sizep);
586extern  char   *format_units();
587
588extern  void    get_remote_system_info();
589
590extern  char    *inet_ftos(int family);
591extern  char    *inet_ttos(int type);
592extern  char    *inet_ptos(int protocol);
593extern  char    *nsec_enabled_to_str(int enabled);
594extern  char    *nsec_type_to_str(int type);
595extern  double  ntohd(double net_double);
596extern  double  htond(double host_double);
597extern  int     inet_nton(int af, const void *src, char *dst, int cnt);
598extern  void    random_ip_address(struct addrinfo *res, int mask_len);
599extern  void    libmain();
600extern  double  calc_thruput(double units_received);
601extern  double  calc_thruput_interval(double units_received,double elapsed);
602extern  double  calc_thruput_omni(double units_received);
603extern  double  calc_thruput_interval_omni(double units_received,double elapsed);
604extern  float   calibrate_local_cpu(float local_cpu_rate);
605extern  float   calibrate_remote_cpu();
606extern  void    bind_to_specific_processor(int processor_affinity,int use_cpu_map);
607extern int      set_nonblock (SOCKET sock);
608extern char     *find_egress_interface(struct sockaddr *source, struct sockaddr *dest);
609extern char     *find_interface_slot(char *interface_name);
610extern void     find_interface_ids(char *interface_name, int *vendor, int *device, int *sub_vend, int *sub_dev);
611extern void     find_driver_info(char *ifname, char *driver, char *version, char *firmware, char *bus, int len);
612extern void     find_system_info(char **system_model, char **cpu_model, int *cpu_frequency);
613extern int      HIST_get_percentile();
614extern void     HIST_get_stats();
615extern void     HIST_purge();
616extern void     find_security_info(int *enabled, int *type, char **specific);
617extern void     demo_first_timestamp();
618extern void     demo_reset();
619extern 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
626extern int msec_sleep( int msecs );
627#endif  /* WIN32 */
628extern  float   calc_cpu_util(float elapsed_time);
629extern  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 */
634extern  float	calc_service_demand_fmt(double units_sent,
635					float elapsed_time,
636					float cpu_utilization,
637					int num_cpus);
638#if defined(__hpux)
639extern  void    catcher(int, siginfo_t *,void *);
640#else
641extern  void    catcher(int);
642#endif /* __hpux */
643extern  struct ring_elt *allocate_buffer_ring();
644extern void access_buffer(char *buffer_ptr,
645			  int length,
646			  int dirty_count,
647			  int clean_count);
648
649#ifdef HAVE_ICSC_EXS
650extern  struct ring_elt *allocate_exs_buffer_ring();
651#endif /* HAVE_ICSC_EXS */
652
653#ifdef HAVE_SENDFILE
654extern  struct ring_elt *alloc_sendfile_buf_ring();
655extern  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 */
663extern int dl_connect(int fd, unsigned char *remote_addr, int remote_addr_len);
664extern int dl_bind(int fd, int sap, int mode, char *dlsap_ptr, int *dlsap_len);
665extern  int     dl_open(char devfile[], int ppa);
666#endif /* WANT_DLPI */
667extern  char    format_cpu_method(int method);
668extern unsigned int convert(char *string);
669extern unsigned int convert_timespec(char *string);
670
671#ifdef WANT_INTERVALS
672extern void start_itimer(unsigned int interval_len_msec);
673extern void stop_itimer(void);
674#endif
675 /* these are all for the confidence interval stuff */
676extern double confidence;
677extern double result_confid;
678extern double loc_cpu_confid;
679extern double rem_cpu_confid;
680extern 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
690extern 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