15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdbool.h>
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h>
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <linux/ip.h>
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef IPTOS_NORMALSVC
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#	define IPTOS_NORMALSVC 0
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct tos_value_mask {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	uint8_t value, mask;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const struct tos_symbol_info {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	unsigned char value;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const char *name;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} tos_symbol_names[] = {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{IPTOS_LOWDELAY,    "Minimize-Delay"},
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{IPTOS_THROUGHPUT,  "Maximize-Throughput"},
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{IPTOS_RELIABILITY, "Maximize-Reliability"},
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{IPTOS_MINCOST,     "Minimize-Cost"},
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{IPTOS_NORMALSVC,   "Normal-Service"},
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{},
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool tos_try_print_symbolic(const char *prefix,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8_t value, uint8_t mask)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	const struct tos_symbol_info *symbol;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (mask != 0x3F)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return false;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (symbol = tos_symbol_names; symbol->name != NULL; ++symbol)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (value == symbol->value) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			printf(" %s%s", prefix, symbol->name);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			return true;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return false;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)