1 /*
2         Copyright (C) 1993-2012 Hewlett-Packard Company
3 */
4 
5  /* This file contains the test-specific definitions for netperf's BSD */
6  /* sockets tests */
7 
8 /* well boys and girls, seems that while AF_INET is "2" and AF_UNSPEC
9    is "0" the world over, AF_INET6 is different values depending on
10    the platform... grrr.  On HP-UX 11i it is "22" and on Linux 2.6 it
11    is "10" sooooo... we have to define our own space for netperf to
12    enable us to pass values around from machine to machine. raj
13    2005-02-08 */
14 #define NF_UNSPEC 0
15 #define NF_INET   4
16 #define NF_INET6  6
17 /* since it isn't clear that AF_RDS will be the same value everywhere
18    we will have an NF_RDS as well and will make it "lucky 7" raj
19    20091014 */
20 #define NF_RDS    7
21 
22 /* it would also seem that the socket type defines differ from
23    platform to platform, which means we need to define our own values
24    to pass between netperf and netserver so they can be translated to
25    the local versions.  NST == Netperf Socket Type raj 2008-01-14 */
26 #define NST_UNKN     -1
27 #define NST_STREAM    1
28 #define NST_DGRAM     2
29 #define NST_DCCP      3
30 #define NST_SEQPACKET 4
31 
32 #ifdef WANT_OMNI
33 #define OMNI_NO_DELAY        0x00000001
34 #define OMNI_USE_SENDFILE    0x00000002
35 #define OMNI_CONNECT_TEST    0x00000004
36 #define OMNI_MEASURE_CPU     0x00000008
37 #define OMNI_CHECKSUM_OFF    0x00000010
38 #define OMNI_ROUTING_ALLOWED 0x00000020
39 #define OMNI_WANT_IFNAME     0x00000040
40 #define OMNI_WANT_IFSLOT     0x00000080
41 #define OMNI_WANT_IFIDS      0x00000100
42 #define OMNI_WANT_DRVINFO    0x00000200
43 #define OMNI_CHECK_INTERVAL  0x00000400  /* deprecated 2015-04-20 */
44 #define OMNI_FASTOPEN        0x00000800
45 #define OMNI_MANAGE_FIREWALL 0x00001000
46 #define OMNI_USE_PKTINFO     0x00002000
47 #define OMNI_USE_CONNECTED   0x00004000
48 #define OMNI_WANT_DEFER_ACCEPT 0x00008000
49 /* room in the middle */
50 #define OMNI_WANT_KEEPALIVE  0x80000000
51 
52 struct  omni_request_struct {
53   int32_t    send_buf_size;         /* SO_SNDBUF */
54   uint32_t   send_size;             /* bytes per send() call */
55   uint32_t   send_alignment;        /* alignment of send buffer */
56   uint32_t   send_offset;           /* offset from send alignment */
57   uint32_t   send_width;            /* number of send buffers to use */
58   int32_t    request_size;          /* size of a request */
59 
60   int32_t    recv_buf_size;         /* SO_RCVBUF */
61   uint32_t   receive_size;          /* size of buffers in recv */
62   uint32_t   recv_alignment;        /* alignment of recv buffer */
63   uint32_t   recv_offset;           /* offset from recv alignment */
64   uint32_t   recv_width;            /* number of recv buffers to use */
65   int32_t    response_size;         /* size of a response */
66 
67   uint32_t   flags;                 /* to convey things that didn't
68 				       really need to burn an entire
69 				       int */
70 
71   float      cpu_rate;       /* do we know how fast the cpu is already? */
72 
73   int32_t    test_length;    /* how long is the test? */
74 
75   uint32_t   so_rcvavoid;    /* avoid copies on recv? */
76   uint32_t   so_sndavoid;    /* avoid copies on send? */
77   uint32_t   send_dirty_count; /* bytes to dirty before calling send */
78   uint32_t   recv_dirty_count; /* bytes to dirty before calling recv */
79   uint32_t   recv_clean_count; /* bytes to access before calling recv */
80 
81   uint32_t   data_port;     /* what port number should netserver use? */
82   uint32_t   ipfamily;      /* address family of the data connection */
83   uint32_t   socket_type;   /* dgram? stream? other? */
84   uint32_t   protocol;      /* the protocol of the data connection */
85   uint32_t   direction;     /* which way flows the data? */
86   uint32_t   netperf_port;  /* when netserver needs netperf's data port */
87   uint32_t   interval_burst;/* how many things to do each interval */
88   uint32_t   interval_usecs;/* how long each interval should be */
89   uint32_t   netperf_ip[4]; /* when netserver needs netperf's data IP */
90   uint32_t   netserver_ip[4]; /* when netperf tells netserver his IP */
91   int32_t    socket_prio; /* what netserver should use for socket prio */
92   int32_t    socket_tos;  /* what netserver should use for socket tos */
93   /* there are 38 "ints" above here, add another and you will need to
94      adjust the define below */
95 #define OMNI_REQUEST_CONV_CUTOFF 38
96   char       cong_control[16]; /* the requested congestion control alg */
97   char       fill_file[32]; /* file from which netserver fills bufs */
98   /* total sizeof must be <= MAXSPECDATA*sizeof(int) */
99 };
100 
101 struct  omni_response_struct {
102   int32_t    recv_buf_size;
103   uint32_t   receive_size;
104   int32_t    recv_width;
105 
106   int32_t    send_buf_size;
107   uint32_t   send_size;
108   int32_t    send_width;
109 
110   uint32_t   flags;
111 
112   float      cpu_rate;
113 
114   uint32_t   test_length;
115 
116   uint32_t   so_rcvavoid;
117   uint32_t   so_sndavoid;
118 
119   uint32_t   data_port;     /* connect to this port number */
120 
121   uint32_t   interval_burst;/* how many things to do each interval */
122   uint32_t   interval_usecs;/* how long each interval should be */
123   /* these are here because they can be checked before actual data
124      connections are made, and the omni_results_struct is already
125      full */
126   uint32_t   cpu_frequency;  /* this should be megahertz */
127   uint32_t   security_info;
128   int32_t    socket_prio;
129   int32_t    socket_tos;
130   /* there are 18 ints above here, add another and you need to adjust
131      the define below */
132 #define OMNI_RESPONSE_CONV_CUTOFF 18
133   char       system_model[33];
134   char       cpu_model[80];  /* seems like an awful lot doesn't
135 				it. some clever person at Intel
136 				decided to give Montecito processors a
137 				name that long - and still didn't
138 				include the 9NNN model number! */
139   char       security_string[16];
140   /* total sizeof must be <= MAXSPECDATA*sizeof(int) */
141 };
142 
143 struct omni_results_struct {
144   uint32_t   bytes_received_hi;  /* why? because we cannot easily send */
145   uint32_t   bytes_received_lo;  /* uint64_t or doubles between endianess */
146   uint32_t   recv_calls;
147   int32_t    recv_buf_size; /* SO_RCVBUF at end of test */
148 
149   uint32_t   bytes_sent_hi;
150   uint32_t   bytes_sent_lo;
151   uint32_t   send_calls;
152   int32_t    send_buf_size; /* SO_SNDBUF at end of test */
153   uint32_t   failed_sends;
154   uint32_t   trans_received;
155 
156   float      elapsed_time;  /* length of test in seconds */
157 
158   float      cpu_util;
159   float      cpu_percent_user;
160   float      cpu_percent_system;
161   float      cpu_percent_iowait;
162   float      cpu_percent_irq;
163   float      cpu_percent_swintr;
164   float      serv_dem;
165   uint32_t   cpu_method;    /* how was CPU util measured? */
166   uint32_t   num_cpus;      /* number of CPUs in remote */
167 
168   int32_t    peak_cpu_id;   /* ID of the most utilized CPU */
169   float      peak_cpu_util; /* its individual utilization */
170   int32_t    vendor;
171   int32_t    device;        /* pci device id of the probable egress
172 			       interface */
173   int32_t    subvendor;
174   int32_t    subdevice;
175   int32_t    transport_retrans;
176   /* there are 27 ints above here, add another and you need to adjust
177      the define below */
178   #define OMNI_RESULTS_CONV_CUTOFF 27
179   char       ifname[16];    /* the probable egress interface */
180   char       driver[32];    /* size based on linux/ethtool.h */
181   char       version[32];
182   char       firmware[32];
183   char       bus[32];
184   char       ifslot[16];    /* slot id of the probable egress interface */
185   char       cong_control[16]; /* what the congestion control alg was */
186   /* total sizeof must be <= MAXSPECDATA*sizeof(int) */
187 };
188 
189 #endif /* WANT_OMNI */
190 
191 struct	tcp_stream_request_struct {
192   int	send_buf_size;
193   int	recv_buf_size;	/* how big does the client want it - the */
194 			/* receive socket buffer that is */
195   int	receive_size;   /* how many bytes do we want to receive at one */
196 			/* time? */
197   int	recv_alignment; /* what is the alignment of the receive */
198 			/* buffer? */
199   int	recv_offset;    /* and at what offset from that alignment? */
200   int	no_delay;       /* do we disable the nagle algorithm for send */
201 			/* coalescing? */
202   int	measure_cpu;	/* does the client want server cpu utilization */
203 			/* measured? */
204   float	cpu_rate;	/* do we know how fast the cpu is already? */
205   int	test_length;	/* how long is the test?		*/
206   int	so_rcvavoid;    /* do we want the remote to avoid copies on */
207 			/* receives? */
208   int	so_sndavoid;    /* do we want the remote to avoid send copies? */
209   int   dirty_count;    /* how many integers in the receive buffer */
210 			/* should be made dirty before calling recv? */
211   int   clean_count;    /* how many integers should be read from the */
212 			/* recv buffer before calling recv? */
213   int   port;           /* the port to which the recv side should bind
214 			   to allow netperf to run through those evil
215 			   firewall things */
216   int   ipfamily;       /* the address family of ipaddress */
217 };
218 
219 struct	tcp_stream_response_struct {
220   int	recv_buf_size;	/* how big does the client want it	*/
221   int	receive_size;
222   int	no_delay;
223   int	measure_cpu;	/* does the client want server cpu	*/
224   int	test_length;	/* how long is the test?		*/
225   int	send_buf_size;
226   int	data_port_number;	/* connect to me here	*/
227   float	cpu_rate;		/* could we measure	*/
228   int	so_rcvavoid;	/* could the remote avoid receive copies? */
229   int	so_sndavoid;	/* could the remote avoid send copies? */
230 };
231 
232 struct tcp_stream_results_struct {
233   double         bytes_received;
234   unsigned int	 recv_calls;
235   float	         elapsed_time;	/* how long the test ran */
236   float	         cpu_util;	/* -1 if not measured */
237   float	         serv_dem;	/* -1 if not measured */
238   int            cpu_method;    /* how was cpu util measured? */
239   int            num_cpus;      /* how many CPUs had the remote? */
240   int            recv_buf_size; /* how large was it at the end? */
241   int            send_buf_size; /* how large was it at the end? */
242 };
243 
244 struct	tcp_maerts_request_struct {
245   int	send_buf_size;
246   int	recv_buf_size;	/* how big does the client want it - the */
247 			/* receive socket buffer that is */
248   int	send_size;      /* how many bytes do we want netserver to send
249 			   at one time? */
250   int	send_alignment; /* what is the alignment of the send */
251 			/* buffer? */
252   int	send_offset;    /* and at what offset from that alignment? */
253   int	no_delay;       /* do we disable the nagle algorithm for send */
254 			/* coalescing? */
255   int	measure_cpu;	/* does the client want server cpu utilization */
256 			/* measured? */
257   float	cpu_rate;	/* do we know how fast the cpu is already? */
258   int	test_length;	/* how long is the test?		*/
259   int	so_rcvavoid;    /* do we want the remote to avoid copies on */
260 			/* receives? */
261   int	so_sndavoid;    /* do we want the remote to avoid send copies? */
262   int   dirty_count;    /* how many integers in the send buffer */
263 			/* should be made dirty before calling recv? */
264   int   clean_count;    /* how many integers should be read from the */
265 			/* recv buffer before calling recv? */
266   int   port;           /* the port to which the recv side should bind
267 			   to allow netperf to run through those evil
268 			   firewall things */
269   int   ipfamily;
270 };
271 
272 struct	tcp_maerts_response_struct {
273   int	recv_buf_size;	/* how big does the client want it	*/
274   int	send_size;
275   int	no_delay;
276   int	measure_cpu;	/* does the client want server cpu	*/
277   int	test_length;	/* how long is the test?		*/
278   int	send_buf_size;
279   int	data_port_number;	/* connect to me here	*/
280   float	cpu_rate;		/* could we measure	*/
281   int	so_rcvavoid;	/* could the remote avoid receive copies? */
282   int	so_sndavoid;	/* could the remote avoid send copies? */
283 };
284 
285 struct tcp_maerts_results_struct {
286   double         bytes_sent;
287   unsigned int	 send_calls;
288   float	         elapsed_time;	/* how long the test ran */
289   float	         cpu_util;	/* -1 if not measured */
290   float	         serv_dem;	/* -1 if not measured */
291   int            cpu_method;    /* how was cpu util measured? */
292   int            num_cpus;      /* how many CPUs had the remote? */
293 };
294 
295 struct	tcp_rr_request_struct {
296   int	recv_buf_size;	/* how big does the client want it	*/
297   int	send_buf_size;
298   int	recv_alignment;
299   int	recv_offset;
300   int	send_alignment;
301   int	send_offset;
302   int	request_size;
303   int	response_size;
304   int	no_delay;
305   int	measure_cpu;	/* does the client want server cpu	*/
306   float	cpu_rate;	/* do we know how fast the cpu is?	*/
307   int	test_length;	/* how long is the test?		*/
308   int	so_rcvavoid;    /* do we want the remote to avoid receive */
309 			/* copies? */
310   int	so_sndavoid;    /* do we want the remote to avoid send copies? */
311   int   port;           /* the port to which the recv side should bind
312 			   to allow netperf to run through those evil
313 			   firewall things */
314   int   ipfamily;
315 };
316 
317 struct	tcp_rr_response_struct {
318   int	recv_buf_size;	/* how big does the client want it	*/
319   int	no_delay;
320   int	measure_cpu;	/* does the client want server cpu	*/
321   int	test_length;	/* how long is the test?		*/
322   int	send_buf_size;
323   int	data_port_number;	/* connect to me here	*/
324   float	cpu_rate;		/* could we measure	*/
325   int	so_rcvavoid;	/* could the remote avoid receive copies? */
326   int	so_sndavoid;	/* could the remote avoid send copies? */
327 };
328 
329 struct tcp_rr_results_struct {
330   unsigned int  bytes_received;	/* ignored initially */
331   unsigned int	recv_calls;	/* ignored initially */
332   unsigned int	trans_received;	/* not ignored  */
333   float	        elapsed_time;	/* how long the test ran */
334   float	        cpu_util;	/* -1 if not measured */
335   float	        serv_dem;	/* -1 if not measured */
336   int           cpu_method;    /* how was cpu util measured? */
337   int           num_cpus;      /* how many CPUs had the remote? */
338 };
339 
340 struct	tcp_conn_rr_request_struct {
341   int	recv_buf_size;	/* how big does the client want it	*/
342   int	send_buf_size;
343   int	recv_alignment;
344   int	recv_offset;
345   int	send_alignment;
346   int	send_offset;
347   int	request_size;
348   int	response_size;
349   int	no_delay;
350   int	measure_cpu;	/* does the client want server cpu	*/
351   float	cpu_rate;	/* do we know how fast the cpu is?	*/
352   int	test_length;	/* how long is the test?		*/
353   int	so_rcvavoid;    /* do we want the remote to avoid receive */
354 			/* copies? */
355   int	so_sndavoid;    /* do we want the remote to avoid send copies? */
356   int   port;           /* the port to which the recv side should bind
357 			   to allow netperf to run through those evil
358 			   firewall things */
359   int   ipfamily;
360 };
361 
362 
363 struct	tcp_conn_rr_response_struct {
364   int	recv_buf_size;	/* how big does the client want it	*/
365   int	no_delay;
366   int	measure_cpu;	/* does the client want server cpu	*/
367   int	test_length;	/* how long is the test?		*/
368   int	send_buf_size;
369   int	data_port_number;	/* connect to me here	*/
370   float	cpu_rate;		/* could we measure	*/
371   int	so_rcvavoid;	/* could the remote avoid receive copies? */
372   int	so_sndavoid;	/* could the remote avoid send copies? */
373 };
374 
375 struct tcp_conn_rr_results_struct {
376   unsigned int	bytes_received;	/* ignored initially */
377   unsigned int	recv_calls;	/* ignored initially */
378   unsigned int	trans_received;	/* not ignored  */
379   float	        elapsed_time;	/* how long the test ran */
380   float	        cpu_util;	/* -1 if not measured */
381   float	        serv_dem;	/* -1 if not measured */
382   int           cpu_method;    /* how was cpu util measured? */
383   int           num_cpus;      /* how many CPUs had the remote? */
384 };
385 
386 struct	tcp_tran_rr_request_struct {
387   int	recv_buf_size;	/* how big does the client want it	*/
388   int	send_buf_size;
389   int	recv_alignment;
390   int	recv_offset;
391   int	send_alignment;
392   int	send_offset;
393   int	request_size;
394   int	response_size;
395   int	no_delay;
396   int	measure_cpu;	/* does the client want server cpu	*/
397   float	cpu_rate;	/* do we know how fast the cpu is?	*/
398   int	test_length;	/* how long is the test?		*/
399   int	so_rcvavoid;    /* do we want the remote to avoid receive */
400 			/* copies? */
401   int	so_sndavoid;    /* do we want the remote to avoid send copies? */
402   int   port;           /* the port to which the recv side should bind
403 			   to allow netperf to run through those evil
404 			   firewall things */
405   int   ipfamily;
406 };
407 
408 
409 struct	tcp_tran_rr_response_struct {
410   int	recv_buf_size;	/* how big does the client want it	*/
411   int	no_delay;
412   int	measure_cpu;	/* does the client want server cpu	*/
413   int	test_length;	/* how long is the test?		*/
414   int	send_buf_size;
415   int	data_port_number;	/* connect to me here	*/
416   float	cpu_rate;		/* could we measure	*/
417   int	so_rcvavoid;	/* could the remote avoid receive copies? */
418   int	so_sndavoid;	/* could the remote avoid send copies? */
419 };
420 
421 struct tcp_tran_rr_results_struct {
422   unsigned int	bytes_received;	/* ignored initially */
423   unsigned int	recv_calls;	/* ignored initially */
424   unsigned int	trans_received;	/* not ignored  */
425   float	        elapsed_time;	/* how long the test ran */
426   float	        cpu_util;	/* -1 if not measured */
427   float	        serv_dem;	/* -1 if not measured */
428   int           cpu_method;    /* how was cpu util measured? */
429   int           num_cpus;      /* how many CPUs had the remote? */
430 
431 };
432 
433 struct	udp_stream_request_struct {
434   int	recv_buf_size;
435   int	message_size;
436   int   recv_connected;
437   int	recv_alignment;
438   int	recv_offset;
439   int	checksum_off;
440   int	measure_cpu;
441   float	cpu_rate;
442   int	test_length;
443   int	so_rcvavoid;    /* do we want the remote to avoid receive */
444 			/* copies? */
445   int	so_sndavoid;    /* do we want the remote to avoid send copies? */
446   int   port;           /* the port to which the recv side should bind
447 			   to allow netperf to run through those evil
448 			   firewall things */
449   int   ipfamily;
450 
451 };
452 
453 struct	udp_stream_response_struct {
454   int	recv_buf_size;
455   int	send_buf_size;
456   int	measure_cpu;
457   int	test_length;
458   int	data_port_number;
459   float	cpu_rate;
460   int	so_rcvavoid;	/* could the remote avoid receive copies? */
461   int	so_sndavoid;	/* could the remote avoid send copies? */
462 };
463 
464 struct	udp_stream_results_struct {
465   unsigned int	messages_recvd;
466   unsigned int	bytes_received;
467   float	        elapsed_time;
468   float	        cpu_util;
469   int           cpu_method;    /* how was cpu util measured? */
470   int           num_cpus;      /* how many CPUs had the remote? */
471 };
472 
473 
474 struct	udp_rr_request_struct {
475   int	recv_buf_size;	/* how big does the client want it	*/
476   int	send_buf_size;
477   int	recv_alignment;
478   int	recv_offset;
479   int	send_alignment;
480   int	send_offset;
481   int	request_size;
482   int	response_size;
483   int	no_delay;
484   int	measure_cpu;	/* does the client want server cpu	*/
485   float	cpu_rate;	/* do we know how fast the cpu is?	*/
486   int	test_length;	/* how long is the test?		*/
487   int	so_rcvavoid;    /* do we want the remote to avoid receive */
488 			/* copies? */
489   int	so_sndavoid;    /* do we want the remote to avoid send copies? */
490   int   port;           /* the port to which the recv side should bind
491 			   to allow netperf to run through those evil
492 			   firewall things */
493   int   ipfamily;
494 };
495 
496 struct	udp_rr_response_struct {
497   int	recv_buf_size;	/* how big does the client want it	*/
498   int	no_delay;
499   int	measure_cpu;	/* does the client want server cpu	*/
500   int	test_length;	/* how long is the test?		*/
501   int	send_buf_size;
502   int	data_port_number;	/* connect to me here	*/
503   float	cpu_rate;		/* could we measure	*/
504   int	so_rcvavoid;	/* could the remote avoid receive copies? */
505   int	so_sndavoid;	/* could the remote avoid send copies? */
506 };
507 
508 struct udp_rr_results_struct {
509   unsigned int	bytes_received;	/* ignored initially */
510   unsigned int	recv_calls;	/* ignored initially */
511   unsigned int	trans_received;	/* not ignored  */
512   float	        elapsed_time;	/* how long the test ran */
513   float	        cpu_util;	/* -1 if not measured */
514   float	        serv_dem;	/* -1 if not measured */
515   int           cpu_method;    /* how was cpu util measured? */
516   int           num_cpus;      /* how many CPUs had the remote? */
517 };
518 
519 struct	tcp_cc_request_struct {
520   int	recv_buf_size;	/* how big does the client want it	*/
521   int	send_buf_size;
522   int	recv_alignment;
523   int	recv_offset;
524   int	send_alignment;
525   int	send_offset;
526   int	request_size;
527   int	response_size;
528   int	no_delay;
529   int	measure_cpu;	/* does the client want server cpu	*/
530   float	cpu_rate;	/* do we know how fast the cpu is?	*/
531   int	test_length;	/* how long is the test?		*/
532   int	so_rcvavoid;    /* do we want the remote to avoid receive */
533 			/* copies? */
534   int	so_sndavoid;    /* do we want the remote to avoid send copies? */
535   int   port;           /* the port to which the recv side should bind
536 			   to allow netperf to run through those evil
537 			   firewall things */
538   int   ipfamily;
539 };
540 
541 
542 struct	tcp_cc_response_struct {
543   int	recv_buf_size;	/* how big does the client want it	*/
544   int	no_delay;
545   int	measure_cpu;	/* does the client want server cpu	*/
546   int	test_length;	/* how long is the test?		*/
547   int	send_buf_size;
548   int	data_port_number;	/* connect to me here	*/
549   float	cpu_rate;		/* could we measure	*/
550   int	so_rcvavoid;	/* could the remote avoid receive copies? */
551   int	so_sndavoid;	/* could the remote avoid send copies? */
552 };
553 
554 struct tcp_cc_results_struct {
555   unsigned int	bytes_received;	/* ignored initially */
556   unsigned int	recv_calls;	/* ignored initially */
557   unsigned int	trans_received;	/* not ignored  */
558   float	        elapsed_time;	/* how long the test ran */
559   float	        cpu_util;	/* -1 if not measured */
560   float	        serv_dem;	/* -1 if not measured */
561   int           cpu_method;     /* how was cpu util measured? */
562   int           num_cpus;       /* how many CPUs had the remote? */
563 };
564 
565 extern int
566   socket_type,      /* initially used by the "omni" tests */
567   rss_size_req,     /* requested remote socket send buffer size */
568   rsr_size_req,     /* requested remote socket recv buffer size */
569   rss_size,         /* remote socket send buffer size */
570   rsr_size,         /* remote socket recv buffer size */
571   rsr_size_end,
572   rss_size_end,
573   lss_size_req,     /* requested local socket send buffer size */
574   lsr_size_req,     /* requested local socket recv buffer size */
575   lss_size,         /* local  socket send buffer size */
576   lsr_size,         /* local  socket recv buffer size */
577   lss_size_end,
578   lsr_size_end,
579   req_size,         /* request size */
580   rsp_size,         /* response size */
581   send_size,        /* how big are individual sends */
582   recv_size,        /* how big are individual receives */
583   loc_nodelay,      /* don't/do use NODELAY locally */
584   rem_nodelay,      /* don't/do use NODELAY remotely */
585   loc_sndavoid,     /* avoid send copies locally */
586   loc_rcvavoid,     /* avoid recv copies locally */
587   rem_sndavoid,     /* avoid send copies remotely */
588   rem_rcvavoid,     /* avoid recv_copies remotely */
589   routing_allowed,  /* do we set/clear SO_DONTROUTE on data sock */
590   multicast_ttl,    /* what should the TTL be on mcast dgrams */
591   want_keepalive,   /* do we bother setting SO_KEEPALIVE? */
592   transport_mss_req;
593 
594 #ifdef WANT_OMNI
595 extern void scan_omni_args(int argc, char *argv[]);
596 #endif
597 extern void scan_sockets_args(int argc, char *argv[]);
598 extern struct addrinfo *complete_addrinfo(char *controlhost,
599 				   char *data_address,
600 				   char *port,
601 				   int family,
602 				   int type,
603 				   int protocol,
604 				   int flags);
605 extern void complete_addrinfos(struct addrinfo **remote,
606 			       struct addrinfo **local,
607 			       char remote_host[],
608 			       int type,
609 			       int protocol,
610 			       int flags);
611 extern int af_to_nf(int af);
612 extern int nf_to_af(int nf);
613 extern int nst_to_hst(int nst);
614 extern int hst_to_nst(int hst);
615 extern char *hst_to_str(int hst);
616 extern char *protocol_to_str(int protocol);
617 extern void print_top_test_header(char test_name[],
618 				  struct addrinfo *source,
619 				  struct addrinfo *destination);
620 extern void set_port_number(struct addrinfo *res,
621 			    unsigned short port);
622 extern void set_hostname_and_port(char *hostname,
623 				  char *portstr,
624 				  int family,
625 				  int port);
626 extern void set_sockaddr_family_addr_port(struct sockaddr_storage *sockaddr,
627 					  int family,
628 					  void *addr,
629 					  int port);
630 extern int  get_sockaddr_family_addr_port(struct sockaddr_storage *sockaddr,
631 					  int family,
632 					  void *addr,
633 					  int *port);
634 extern void send_tcp_mss(char remote_host[]);
635 extern void send_tcp_stream(char remote_host[]);
636 extern void send_tcp_maerts(char remote_host[]);
637 extern void send_tcp_rr(char remote_host[]);
638 extern void send_tcp_conn_rr(char remote_host[]);
639 extern void send_tcp_cc(char remote_host[]);
640 extern void send_udp_stream(char remote_host[]);
641 extern void send_udp_rr(char remote_host[]);
642 
643 extern void send_omni(char remote_host[]);
644 extern void print_uuid(char remote_host[]);
645 extern void recv_omni();
646 
647 extern void recv_tcp_stream();
648 extern void recv_tcp_maerts();
649 extern void recv_tcp_rr();
650 extern void recv_tcp_conn_rr();
651 extern void recv_tcp_cc();
652 extern void recv_udp_stream();
653 extern void recv_udp_rr();
654 
655 extern void loc_cpu_rate();
656 extern void rem_cpu_rate();
657 
658 #ifdef HAVE_ICSC_EXS
659 extern void send_exs_tcp_stream(char remotehost[]);
660 #endif /* HAVE_ICSC_EXS */
661 
662 #ifdef HAVE_SENDFILE
663 extern void sendfile_tcp_stream(char remotehost[]);
664 #endif /* HAVE_SENDFILE */
665 
666 #if !defined(HAVE_STRUCT_SOCKADDR_STORAGE) && !defined(sockaddr_storage)
667 #define sockaddr_storage sockaddr_in
668 #endif
669 
670 #ifdef DO_NBRR
671 extern void send_tcp_nbrr(char remote_host[]);
672 
673 extern void recv_tcp_nbrr();
674 #endif
675 
676 extern SOCKET create_data_socket(struct addrinfo *res);
677