xref: /aosp_15_r20/external/iperf3/src/dscp.c (revision 7ab6e6ace082586527a400463bc693a412a40341)
1*7ab6e6acSAndroid Build Coastguard Worker /* dscp lookup routines lifted wholesale from openssh */
2*7ab6e6acSAndroid Build Coastguard Worker 
3*7ab6e6acSAndroid Build Coastguard Worker /*
4*7ab6e6acSAndroid Build Coastguard Worker  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
5*7ab6e6acSAndroid Build Coastguard Worker  * Copyright (c) 2005,2006 Damien Miller.  All rights reserved.
6*7ab6e6acSAndroid Build Coastguard Worker  *
7*7ab6e6acSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
8*7ab6e6acSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
9*7ab6e6acSAndroid Build Coastguard Worker  * are met:
10*7ab6e6acSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
11*7ab6e6acSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
12*7ab6e6acSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
13*7ab6e6acSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
14*7ab6e6acSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
15*7ab6e6acSAndroid Build Coastguard Worker  *
16*7ab6e6acSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*7ab6e6acSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*7ab6e6acSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*7ab6e6acSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*7ab6e6acSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*7ab6e6acSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*7ab6e6acSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*7ab6e6acSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*7ab6e6acSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*7ab6e6acSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*7ab6e6acSAndroid Build Coastguard Worker  */
27*7ab6e6acSAndroid Build Coastguard Worker 
28*7ab6e6acSAndroid Build Coastguard Worker #include <stdio.h>
29*7ab6e6acSAndroid Build Coastguard Worker #include <string.h>
30*7ab6e6acSAndroid Build Coastguard Worker #include <strings.h>
31*7ab6e6acSAndroid Build Coastguard Worker #include <stdlib.h>
32*7ab6e6acSAndroid Build Coastguard Worker #include <inttypes.h>
33*7ab6e6acSAndroid Build Coastguard Worker 
34*7ab6e6acSAndroid Build Coastguard Worker #ifdef WIN32
35*7ab6e6acSAndroid Build Coastguard Worker #define strcasecmp(a,b) _stricmp(a,b)
36*7ab6e6acSAndroid Build Coastguard Worker #define snprintf _snprintf
37*7ab6e6acSAndroid Build Coastguard Worker #endif
38*7ab6e6acSAndroid Build Coastguard Worker 
39*7ab6e6acSAndroid Build Coastguard Worker int parse_qos(const char *cp);
40*7ab6e6acSAndroid Build Coastguard Worker const char * iptos2str(int iptos);
41*7ab6e6acSAndroid Build Coastguard Worker 
42*7ab6e6acSAndroid Build Coastguard Worker /*
43*7ab6e6acSAndroid Build Coastguard Worker  * Definitions for IP type of service (ip_tos)
44*7ab6e6acSAndroid Build Coastguard Worker  */
45*7ab6e6acSAndroid Build Coastguard Worker 
46*7ab6e6acSAndroid Build Coastguard Worker #ifdef HAVE_NETINET_IN_SYSTM_H
47*7ab6e6acSAndroid Build Coastguard Worker #include <netinet/in_systm.h>
48*7ab6e6acSAndroid Build Coastguard Worker #endif
49*7ab6e6acSAndroid Build Coastguard Worker #ifdef HAVE_NETINET_IP_H
50*7ab6e6acSAndroid Build Coastguard Worker #include <netinet/ip.h>
51*7ab6e6acSAndroid Build Coastguard Worker #endif
52*7ab6e6acSAndroid Build Coastguard Worker 
53*7ab6e6acSAndroid Build Coastguard Worker #ifndef IPTOS_LOWDELAY
54*7ab6e6acSAndroid Build Coastguard Worker # define IPTOS_LOWDELAY          0x10
55*7ab6e6acSAndroid Build Coastguard Worker # define IPTOS_THROUGHPUT        0x08
56*7ab6e6acSAndroid Build Coastguard Worker # define IPTOS_RELIABILITY       0x04
57*7ab6e6acSAndroid Build Coastguard Worker # define IPTOS_LOWCOST           0x02
58*7ab6e6acSAndroid Build Coastguard Worker # define IPTOS_MINCOST           IPTOS_LOWCOST
59*7ab6e6acSAndroid Build Coastguard Worker #endif /* IPTOS_LOWDELAY */
60*7ab6e6acSAndroid Build Coastguard Worker 
61*7ab6e6acSAndroid Build Coastguard Worker /*
62*7ab6e6acSAndroid Build Coastguard Worker  * Definitions for DiffServ Codepoints as per RFC2474
63*7ab6e6acSAndroid Build Coastguard Worker  */
64*7ab6e6acSAndroid Build Coastguard Worker #ifndef IPTOS_DSCP_AF11
65*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF11		0x28
66*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF12		0x30
67*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF13		0x38
68*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF21		0x48
69*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF22		0x50
70*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF23		0x58
71*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF31		0x68
72*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF32		0x70
73*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF33		0x78
74*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF41		0x88
75*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF42		0x90
76*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_AF43		0x98
77*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_EF		0xb8
78*7ab6e6acSAndroid Build Coastguard Worker #endif /* IPTOS_DSCP_AF11 */
79*7ab6e6acSAndroid Build Coastguard Worker 
80*7ab6e6acSAndroid Build Coastguard Worker #ifndef IPTOS_DSCP_CS0
81*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_CS0		0x00
82*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_CS1		0x20
83*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_CS2		0x40
84*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_CS3		0x60
85*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_CS4		0x80
86*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_CS5		0xa0
87*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_CS6		0xc0
88*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_CS7		0xe0
89*7ab6e6acSAndroid Build Coastguard Worker #endif /* IPTOS_DSCP_CS0 */
90*7ab6e6acSAndroid Build Coastguard Worker #ifndef IPTOS_DSCP_EF
91*7ab6e6acSAndroid Build Coastguard Worker # define	IPTOS_DSCP_EF		0xb8
92*7ab6e6acSAndroid Build Coastguard Worker #endif /* IPTOS_DSCP_EF */
93*7ab6e6acSAndroid Build Coastguard Worker 
94*7ab6e6acSAndroid Build Coastguard Worker static const struct {
95*7ab6e6acSAndroid Build Coastguard Worker 	const char *name;
96*7ab6e6acSAndroid Build Coastguard Worker 	int value;
97*7ab6e6acSAndroid Build Coastguard Worker } ipqos[] = {
98*7ab6e6acSAndroid Build Coastguard Worker 	{ "af11", IPTOS_DSCP_AF11 },
99*7ab6e6acSAndroid Build Coastguard Worker 	{ "af12", IPTOS_DSCP_AF12 },
100*7ab6e6acSAndroid Build Coastguard Worker 	{ "af13", IPTOS_DSCP_AF13 },
101*7ab6e6acSAndroid Build Coastguard Worker 	{ "af21", IPTOS_DSCP_AF21 },
102*7ab6e6acSAndroid Build Coastguard Worker 	{ "af22", IPTOS_DSCP_AF22 },
103*7ab6e6acSAndroid Build Coastguard Worker 	{ "af23", IPTOS_DSCP_AF23 },
104*7ab6e6acSAndroid Build Coastguard Worker 	{ "af31", IPTOS_DSCP_AF31 },
105*7ab6e6acSAndroid Build Coastguard Worker 	{ "af32", IPTOS_DSCP_AF32 },
106*7ab6e6acSAndroid Build Coastguard Worker 	{ "af33", IPTOS_DSCP_AF33 },
107*7ab6e6acSAndroid Build Coastguard Worker 	{ "af41", IPTOS_DSCP_AF41 },
108*7ab6e6acSAndroid Build Coastguard Worker 	{ "af42", IPTOS_DSCP_AF42 },
109*7ab6e6acSAndroid Build Coastguard Worker 	{ "af43", IPTOS_DSCP_AF43 },
110*7ab6e6acSAndroid Build Coastguard Worker 	{ "cs0", IPTOS_DSCP_CS0 },
111*7ab6e6acSAndroid Build Coastguard Worker 	{ "cs1", IPTOS_DSCP_CS1 },
112*7ab6e6acSAndroid Build Coastguard Worker 	{ "cs2", IPTOS_DSCP_CS2 },
113*7ab6e6acSAndroid Build Coastguard Worker 	{ "cs3", IPTOS_DSCP_CS3 },
114*7ab6e6acSAndroid Build Coastguard Worker 	{ "cs4", IPTOS_DSCP_CS4 },
115*7ab6e6acSAndroid Build Coastguard Worker 	{ "cs5", IPTOS_DSCP_CS5 },
116*7ab6e6acSAndroid Build Coastguard Worker 	{ "cs6", IPTOS_DSCP_CS6 },
117*7ab6e6acSAndroid Build Coastguard Worker 	{ "cs7", IPTOS_DSCP_CS7 },
118*7ab6e6acSAndroid Build Coastguard Worker 	{ "ef", IPTOS_DSCP_EF },
119*7ab6e6acSAndroid Build Coastguard Worker 	{ "lowdelay", IPTOS_LOWDELAY },
120*7ab6e6acSAndroid Build Coastguard Worker 	{ "throughput", IPTOS_THROUGHPUT },
121*7ab6e6acSAndroid Build Coastguard Worker 	{ "reliability", IPTOS_RELIABILITY },
122*7ab6e6acSAndroid Build Coastguard Worker 	{ NULL, -1 }
123*7ab6e6acSAndroid Build Coastguard Worker };
124*7ab6e6acSAndroid Build Coastguard Worker 
125*7ab6e6acSAndroid Build Coastguard Worker int
parse_qos(const char * cp)126*7ab6e6acSAndroid Build Coastguard Worker parse_qos(const char *cp)
127*7ab6e6acSAndroid Build Coastguard Worker {
128*7ab6e6acSAndroid Build Coastguard Worker 	unsigned int i;
129*7ab6e6acSAndroid Build Coastguard Worker 	char *ep = NULL;
130*7ab6e6acSAndroid Build Coastguard Worker 	long val;
131*7ab6e6acSAndroid Build Coastguard Worker 
132*7ab6e6acSAndroid Build Coastguard Worker 	if (cp == NULL)
133*7ab6e6acSAndroid Build Coastguard Worker 		return -1;
134*7ab6e6acSAndroid Build Coastguard Worker 	for (i = 0; ipqos[i].name != NULL; i++) {
135*7ab6e6acSAndroid Build Coastguard Worker 		if (strcasecmp(cp, ipqos[i].name) == 0)
136*7ab6e6acSAndroid Build Coastguard Worker 			return ipqos[i].value;
137*7ab6e6acSAndroid Build Coastguard Worker 	}
138*7ab6e6acSAndroid Build Coastguard Worker 	/* Try parsing as an integer */
139*7ab6e6acSAndroid Build Coastguard Worker 	val = strtol(cp, &ep, 0);
140*7ab6e6acSAndroid Build Coastguard Worker 	if (*cp == '\0' || *ep != '\0' || val < 0 || val > 255)
141*7ab6e6acSAndroid Build Coastguard Worker 		return -1;
142*7ab6e6acSAndroid Build Coastguard Worker 	return val;
143*7ab6e6acSAndroid Build Coastguard Worker }
144*7ab6e6acSAndroid Build Coastguard Worker 
145*7ab6e6acSAndroid Build Coastguard Worker const char *
iptos2str(int iptos)146*7ab6e6acSAndroid Build Coastguard Worker iptos2str(int iptos)
147*7ab6e6acSAndroid Build Coastguard Worker {
148*7ab6e6acSAndroid Build Coastguard Worker 	int i;
149*7ab6e6acSAndroid Build Coastguard Worker 	static char iptos_str[sizeof "0xff"];
150*7ab6e6acSAndroid Build Coastguard Worker 	if (iptos < 0 || iptos > 64) iptos = 0;
151*7ab6e6acSAndroid Build Coastguard Worker 	for (i = 0; ipqos[i].name != NULL; i++) {
152*7ab6e6acSAndroid Build Coastguard Worker 		if (ipqos[i].value == iptos)
153*7ab6e6acSAndroid Build Coastguard Worker 			return ipqos[i].name;
154*7ab6e6acSAndroid Build Coastguard Worker 	}
155*7ab6e6acSAndroid Build Coastguard Worker 	snprintf(iptos_str, sizeof iptos_str, "0x%02x", iptos);
156*7ab6e6acSAndroid Build Coastguard Worker 	return iptos_str;
157*7ab6e6acSAndroid Build Coastguard Worker }
158