diff options
author | Iain Barnes <zenadsl3030@zen.co.uk> | 2002-06-21 17:35:55 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2002-06-21 17:35:55 +0000 |
commit | 0ddae8f8ade1084c38a1408d61b6a16725912283 (patch) | |
tree | 98a812cce0e2830992fdb0e1d0dc823416fba355 /extensions/libipt_dscp_helper.c | |
parent | 7fdbc95796b8e592a445b3fb599fc99c25fc826b (diff) |
move DSCP name/value conversion to libipt_dscp_helper.c (Iain Barnes)
Diffstat (limited to 'extensions/libipt_dscp_helper.c')
-rw-r--r-- | extensions/libipt_dscp_helper.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/extensions/libipt_dscp_helper.c b/extensions/libipt_dscp_helper.c new file mode 100644 index 00000000..742ac86a --- /dev/null +++ b/extensions/libipt_dscp_helper.c @@ -0,0 +1,82 @@ +/* + * DiffServ classname <-> DiffServ codepoint mapping functions. + * + * The latest list of the mappings can be found at: + * <http://www.iana.org/assignments/dscp-registry> + * + * This code is released under the GNU GPL v2, 1991 + * + * Author: Iain Barnes + */ + +#include <stdio.h> +#include <string.h> +#include <iptables_common.h> + + + +static struct ds_class +{ + const char *name; + unsigned int dscp; +} ds_classes[] = +{ + { "CS0", 0x00 }, + { "CS1", 0x08 }, + { "CS2", 0x10 }, + { "CS3", 0x18 }, + { "CS4", 0x20 }, + { "CS5", 0x28 }, + { "CS6", 0x30 }, + { "CS7", 0x38 }, + { "BE", 0x00 }, + { "AF11", 0x0a }, + { "AF12", 0x0c }, + { "AF13", 0x0e }, + { "AF21", 0x12 }, + { "AF22", 0x14 }, + { "AF23", 0x16 }, + { "AF31", 0x1a }, + { "AF32", 0x1c }, + { "AF33", 0x1e }, + { "AF41", 0x22 }, + { "AF42", 0x24 }, + { "AF43", 0x26 }, + { "EF", 0x2e } +}; + + + +unsigned int +class_to_dscp(const char *name) +{ + int i; + + for (i = 0; i < sizeof(ds_classes) / sizeof(struct ds_class); i++) { + if (!strncasecmp(name, ds_classes[i].name, + strlen(ds_classes[i].name))) + return ds_classes[i].dscp; + } + + exit_error(PARAMETER_PROBLEM, + "Invalid DSCP value `%s'\n", name); +} + + + +const char * +dscp_to_name(unsigned int dscp) +{ + int i; + + for (i = 0; i < sizeof(ds_classes) / sizeof(struct ds_class); i++) { + if (dscp == ds_classes[i].dscp) + return ds_classes[i].name; + } + + + exit_error(PARAMETER_PROBLEM, + "Invalid DSCP value `%d'\n", dscp); +} + + |