Home | History | Annotate | Download | only in netperf
      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