10720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt#include <stdbool.h>
20720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt#include <stdint.h>
30720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt#include <stdio.h>
4ef18e8147903885708d1c264904129af4fb636d6Jan Engelhardt#include <linux/ip.h>
50720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt
6350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt#ifndef IPTOS_NORMALSVC
7350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt#	define IPTOS_NORMALSVC 0
8350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt#endif
9350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt
100720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardtstruct tos_value_mask {
110720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	uint8_t value, mask;
120720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt};
130720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt
140720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardtstatic const struct tos_symbol_info {
150720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	unsigned char value;
160720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	const char *name;
170720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt} tos_symbol_names[] = {
180720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	{IPTOS_LOWDELAY,    "Minimize-Delay"},
190720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	{IPTOS_THROUGHPUT,  "Maximize-Throughput"},
200720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	{IPTOS_RELIABILITY, "Maximize-Reliability"},
210720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	{IPTOS_MINCOST,     "Minimize-Cost"},
220720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	{IPTOS_NORMALSVC,   "Normal-Service"},
2332b8e61e4e5bd405d9ad07bf9468498dfbb19f9eJan Engelhardt	{},
240720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt};
250720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt
260720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardtstatic bool tos_try_print_symbolic(const char *prefix,
277ac405297ec38449b30e3b05fd6bf2082fd3d803Jan Engelhardt    uint8_t value, uint8_t mask)
280720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt{
290720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	const struct tos_symbol_info *symbol;
300720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt
310720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	if (mask != 0x3F)
320720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt		return false;
330720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt
340720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	for (symbol = tos_symbol_names; symbol->name != NULL; ++symbol)
350720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt		if (value == symbol->value) {
3673866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt			printf(" %s%s", prefix, symbol->name);
370720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt			return true;
380720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt		}
390720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt
400720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt	return false;
410720c1226381f5c71748673c43c12499f1f254c7Jan Engelhardt}
42