1*7ab6e6acSAndroid Build Coastguard Worker /*
2*7ab6e6acSAndroid Build Coastguard Worker * iperf, Copyright (c) 2014, 2016, 2017, The Regents of the University of
3*7ab6e6acSAndroid Build Coastguard Worker * California, through Lawrence Berkeley National Laboratory (subject
4*7ab6e6acSAndroid Build Coastguard Worker * to receipt of any required approvals from the U.S. Dept. of
5*7ab6e6acSAndroid Build Coastguard Worker * Energy). All rights reserved.
6*7ab6e6acSAndroid Build Coastguard Worker *
7*7ab6e6acSAndroid Build Coastguard Worker * If you have questions about your rights to use or distribute this
8*7ab6e6acSAndroid Build Coastguard Worker * software, please contact Berkeley Lab's Technology Transfer
9*7ab6e6acSAndroid Build Coastguard Worker * Department at [email protected].
10*7ab6e6acSAndroid Build Coastguard Worker *
11*7ab6e6acSAndroid Build Coastguard Worker * NOTICE. This software is owned by the U.S. Department of Energy.
12*7ab6e6acSAndroid Build Coastguard Worker * As such, the U.S. Government has been granted for itself and others
13*7ab6e6acSAndroid Build Coastguard Worker * acting on its behalf a paid-up, nonexclusive, irrevocable,
14*7ab6e6acSAndroid Build Coastguard Worker * worldwide license in the Software to reproduce, prepare derivative
15*7ab6e6acSAndroid Build Coastguard Worker * works, and perform publicly and display publicly. Beginning five
16*7ab6e6acSAndroid Build Coastguard Worker * (5) years after the date permission to assert copyright is obtained
17*7ab6e6acSAndroid Build Coastguard Worker * from the U.S. Department of Energy, and subject to any subsequent
18*7ab6e6acSAndroid Build Coastguard Worker * five (5) year renewals, the U.S. Government is granted for itself
19*7ab6e6acSAndroid Build Coastguard Worker * and others acting on its behalf a paid-up, nonexclusive,
20*7ab6e6acSAndroid Build Coastguard Worker * irrevocable, worldwide license in the Software to reproduce,
21*7ab6e6acSAndroid Build Coastguard Worker * prepare derivative works, distribute copies to the public, perform
22*7ab6e6acSAndroid Build Coastguard Worker * publicly and display publicly, and to permit others to do so.
23*7ab6e6acSAndroid Build Coastguard Worker *
24*7ab6e6acSAndroid Build Coastguard Worker * This code is distributed under a BSD style license, see the LICENSE
25*7ab6e6acSAndroid Build Coastguard Worker * file for complete information.
26*7ab6e6acSAndroid Build Coastguard Worker */
27*7ab6e6acSAndroid Build Coastguard Worker /* iperf_util.c
28*7ab6e6acSAndroid Build Coastguard Worker *
29*7ab6e6acSAndroid Build Coastguard Worker * Iperf utility functions
30*7ab6e6acSAndroid Build Coastguard Worker *
31*7ab6e6acSAndroid Build Coastguard Worker */
32*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_config.h"
33*7ab6e6acSAndroid Build Coastguard Worker
34*7ab6e6acSAndroid Build Coastguard Worker #include <stdio.h>
35*7ab6e6acSAndroid Build Coastguard Worker #include <signal.h>
36*7ab6e6acSAndroid Build Coastguard Worker #include <stdlib.h>
37*7ab6e6acSAndroid Build Coastguard Worker #include <unistd.h>
38*7ab6e6acSAndroid Build Coastguard Worker #include <string.h>
39*7ab6e6acSAndroid Build Coastguard Worker #include <stdarg.h>
40*7ab6e6acSAndroid Build Coastguard Worker #include <sys/select.h>
41*7ab6e6acSAndroid Build Coastguard Worker #include <sys/types.h>
42*7ab6e6acSAndroid Build Coastguard Worker #include <sys/time.h>
43*7ab6e6acSAndroid Build Coastguard Worker #include <sys/resource.h>
44*7ab6e6acSAndroid Build Coastguard Worker #include <sys/utsname.h>
45*7ab6e6acSAndroid Build Coastguard Worker #include <time.h>
46*7ab6e6acSAndroid Build Coastguard Worker #include <errno.h>
47*7ab6e6acSAndroid Build Coastguard Worker #include <fcntl.h>
48*7ab6e6acSAndroid Build Coastguard Worker
49*7ab6e6acSAndroid Build Coastguard Worker #include "cjson.h"
50*7ab6e6acSAndroid Build Coastguard Worker #include "iperf.h"
51*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_api.h"
52*7ab6e6acSAndroid Build Coastguard Worker
53*7ab6e6acSAndroid Build Coastguard Worker /*
54*7ab6e6acSAndroid Build Coastguard Worker * Read entropy from /dev/urandom
55*7ab6e6acSAndroid Build Coastguard Worker * Errors are fatal.
56*7ab6e6acSAndroid Build Coastguard Worker * Returns 0 on success.
57*7ab6e6acSAndroid Build Coastguard Worker */
readentropy(void * out,size_t outsize)58*7ab6e6acSAndroid Build Coastguard Worker int readentropy(void *out, size_t outsize)
59*7ab6e6acSAndroid Build Coastguard Worker {
60*7ab6e6acSAndroid Build Coastguard Worker static FILE *frandom;
61*7ab6e6acSAndroid Build Coastguard Worker static const char rndfile[] = "/dev/urandom";
62*7ab6e6acSAndroid Build Coastguard Worker
63*7ab6e6acSAndroid Build Coastguard Worker if (!outsize) return 0;
64*7ab6e6acSAndroid Build Coastguard Worker
65*7ab6e6acSAndroid Build Coastguard Worker if (frandom == NULL) {
66*7ab6e6acSAndroid Build Coastguard Worker frandom = fopen(rndfile, "rb");
67*7ab6e6acSAndroid Build Coastguard Worker if (frandom == NULL) {
68*7ab6e6acSAndroid Build Coastguard Worker iperf_errexit(NULL, "error - failed to open %s: %s\n",
69*7ab6e6acSAndroid Build Coastguard Worker rndfile, strerror(errno));
70*7ab6e6acSAndroid Build Coastguard Worker }
71*7ab6e6acSAndroid Build Coastguard Worker setbuf(frandom, NULL);
72*7ab6e6acSAndroid Build Coastguard Worker }
73*7ab6e6acSAndroid Build Coastguard Worker if (fread(out, 1, outsize, frandom) != outsize) {
74*7ab6e6acSAndroid Build Coastguard Worker iperf_errexit(NULL, "error - failed to read %s: %s\n",
75*7ab6e6acSAndroid Build Coastguard Worker rndfile,
76*7ab6e6acSAndroid Build Coastguard Worker feof(frandom) ? "EOF" : strerror(errno));
77*7ab6e6acSAndroid Build Coastguard Worker }
78*7ab6e6acSAndroid Build Coastguard Worker return 0;
79*7ab6e6acSAndroid Build Coastguard Worker }
80*7ab6e6acSAndroid Build Coastguard Worker
81*7ab6e6acSAndroid Build Coastguard Worker
82*7ab6e6acSAndroid Build Coastguard Worker /*
83*7ab6e6acSAndroid Build Coastguard Worker * Fills buffer with repeating pattern (similar to pattern that used in iperf2)
84*7ab6e6acSAndroid Build Coastguard Worker */
fill_with_repeating_pattern(void * out,size_t outsize)85*7ab6e6acSAndroid Build Coastguard Worker void fill_with_repeating_pattern(void *out, size_t outsize)
86*7ab6e6acSAndroid Build Coastguard Worker {
87*7ab6e6acSAndroid Build Coastguard Worker size_t i;
88*7ab6e6acSAndroid Build Coastguard Worker int counter = 0;
89*7ab6e6acSAndroid Build Coastguard Worker char *buf = (char *)out;
90*7ab6e6acSAndroid Build Coastguard Worker
91*7ab6e6acSAndroid Build Coastguard Worker if (!outsize) return;
92*7ab6e6acSAndroid Build Coastguard Worker
93*7ab6e6acSAndroid Build Coastguard Worker for (i = 0; i < outsize; i++) {
94*7ab6e6acSAndroid Build Coastguard Worker buf[i] = (char)('0' + counter);
95*7ab6e6acSAndroid Build Coastguard Worker if (counter >= 9)
96*7ab6e6acSAndroid Build Coastguard Worker counter = 0;
97*7ab6e6acSAndroid Build Coastguard Worker else
98*7ab6e6acSAndroid Build Coastguard Worker counter++;
99*7ab6e6acSAndroid Build Coastguard Worker }
100*7ab6e6acSAndroid Build Coastguard Worker }
101*7ab6e6acSAndroid Build Coastguard Worker
102*7ab6e6acSAndroid Build Coastguard Worker
103*7ab6e6acSAndroid Build Coastguard Worker /* make_cookie
104*7ab6e6acSAndroid Build Coastguard Worker *
105*7ab6e6acSAndroid Build Coastguard Worker * Generate and return a cookie string
106*7ab6e6acSAndroid Build Coastguard Worker *
107*7ab6e6acSAndroid Build Coastguard Worker * Iperf uses this function to create test "cookies" which
108*7ab6e6acSAndroid Build Coastguard Worker * server as unique test identifiers. These cookies are also
109*7ab6e6acSAndroid Build Coastguard Worker * used for the authentication of stream connections.
110*7ab6e6acSAndroid Build Coastguard Worker * Assumes cookie has size (COOKIE_SIZE + 1) char's.
111*7ab6e6acSAndroid Build Coastguard Worker */
112*7ab6e6acSAndroid Build Coastguard Worker
113*7ab6e6acSAndroid Build Coastguard Worker void
make_cookie(const char * cookie)114*7ab6e6acSAndroid Build Coastguard Worker make_cookie(const char *cookie)
115*7ab6e6acSAndroid Build Coastguard Worker {
116*7ab6e6acSAndroid Build Coastguard Worker unsigned char *out = (unsigned char*)cookie;
117*7ab6e6acSAndroid Build Coastguard Worker size_t pos;
118*7ab6e6acSAndroid Build Coastguard Worker static const unsigned char rndchars[] = "abcdefghijklmnopqrstuvwxyz234567";
119*7ab6e6acSAndroid Build Coastguard Worker
120*7ab6e6acSAndroid Build Coastguard Worker readentropy(out, COOKIE_SIZE);
121*7ab6e6acSAndroid Build Coastguard Worker for (pos = 0; pos < (COOKIE_SIZE - 1); pos++) {
122*7ab6e6acSAndroid Build Coastguard Worker out[pos] = rndchars[out[pos] % (sizeof(rndchars) - 1)];
123*7ab6e6acSAndroid Build Coastguard Worker }
124*7ab6e6acSAndroid Build Coastguard Worker out[pos] = '\0';
125*7ab6e6acSAndroid Build Coastguard Worker }
126*7ab6e6acSAndroid Build Coastguard Worker
127*7ab6e6acSAndroid Build Coastguard Worker
128*7ab6e6acSAndroid Build Coastguard Worker /* is_closed
129*7ab6e6acSAndroid Build Coastguard Worker *
130*7ab6e6acSAndroid Build Coastguard Worker * Test if the file descriptor fd is closed.
131*7ab6e6acSAndroid Build Coastguard Worker *
132*7ab6e6acSAndroid Build Coastguard Worker * Iperf uses this function to test whether a TCP stream socket
133*7ab6e6acSAndroid Build Coastguard Worker * is closed, because accepting and denying an invalid connection
134*7ab6e6acSAndroid Build Coastguard Worker * in iperf_tcp_accept is not considered an error.
135*7ab6e6acSAndroid Build Coastguard Worker */
136*7ab6e6acSAndroid Build Coastguard Worker
137*7ab6e6acSAndroid Build Coastguard Worker int
is_closed(int fd)138*7ab6e6acSAndroid Build Coastguard Worker is_closed(int fd)
139*7ab6e6acSAndroid Build Coastguard Worker {
140*7ab6e6acSAndroid Build Coastguard Worker struct timeval tv;
141*7ab6e6acSAndroid Build Coastguard Worker fd_set readset;
142*7ab6e6acSAndroid Build Coastguard Worker
143*7ab6e6acSAndroid Build Coastguard Worker FD_ZERO(&readset);
144*7ab6e6acSAndroid Build Coastguard Worker FD_SET(fd, &readset);
145*7ab6e6acSAndroid Build Coastguard Worker tv.tv_sec = 0;
146*7ab6e6acSAndroid Build Coastguard Worker tv.tv_usec = 0;
147*7ab6e6acSAndroid Build Coastguard Worker
148*7ab6e6acSAndroid Build Coastguard Worker if (select(fd+1, &readset, NULL, NULL, &tv) < 0) {
149*7ab6e6acSAndroid Build Coastguard Worker if (errno == EBADF)
150*7ab6e6acSAndroid Build Coastguard Worker return 1;
151*7ab6e6acSAndroid Build Coastguard Worker }
152*7ab6e6acSAndroid Build Coastguard Worker return 0;
153*7ab6e6acSAndroid Build Coastguard Worker }
154*7ab6e6acSAndroid Build Coastguard Worker
155*7ab6e6acSAndroid Build Coastguard Worker
156*7ab6e6acSAndroid Build Coastguard Worker double
timeval_to_double(struct timeval * tv)157*7ab6e6acSAndroid Build Coastguard Worker timeval_to_double(struct timeval * tv)
158*7ab6e6acSAndroid Build Coastguard Worker {
159*7ab6e6acSAndroid Build Coastguard Worker double d;
160*7ab6e6acSAndroid Build Coastguard Worker
161*7ab6e6acSAndroid Build Coastguard Worker d = tv->tv_sec + tv->tv_usec / 1000000;
162*7ab6e6acSAndroid Build Coastguard Worker
163*7ab6e6acSAndroid Build Coastguard Worker return d;
164*7ab6e6acSAndroid Build Coastguard Worker }
165*7ab6e6acSAndroid Build Coastguard Worker
166*7ab6e6acSAndroid Build Coastguard Worker int
timeval_equals(struct timeval * tv0,struct timeval * tv1)167*7ab6e6acSAndroid Build Coastguard Worker timeval_equals(struct timeval * tv0, struct timeval * tv1)
168*7ab6e6acSAndroid Build Coastguard Worker {
169*7ab6e6acSAndroid Build Coastguard Worker if ( tv0->tv_sec == tv1->tv_sec && tv0->tv_usec == tv1->tv_usec )
170*7ab6e6acSAndroid Build Coastguard Worker return 1;
171*7ab6e6acSAndroid Build Coastguard Worker else
172*7ab6e6acSAndroid Build Coastguard Worker return 0;
173*7ab6e6acSAndroid Build Coastguard Worker }
174*7ab6e6acSAndroid Build Coastguard Worker
175*7ab6e6acSAndroid Build Coastguard Worker double
timeval_diff(struct timeval * tv0,struct timeval * tv1)176*7ab6e6acSAndroid Build Coastguard Worker timeval_diff(struct timeval * tv0, struct timeval * tv1)
177*7ab6e6acSAndroid Build Coastguard Worker {
178*7ab6e6acSAndroid Build Coastguard Worker double time1, time2;
179*7ab6e6acSAndroid Build Coastguard Worker
180*7ab6e6acSAndroid Build Coastguard Worker time1 = tv0->tv_sec + (tv0->tv_usec / 1000000.0);
181*7ab6e6acSAndroid Build Coastguard Worker time2 = tv1->tv_sec + (tv1->tv_usec / 1000000.0);
182*7ab6e6acSAndroid Build Coastguard Worker
183*7ab6e6acSAndroid Build Coastguard Worker time1 = time1 - time2;
184*7ab6e6acSAndroid Build Coastguard Worker if (time1 < 0)
185*7ab6e6acSAndroid Build Coastguard Worker time1 = -time1;
186*7ab6e6acSAndroid Build Coastguard Worker return time1;
187*7ab6e6acSAndroid Build Coastguard Worker }
188*7ab6e6acSAndroid Build Coastguard Worker
189*7ab6e6acSAndroid Build Coastguard Worker void
cpu_util(double pcpu[3])190*7ab6e6acSAndroid Build Coastguard Worker cpu_util(double pcpu[3])
191*7ab6e6acSAndroid Build Coastguard Worker {
192*7ab6e6acSAndroid Build Coastguard Worker static struct iperf_time last;
193*7ab6e6acSAndroid Build Coastguard Worker static clock_t clast;
194*7ab6e6acSAndroid Build Coastguard Worker static struct rusage rlast;
195*7ab6e6acSAndroid Build Coastguard Worker struct iperf_time now, temp_time;
196*7ab6e6acSAndroid Build Coastguard Worker clock_t ctemp;
197*7ab6e6acSAndroid Build Coastguard Worker struct rusage rtemp;
198*7ab6e6acSAndroid Build Coastguard Worker double timediff;
199*7ab6e6acSAndroid Build Coastguard Worker double userdiff;
200*7ab6e6acSAndroid Build Coastguard Worker double systemdiff;
201*7ab6e6acSAndroid Build Coastguard Worker
202*7ab6e6acSAndroid Build Coastguard Worker if (pcpu == NULL) {
203*7ab6e6acSAndroid Build Coastguard Worker iperf_time_now(&last);
204*7ab6e6acSAndroid Build Coastguard Worker clast = clock();
205*7ab6e6acSAndroid Build Coastguard Worker getrusage(RUSAGE_SELF, &rlast);
206*7ab6e6acSAndroid Build Coastguard Worker return;
207*7ab6e6acSAndroid Build Coastguard Worker }
208*7ab6e6acSAndroid Build Coastguard Worker
209*7ab6e6acSAndroid Build Coastguard Worker iperf_time_now(&now);
210*7ab6e6acSAndroid Build Coastguard Worker ctemp = clock();
211*7ab6e6acSAndroid Build Coastguard Worker getrusage(RUSAGE_SELF, &rtemp);
212*7ab6e6acSAndroid Build Coastguard Worker
213*7ab6e6acSAndroid Build Coastguard Worker iperf_time_diff(&now, &last, &temp_time);
214*7ab6e6acSAndroid Build Coastguard Worker timediff = iperf_time_in_usecs(&temp_time);
215*7ab6e6acSAndroid Build Coastguard Worker
216*7ab6e6acSAndroid Build Coastguard Worker userdiff = ((rtemp.ru_utime.tv_sec * 1000000.0 + rtemp.ru_utime.tv_usec) -
217*7ab6e6acSAndroid Build Coastguard Worker (rlast.ru_utime.tv_sec * 1000000.0 + rlast.ru_utime.tv_usec));
218*7ab6e6acSAndroid Build Coastguard Worker systemdiff = ((rtemp.ru_stime.tv_sec * 1000000.0 + rtemp.ru_stime.tv_usec) -
219*7ab6e6acSAndroid Build Coastguard Worker (rlast.ru_stime.tv_sec * 1000000.0 + rlast.ru_stime.tv_usec));
220*7ab6e6acSAndroid Build Coastguard Worker
221*7ab6e6acSAndroid Build Coastguard Worker pcpu[0] = (((ctemp - clast) * 1000000.0 / CLOCKS_PER_SEC) / timediff) * 100;
222*7ab6e6acSAndroid Build Coastguard Worker pcpu[1] = (userdiff / timediff) * 100;
223*7ab6e6acSAndroid Build Coastguard Worker pcpu[2] = (systemdiff / timediff) * 100;
224*7ab6e6acSAndroid Build Coastguard Worker }
225*7ab6e6acSAndroid Build Coastguard Worker
226*7ab6e6acSAndroid Build Coastguard Worker const char *
get_system_info(void)227*7ab6e6acSAndroid Build Coastguard Worker get_system_info(void)
228*7ab6e6acSAndroid Build Coastguard Worker {
229*7ab6e6acSAndroid Build Coastguard Worker static char buf[1024];
230*7ab6e6acSAndroid Build Coastguard Worker struct utsname uts;
231*7ab6e6acSAndroid Build Coastguard Worker
232*7ab6e6acSAndroid Build Coastguard Worker memset(buf, 0, 1024);
233*7ab6e6acSAndroid Build Coastguard Worker uname(&uts);
234*7ab6e6acSAndroid Build Coastguard Worker
235*7ab6e6acSAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "%s %s %s %s %s", uts.sysname, uts.nodename,
236*7ab6e6acSAndroid Build Coastguard Worker uts.release, uts.version, uts.machine);
237*7ab6e6acSAndroid Build Coastguard Worker
238*7ab6e6acSAndroid Build Coastguard Worker return buf;
239*7ab6e6acSAndroid Build Coastguard Worker }
240*7ab6e6acSAndroid Build Coastguard Worker
241*7ab6e6acSAndroid Build Coastguard Worker
242*7ab6e6acSAndroid Build Coastguard Worker const char *
get_optional_features(void)243*7ab6e6acSAndroid Build Coastguard Worker get_optional_features(void)
244*7ab6e6acSAndroid Build Coastguard Worker {
245*7ab6e6acSAndroid Build Coastguard Worker static char features[1024];
246*7ab6e6acSAndroid Build Coastguard Worker unsigned int numfeatures = 0;
247*7ab6e6acSAndroid Build Coastguard Worker
248*7ab6e6acSAndroid Build Coastguard Worker snprintf(features, sizeof(features), "Optional features available: ");
249*7ab6e6acSAndroid Build Coastguard Worker
250*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_CPU_AFFINITY)
251*7ab6e6acSAndroid Build Coastguard Worker if (numfeatures > 0) {
252*7ab6e6acSAndroid Build Coastguard Worker strncat(features, ", ",
253*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
254*7ab6e6acSAndroid Build Coastguard Worker }
255*7ab6e6acSAndroid Build Coastguard Worker strncat(features, "CPU affinity setting",
256*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
257*7ab6e6acSAndroid Build Coastguard Worker numfeatures++;
258*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_CPU_AFFINITY */
259*7ab6e6acSAndroid Build Coastguard Worker
260*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_FLOWLABEL)
261*7ab6e6acSAndroid Build Coastguard Worker if (numfeatures > 0) {
262*7ab6e6acSAndroid Build Coastguard Worker strncat(features, ", ",
263*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
264*7ab6e6acSAndroid Build Coastguard Worker }
265*7ab6e6acSAndroid Build Coastguard Worker strncat(features, "IPv6 flow label",
266*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
267*7ab6e6acSAndroid Build Coastguard Worker numfeatures++;
268*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_FLOWLABEL */
269*7ab6e6acSAndroid Build Coastguard Worker
270*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SCTP_H)
271*7ab6e6acSAndroid Build Coastguard Worker if (numfeatures > 0) {
272*7ab6e6acSAndroid Build Coastguard Worker strncat(features, ", ",
273*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
274*7ab6e6acSAndroid Build Coastguard Worker }
275*7ab6e6acSAndroid Build Coastguard Worker strncat(features, "SCTP",
276*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
277*7ab6e6acSAndroid Build Coastguard Worker numfeatures++;
278*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SCTP_H */
279*7ab6e6acSAndroid Build Coastguard Worker
280*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_TCP_CONGESTION)
281*7ab6e6acSAndroid Build Coastguard Worker if (numfeatures > 0) {
282*7ab6e6acSAndroid Build Coastguard Worker strncat(features, ", ",
283*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
284*7ab6e6acSAndroid Build Coastguard Worker }
285*7ab6e6acSAndroid Build Coastguard Worker strncat(features, "TCP congestion algorithm setting",
286*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
287*7ab6e6acSAndroid Build Coastguard Worker numfeatures++;
288*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_TCP_CONGESTION */
289*7ab6e6acSAndroid Build Coastguard Worker
290*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SENDFILE)
291*7ab6e6acSAndroid Build Coastguard Worker if (numfeatures > 0) {
292*7ab6e6acSAndroid Build Coastguard Worker strncat(features, ", ",
293*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
294*7ab6e6acSAndroid Build Coastguard Worker }
295*7ab6e6acSAndroid Build Coastguard Worker strncat(features, "sendfile / zerocopy",
296*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
297*7ab6e6acSAndroid Build Coastguard Worker numfeatures++;
298*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SENDFILE */
299*7ab6e6acSAndroid Build Coastguard Worker
300*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SO_MAX_PACING_RATE)
301*7ab6e6acSAndroid Build Coastguard Worker if (numfeatures > 0) {
302*7ab6e6acSAndroid Build Coastguard Worker strncat(features, ", ",
303*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
304*7ab6e6acSAndroid Build Coastguard Worker }
305*7ab6e6acSAndroid Build Coastguard Worker strncat(features, "socket pacing",
306*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
307*7ab6e6acSAndroid Build Coastguard Worker numfeatures++;
308*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SO_MAX_PACING_RATE */
309*7ab6e6acSAndroid Build Coastguard Worker
310*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SSL)
311*7ab6e6acSAndroid Build Coastguard Worker if (numfeatures > 0) {
312*7ab6e6acSAndroid Build Coastguard Worker strncat(features, ", ",
313*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
314*7ab6e6acSAndroid Build Coastguard Worker }
315*7ab6e6acSAndroid Build Coastguard Worker strncat(features, "authentication",
316*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
317*7ab6e6acSAndroid Build Coastguard Worker numfeatures++;
318*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SSL */
319*7ab6e6acSAndroid Build Coastguard Worker
320*7ab6e6acSAndroid Build Coastguard Worker if (numfeatures == 0) {
321*7ab6e6acSAndroid Build Coastguard Worker strncat(features, "None",
322*7ab6e6acSAndroid Build Coastguard Worker sizeof(features) - strlen(features) - 1);
323*7ab6e6acSAndroid Build Coastguard Worker }
324*7ab6e6acSAndroid Build Coastguard Worker
325*7ab6e6acSAndroid Build Coastguard Worker return features;
326*7ab6e6acSAndroid Build Coastguard Worker }
327*7ab6e6acSAndroid Build Coastguard Worker
328*7ab6e6acSAndroid Build Coastguard Worker /* Helper routine for building cJSON objects in a printf-like manner.
329*7ab6e6acSAndroid Build Coastguard Worker **
330*7ab6e6acSAndroid Build Coastguard Worker ** Sample call:
331*7ab6e6acSAndroid Build Coastguard Worker ** j = iperf_json_printf("foo: %b bar: %d bletch: %f eep: %s", b, i, f, s);
332*7ab6e6acSAndroid Build Coastguard Worker **
333*7ab6e6acSAndroid Build Coastguard Worker ** The four formatting characters and the types they expect are:
334*7ab6e6acSAndroid Build Coastguard Worker ** %b boolean int
335*7ab6e6acSAndroid Build Coastguard Worker ** %d integer int64_t
336*7ab6e6acSAndroid Build Coastguard Worker ** %f floating point double
337*7ab6e6acSAndroid Build Coastguard Worker ** %s string char *
338*7ab6e6acSAndroid Build Coastguard Worker ** If the values you're passing in are not these exact types, you must
339*7ab6e6acSAndroid Build Coastguard Worker ** cast them, there is no automatic type coercion/widening here.
340*7ab6e6acSAndroid Build Coastguard Worker **
341*7ab6e6acSAndroid Build Coastguard Worker ** The colons mark the end of field names, and blanks are ignored.
342*7ab6e6acSAndroid Build Coastguard Worker **
343*7ab6e6acSAndroid Build Coastguard Worker ** This routine is not particularly robust, but it's not part of the API,
344*7ab6e6acSAndroid Build Coastguard Worker ** it's just for internal iperf3 use.
345*7ab6e6acSAndroid Build Coastguard Worker */
346*7ab6e6acSAndroid Build Coastguard Worker cJSON*
iperf_json_printf(const char * format,...)347*7ab6e6acSAndroid Build Coastguard Worker iperf_json_printf(const char *format, ...)
348*7ab6e6acSAndroid Build Coastguard Worker {
349*7ab6e6acSAndroid Build Coastguard Worker cJSON* o;
350*7ab6e6acSAndroid Build Coastguard Worker va_list argp;
351*7ab6e6acSAndroid Build Coastguard Worker const char *cp;
352*7ab6e6acSAndroid Build Coastguard Worker char name[100];
353*7ab6e6acSAndroid Build Coastguard Worker char* np;
354*7ab6e6acSAndroid Build Coastguard Worker cJSON* j;
355*7ab6e6acSAndroid Build Coastguard Worker
356*7ab6e6acSAndroid Build Coastguard Worker o = cJSON_CreateObject();
357*7ab6e6acSAndroid Build Coastguard Worker if (o == NULL)
358*7ab6e6acSAndroid Build Coastguard Worker return NULL;
359*7ab6e6acSAndroid Build Coastguard Worker va_start(argp, format);
360*7ab6e6acSAndroid Build Coastguard Worker np = name;
361*7ab6e6acSAndroid Build Coastguard Worker for (cp = format; *cp != '\0'; ++cp) {
362*7ab6e6acSAndroid Build Coastguard Worker switch (*cp) {
363*7ab6e6acSAndroid Build Coastguard Worker case ' ':
364*7ab6e6acSAndroid Build Coastguard Worker break;
365*7ab6e6acSAndroid Build Coastguard Worker case ':':
366*7ab6e6acSAndroid Build Coastguard Worker *np = '\0';
367*7ab6e6acSAndroid Build Coastguard Worker break;
368*7ab6e6acSAndroid Build Coastguard Worker case '%':
369*7ab6e6acSAndroid Build Coastguard Worker ++cp;
370*7ab6e6acSAndroid Build Coastguard Worker switch (*cp) {
371*7ab6e6acSAndroid Build Coastguard Worker case 'b':
372*7ab6e6acSAndroid Build Coastguard Worker j = cJSON_CreateBool(va_arg(argp, int));
373*7ab6e6acSAndroid Build Coastguard Worker break;
374*7ab6e6acSAndroid Build Coastguard Worker case 'd':
375*7ab6e6acSAndroid Build Coastguard Worker j = cJSON_CreateNumber(va_arg(argp, int64_t));
376*7ab6e6acSAndroid Build Coastguard Worker break;
377*7ab6e6acSAndroid Build Coastguard Worker case 'f':
378*7ab6e6acSAndroid Build Coastguard Worker j = cJSON_CreateNumber(va_arg(argp, double));
379*7ab6e6acSAndroid Build Coastguard Worker break;
380*7ab6e6acSAndroid Build Coastguard Worker case 's':
381*7ab6e6acSAndroid Build Coastguard Worker j = cJSON_CreateString(va_arg(argp, char *));
382*7ab6e6acSAndroid Build Coastguard Worker break;
383*7ab6e6acSAndroid Build Coastguard Worker default:
384*7ab6e6acSAndroid Build Coastguard Worker va_end(argp);
385*7ab6e6acSAndroid Build Coastguard Worker return NULL;
386*7ab6e6acSAndroid Build Coastguard Worker }
387*7ab6e6acSAndroid Build Coastguard Worker if (j == NULL) {
388*7ab6e6acSAndroid Build Coastguard Worker va_end(argp);
389*7ab6e6acSAndroid Build Coastguard Worker return NULL;
390*7ab6e6acSAndroid Build Coastguard Worker }
391*7ab6e6acSAndroid Build Coastguard Worker cJSON_AddItemToObject(o, name, j);
392*7ab6e6acSAndroid Build Coastguard Worker np = name;
393*7ab6e6acSAndroid Build Coastguard Worker break;
394*7ab6e6acSAndroid Build Coastguard Worker default:
395*7ab6e6acSAndroid Build Coastguard Worker *np++ = *cp;
396*7ab6e6acSAndroid Build Coastguard Worker break;
397*7ab6e6acSAndroid Build Coastguard Worker }
398*7ab6e6acSAndroid Build Coastguard Worker }
399*7ab6e6acSAndroid Build Coastguard Worker va_end(argp);
400*7ab6e6acSAndroid Build Coastguard Worker return o;
401*7ab6e6acSAndroid Build Coastguard Worker }
402*7ab6e6acSAndroid Build Coastguard Worker
403*7ab6e6acSAndroid Build Coastguard Worker /* Debugging routine to dump out an fd_set. */
404*7ab6e6acSAndroid Build Coastguard Worker void
iperf_dump_fdset(FILE * fp,const char * str,int nfds,fd_set * fds)405*7ab6e6acSAndroid Build Coastguard Worker iperf_dump_fdset(FILE *fp, const char *str, int nfds, fd_set *fds)
406*7ab6e6acSAndroid Build Coastguard Worker {
407*7ab6e6acSAndroid Build Coastguard Worker int fd;
408*7ab6e6acSAndroid Build Coastguard Worker int comma;
409*7ab6e6acSAndroid Build Coastguard Worker
410*7ab6e6acSAndroid Build Coastguard Worker fprintf(fp, "%s: [", str);
411*7ab6e6acSAndroid Build Coastguard Worker comma = 0;
412*7ab6e6acSAndroid Build Coastguard Worker for (fd = 0; fd < nfds; ++fd) {
413*7ab6e6acSAndroid Build Coastguard Worker if (FD_ISSET(fd, fds)) {
414*7ab6e6acSAndroid Build Coastguard Worker if (comma)
415*7ab6e6acSAndroid Build Coastguard Worker fprintf(fp, ", ");
416*7ab6e6acSAndroid Build Coastguard Worker fprintf(fp, "%d", fd);
417*7ab6e6acSAndroid Build Coastguard Worker comma = 1;
418*7ab6e6acSAndroid Build Coastguard Worker }
419*7ab6e6acSAndroid Build Coastguard Worker }
420*7ab6e6acSAndroid Build Coastguard Worker fprintf(fp, "]\n");
421*7ab6e6acSAndroid Build Coastguard Worker }
422*7ab6e6acSAndroid Build Coastguard Worker
423*7ab6e6acSAndroid Build Coastguard Worker /*
424*7ab6e6acSAndroid Build Coastguard Worker * daemon(3) implementation for systems lacking one.
425*7ab6e6acSAndroid Build Coastguard Worker * Cobbled together from various daemon(3) implementations,
426*7ab6e6acSAndroid Build Coastguard Worker * not intended to be general-purpose. */
427*7ab6e6acSAndroid Build Coastguard Worker #ifndef HAVE_DAEMON
daemon(int nochdir,int noclose)428*7ab6e6acSAndroid Build Coastguard Worker int daemon(int nochdir, int noclose)
429*7ab6e6acSAndroid Build Coastguard Worker {
430*7ab6e6acSAndroid Build Coastguard Worker pid_t pid = 0;
431*7ab6e6acSAndroid Build Coastguard Worker pid_t sid = 0;
432*7ab6e6acSAndroid Build Coastguard Worker int fd;
433*7ab6e6acSAndroid Build Coastguard Worker
434*7ab6e6acSAndroid Build Coastguard Worker /*
435*7ab6e6acSAndroid Build Coastguard Worker * Ignore any possible SIGHUP when the parent process exits.
436*7ab6e6acSAndroid Build Coastguard Worker * Note that the iperf3 server process will eventually install
437*7ab6e6acSAndroid Build Coastguard Worker * its own signal handler for SIGHUP, so we can be a little
438*7ab6e6acSAndroid Build Coastguard Worker * sloppy about not restoring the prior value. This does not
439*7ab6e6acSAndroid Build Coastguard Worker * generalize.
440*7ab6e6acSAndroid Build Coastguard Worker */
441*7ab6e6acSAndroid Build Coastguard Worker signal(SIGHUP, SIG_IGN);
442*7ab6e6acSAndroid Build Coastguard Worker
443*7ab6e6acSAndroid Build Coastguard Worker pid = fork();
444*7ab6e6acSAndroid Build Coastguard Worker if (pid < 0) {
445*7ab6e6acSAndroid Build Coastguard Worker return -1;
446*7ab6e6acSAndroid Build Coastguard Worker }
447*7ab6e6acSAndroid Build Coastguard Worker if (pid > 0) {
448*7ab6e6acSAndroid Build Coastguard Worker /* Use _exit() to avoid doing atexit() stuff. */
449*7ab6e6acSAndroid Build Coastguard Worker _exit(0);
450*7ab6e6acSAndroid Build Coastguard Worker }
451*7ab6e6acSAndroid Build Coastguard Worker
452*7ab6e6acSAndroid Build Coastguard Worker sid = setsid();
453*7ab6e6acSAndroid Build Coastguard Worker if (sid < 0) {
454*7ab6e6acSAndroid Build Coastguard Worker return -1;
455*7ab6e6acSAndroid Build Coastguard Worker }
456*7ab6e6acSAndroid Build Coastguard Worker
457*7ab6e6acSAndroid Build Coastguard Worker /*
458*7ab6e6acSAndroid Build Coastguard Worker * Fork again to avoid becoming a session leader.
459*7ab6e6acSAndroid Build Coastguard Worker * This might only matter on old SVr4-derived OSs.
460*7ab6e6acSAndroid Build Coastguard Worker * Note in particular that glibc and FreeBSD libc
461*7ab6e6acSAndroid Build Coastguard Worker * only fork once.
462*7ab6e6acSAndroid Build Coastguard Worker */
463*7ab6e6acSAndroid Build Coastguard Worker pid = fork();
464*7ab6e6acSAndroid Build Coastguard Worker if (pid == -1) {
465*7ab6e6acSAndroid Build Coastguard Worker return -1;
466*7ab6e6acSAndroid Build Coastguard Worker } else if (pid != 0) {
467*7ab6e6acSAndroid Build Coastguard Worker _exit(0);
468*7ab6e6acSAndroid Build Coastguard Worker }
469*7ab6e6acSAndroid Build Coastguard Worker
470*7ab6e6acSAndroid Build Coastguard Worker if (!nochdir) {
471*7ab6e6acSAndroid Build Coastguard Worker chdir("/");
472*7ab6e6acSAndroid Build Coastguard Worker }
473*7ab6e6acSAndroid Build Coastguard Worker
474*7ab6e6acSAndroid Build Coastguard Worker if (!noclose && (fd = open("/dev/null", O_RDWR, 0)) != -1) {
475*7ab6e6acSAndroid Build Coastguard Worker dup2(fd, STDIN_FILENO);
476*7ab6e6acSAndroid Build Coastguard Worker dup2(fd, STDOUT_FILENO);
477*7ab6e6acSAndroid Build Coastguard Worker dup2(fd, STDERR_FILENO);
478*7ab6e6acSAndroid Build Coastguard Worker if (fd > 2) {
479*7ab6e6acSAndroid Build Coastguard Worker close(fd);
480*7ab6e6acSAndroid Build Coastguard Worker }
481*7ab6e6acSAndroid Build Coastguard Worker }
482*7ab6e6acSAndroid Build Coastguard Worker return (0);
483*7ab6e6acSAndroid Build Coastguard Worker }
484*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_DAEMON */
485*7ab6e6acSAndroid Build Coastguard Worker
486*7ab6e6acSAndroid Build Coastguard Worker /* Compatibility version of getline(3) for systems that don't have it.. */
487*7ab6e6acSAndroid Build Coastguard Worker #ifndef HAVE_GETLINE
488*7ab6e6acSAndroid Build Coastguard Worker /* The following code adopted from NetBSD's getline.c, which is: */
489*7ab6e6acSAndroid Build Coastguard Worker
490*7ab6e6acSAndroid Build Coastguard Worker /*-
491*7ab6e6acSAndroid Build Coastguard Worker * Copyright (c) 2011 The NetBSD Foundation, Inc.
492*7ab6e6acSAndroid Build Coastguard Worker * All rights reserved.
493*7ab6e6acSAndroid Build Coastguard Worker *
494*7ab6e6acSAndroid Build Coastguard Worker * This code is derived from software contributed to The NetBSD Foundation
495*7ab6e6acSAndroid Build Coastguard Worker * by Christos Zoulas.
496*7ab6e6acSAndroid Build Coastguard Worker *
497*7ab6e6acSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
498*7ab6e6acSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
499*7ab6e6acSAndroid Build Coastguard Worker * are met:
500*7ab6e6acSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
501*7ab6e6acSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
502*7ab6e6acSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
503*7ab6e6acSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
504*7ab6e6acSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
505*7ab6e6acSAndroid Build Coastguard Worker *
506*7ab6e6acSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
507*7ab6e6acSAndroid Build Coastguard Worker * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
508*7ab6e6acSAndroid Build Coastguard Worker * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
509*7ab6e6acSAndroid Build Coastguard Worker * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
510*7ab6e6acSAndroid Build Coastguard Worker * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
511*7ab6e6acSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
512*7ab6e6acSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
513*7ab6e6acSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
514*7ab6e6acSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
515*7ab6e6acSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
516*7ab6e6acSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
517*7ab6e6acSAndroid Build Coastguard Worker */
518*7ab6e6acSAndroid Build Coastguard Worker ssize_t
getdelim(char ** buf,size_t * bufsiz,int delimiter,FILE * fp)519*7ab6e6acSAndroid Build Coastguard Worker getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
520*7ab6e6acSAndroid Build Coastguard Worker {
521*7ab6e6acSAndroid Build Coastguard Worker char *ptr, *eptr;
522*7ab6e6acSAndroid Build Coastguard Worker
523*7ab6e6acSAndroid Build Coastguard Worker
524*7ab6e6acSAndroid Build Coastguard Worker if (*buf == NULL || *bufsiz == 0) {
525*7ab6e6acSAndroid Build Coastguard Worker *bufsiz = BUFSIZ;
526*7ab6e6acSAndroid Build Coastguard Worker if ((*buf = malloc(*bufsiz)) == NULL)
527*7ab6e6acSAndroid Build Coastguard Worker return -1;
528*7ab6e6acSAndroid Build Coastguard Worker }
529*7ab6e6acSAndroid Build Coastguard Worker
530*7ab6e6acSAndroid Build Coastguard Worker for (ptr = *buf, eptr = *buf + *bufsiz;;) {
531*7ab6e6acSAndroid Build Coastguard Worker int c = fgetc(fp);
532*7ab6e6acSAndroid Build Coastguard Worker if (c == -1) {
533*7ab6e6acSAndroid Build Coastguard Worker if (feof(fp)) {
534*7ab6e6acSAndroid Build Coastguard Worker ssize_t diff = (ssize_t)(ptr - *buf);
535*7ab6e6acSAndroid Build Coastguard Worker if (diff != 0) {
536*7ab6e6acSAndroid Build Coastguard Worker *ptr = '\0';
537*7ab6e6acSAndroid Build Coastguard Worker return diff;
538*7ab6e6acSAndroid Build Coastguard Worker }
539*7ab6e6acSAndroid Build Coastguard Worker }
540*7ab6e6acSAndroid Build Coastguard Worker return -1;
541*7ab6e6acSAndroid Build Coastguard Worker }
542*7ab6e6acSAndroid Build Coastguard Worker *ptr++ = c;
543*7ab6e6acSAndroid Build Coastguard Worker if (c == delimiter) {
544*7ab6e6acSAndroid Build Coastguard Worker *ptr = '\0';
545*7ab6e6acSAndroid Build Coastguard Worker return ptr - *buf;
546*7ab6e6acSAndroid Build Coastguard Worker }
547*7ab6e6acSAndroid Build Coastguard Worker if (ptr + 2 >= eptr) {
548*7ab6e6acSAndroid Build Coastguard Worker char *nbuf;
549*7ab6e6acSAndroid Build Coastguard Worker size_t nbufsiz = *bufsiz * 2;
550*7ab6e6acSAndroid Build Coastguard Worker ssize_t d = ptr - *buf;
551*7ab6e6acSAndroid Build Coastguard Worker if ((nbuf = realloc(*buf, nbufsiz)) == NULL)
552*7ab6e6acSAndroid Build Coastguard Worker return -1;
553*7ab6e6acSAndroid Build Coastguard Worker *buf = nbuf;
554*7ab6e6acSAndroid Build Coastguard Worker *bufsiz = nbufsiz;
555*7ab6e6acSAndroid Build Coastguard Worker eptr = nbuf + nbufsiz;
556*7ab6e6acSAndroid Build Coastguard Worker ptr = nbuf + d;
557*7ab6e6acSAndroid Build Coastguard Worker }
558*7ab6e6acSAndroid Build Coastguard Worker }
559*7ab6e6acSAndroid Build Coastguard Worker }
560*7ab6e6acSAndroid Build Coastguard Worker
561*7ab6e6acSAndroid Build Coastguard Worker ssize_t
getline(char ** buf,size_t * bufsiz,FILE * fp)562*7ab6e6acSAndroid Build Coastguard Worker getline(char **buf, size_t *bufsiz, FILE *fp)
563*7ab6e6acSAndroid Build Coastguard Worker {
564*7ab6e6acSAndroid Build Coastguard Worker return getdelim(buf, bufsiz, '\n', fp);
565*7ab6e6acSAndroid Build Coastguard Worker }
566*7ab6e6acSAndroid Build Coastguard Worker
567*7ab6e6acSAndroid Build Coastguard Worker #endif
568