/*
 * 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 }
};



static 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);
}



static 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);
}


