197c95c3bSDave Täht /* dscp lookup routines lifted wholesale from openssh */
297c95c3bSDave Täht
397c95c3bSDave Täht /*
497c95c3bSDave Täht * Copyright (c) 2000 Markus Friedl. All rights reserved.
597c95c3bSDave Täht * Copyright (c) 2005,2006 Damien Miller. All rights reserved.
697c95c3bSDave Täht *
797c95c3bSDave Täht * Redistribution and use in source and binary forms, with or without
897c95c3bSDave Täht * modification, are permitted provided that the following conditions
997c95c3bSDave Täht * are met:
1097c95c3bSDave Täht * 1. Redistributions of source code must retain the above copyright
1197c95c3bSDave Täht * notice, this list of conditions and the following disclaimer.
1297c95c3bSDave Täht * 2. Redistributions in binary form must reproduce the above copyright
1397c95c3bSDave Täht * notice, this list of conditions and the following disclaimer in the
1497c95c3bSDave Täht * documentation and/or other materials provided with the distribution.
1597c95c3bSDave Täht *
1697c95c3bSDave Täht * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1797c95c3bSDave Täht * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1897c95c3bSDave Täht * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1997c95c3bSDave Täht * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2097c95c3bSDave Täht * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2197c95c3bSDave Täht * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2297c95c3bSDave Täht * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2397c95c3bSDave Täht * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2497c95c3bSDave Täht * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2597c95c3bSDave Täht * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2697c95c3bSDave Täht */
2797c95c3bSDave Täht
2897c95c3bSDave Täht #include <stdio.h>
2997c95c3bSDave Täht #include <string.h>
30666040bdSXiang Xiao #include <strings.h>
3197c95c3bSDave Täht #include <stdlib.h>
3297c95c3bSDave Täht #include <inttypes.h>
3397c95c3bSDave Täht
3497c95c3bSDave Täht #ifdef WIN32
3597c95c3bSDave Täht #define strcasecmp(a,b) _stricmp(a,b)
3697c95c3bSDave Täht #define snprintf _snprintf
3797c95c3bSDave Täht #endif
3897c95c3bSDave Täht
3997c95c3bSDave Täht int parse_qos(const char *cp);
4097c95c3bSDave Täht const char * iptos2str(int iptos);
4197c95c3bSDave Täht
4297c95c3bSDave Täht /*
4397c95c3bSDave Täht * Definitions for IP type of service (ip_tos)
4497c95c3bSDave Täht */
4597c95c3bSDave Täht
46407a5ba8SXiang Xiao #ifdef HAVE_NETINET_IN_SYSTM_H
4797c95c3bSDave Täht #include <netinet/in_systm.h>
4897c95c3bSDave Täht #endif
49407a5ba8SXiang Xiao #ifdef HAVE_NETINET_IP_H
5097c95c3bSDave Täht #include <netinet/ip.h>
5197c95c3bSDave Täht #endif
5297c95c3bSDave Täht
5397c95c3bSDave Täht #ifndef IPTOS_LOWDELAY
5497c95c3bSDave Täht # define IPTOS_LOWDELAY 0x10
5597c95c3bSDave Täht # define IPTOS_THROUGHPUT 0x08
5697c95c3bSDave Täht # define IPTOS_RELIABILITY 0x04
5797c95c3bSDave Täht # define IPTOS_LOWCOST 0x02
5897c95c3bSDave Täht # define IPTOS_MINCOST IPTOS_LOWCOST
5997c95c3bSDave Täht #endif /* IPTOS_LOWDELAY */
6097c95c3bSDave Täht
6197c95c3bSDave Täht /*
6297c95c3bSDave Täht * Definitions for DiffServ Codepoints as per RFC2474
6397c95c3bSDave Täht */
6497c95c3bSDave Täht #ifndef IPTOS_DSCP_AF11
6597c95c3bSDave Täht # define IPTOS_DSCP_AF11 0x28
6697c95c3bSDave Täht # define IPTOS_DSCP_AF12 0x30
6797c95c3bSDave Täht # define IPTOS_DSCP_AF13 0x38
6897c95c3bSDave Täht # define IPTOS_DSCP_AF21 0x48
6997c95c3bSDave Täht # define IPTOS_DSCP_AF22 0x50
7097c95c3bSDave Täht # define IPTOS_DSCP_AF23 0x58
7197c95c3bSDave Täht # define IPTOS_DSCP_AF31 0x68
7297c95c3bSDave Täht # define IPTOS_DSCP_AF32 0x70
7397c95c3bSDave Täht # define IPTOS_DSCP_AF33 0x78
7497c95c3bSDave Täht # define IPTOS_DSCP_AF41 0x88
7597c95c3bSDave Täht # define IPTOS_DSCP_AF42 0x90
7697c95c3bSDave Täht # define IPTOS_DSCP_AF43 0x98
7797c95c3bSDave Täht # define IPTOS_DSCP_EF 0xb8
7897c95c3bSDave Täht #endif /* IPTOS_DSCP_AF11 */
7997c95c3bSDave Täht
8097c95c3bSDave Täht #ifndef IPTOS_DSCP_CS0
8197c95c3bSDave Täht # define IPTOS_DSCP_CS0 0x00
8297c95c3bSDave Täht # define IPTOS_DSCP_CS1 0x20
8397c95c3bSDave Täht # define IPTOS_DSCP_CS2 0x40
8497c95c3bSDave Täht # define IPTOS_DSCP_CS3 0x60
8597c95c3bSDave Täht # define IPTOS_DSCP_CS4 0x80
8697c95c3bSDave Täht # define IPTOS_DSCP_CS5 0xa0
8797c95c3bSDave Täht # define IPTOS_DSCP_CS6 0xc0
8897c95c3bSDave Täht # define IPTOS_DSCP_CS7 0xe0
8997c95c3bSDave Täht #endif /* IPTOS_DSCP_CS0 */
9097c95c3bSDave Täht #ifndef IPTOS_DSCP_EF
9197c95c3bSDave Täht # define IPTOS_DSCP_EF 0xb8
9297c95c3bSDave Täht #endif /* IPTOS_DSCP_EF */
9397c95c3bSDave Täht
9497c95c3bSDave Täht static const struct {
9597c95c3bSDave Täht const char *name;
9697c95c3bSDave Täht int value;
9797c95c3bSDave Täht } ipqos[] = {
9897c95c3bSDave Täht { "af11", IPTOS_DSCP_AF11 },
9997c95c3bSDave Täht { "af12", IPTOS_DSCP_AF12 },
10097c95c3bSDave Täht { "af13", IPTOS_DSCP_AF13 },
10197c95c3bSDave Täht { "af21", IPTOS_DSCP_AF21 },
10297c95c3bSDave Täht { "af22", IPTOS_DSCP_AF22 },
10397c95c3bSDave Täht { "af23", IPTOS_DSCP_AF23 },
10497c95c3bSDave Täht { "af31", IPTOS_DSCP_AF31 },
10597c95c3bSDave Täht { "af32", IPTOS_DSCP_AF32 },
10697c95c3bSDave Täht { "af33", IPTOS_DSCP_AF33 },
10797c95c3bSDave Täht { "af41", IPTOS_DSCP_AF41 },
10897c95c3bSDave Täht { "af42", IPTOS_DSCP_AF42 },
10997c95c3bSDave Täht { "af43", IPTOS_DSCP_AF43 },
11097c95c3bSDave Täht { "cs0", IPTOS_DSCP_CS0 },
11197c95c3bSDave Täht { "cs1", IPTOS_DSCP_CS1 },
11297c95c3bSDave Täht { "cs2", IPTOS_DSCP_CS2 },
11397c95c3bSDave Täht { "cs3", IPTOS_DSCP_CS3 },
11497c95c3bSDave Täht { "cs4", IPTOS_DSCP_CS4 },
11597c95c3bSDave Täht { "cs5", IPTOS_DSCP_CS5 },
11697c95c3bSDave Täht { "cs6", IPTOS_DSCP_CS6 },
11797c95c3bSDave Täht { "cs7", IPTOS_DSCP_CS7 },
11897c95c3bSDave Täht { "ef", IPTOS_DSCP_EF },
11997c95c3bSDave Täht { "lowdelay", IPTOS_LOWDELAY },
12097c95c3bSDave Täht { "throughput", IPTOS_THROUGHPUT },
12197c95c3bSDave Täht { "reliability", IPTOS_RELIABILITY },
12297c95c3bSDave Täht { NULL, -1 }
12397c95c3bSDave Täht };
12497c95c3bSDave Täht
12597c95c3bSDave Täht int
parse_qos(const char * cp)12697c95c3bSDave Täht parse_qos(const char *cp)
12797c95c3bSDave Täht {
12897c95c3bSDave Täht unsigned int i;
12997c95c3bSDave Täht char *ep = NULL;
13097c95c3bSDave Täht long val;
13197c95c3bSDave Täht
13297c95c3bSDave Täht if (cp == NULL)
13397c95c3bSDave Täht return -1;
13497c95c3bSDave Täht for (i = 0; ipqos[i].name != NULL; i++) {
13597c95c3bSDave Täht if (strcasecmp(cp, ipqos[i].name) == 0)
13697c95c3bSDave Täht return ipqos[i].value;
13797c95c3bSDave Täht }
13897c95c3bSDave Täht /* Try parsing as an integer */
139*d424be34SPreston Hunt /* Max DSCP value is 2**6 - 1 */
14097c95c3bSDave Täht val = strtol(cp, &ep, 0);
141*d424be34SPreston Hunt if (*cp == '\0' || *ep != '\0' || val < 0 || val > 63)
14297c95c3bSDave Täht return -1;
143*d424be34SPreston Hunt return val << 2;
14497c95c3bSDave Täht }
14597c95c3bSDave Täht
14697c95c3bSDave Täht const char *
iptos2str(int iptos)14797c95c3bSDave Täht iptos2str(int iptos)
14897c95c3bSDave Täht {
14997c95c3bSDave Täht int i;
15097c95c3bSDave Täht static char iptos_str[sizeof "0xff"];
15197c95c3bSDave Täht if (iptos < 0 || iptos > 64) iptos = 0;
15297c95c3bSDave Täht for (i = 0; ipqos[i].name != NULL; i++) {
15397c95c3bSDave Täht if (ipqos[i].value == iptos)
15497c95c3bSDave Täht return ipqos[i].name;
15597c95c3bSDave Täht }
15697c95c3bSDave Täht snprintf(iptos_str, sizeof iptos_str, "0x%02x", iptos);
15797c95c3bSDave Täht return iptos_str;
15897c95c3bSDave Täht }
159