QoSify is simple daemon for setting up and managing CAKE along with a custom
eBPF based classifier that sets DSCP fields of packets.

It supports the following features:
- simple TCP/UDP port based mapping
- IP address based mapping
- priority boosting based on average packet size
- bulk flow detection based on number of packets per second
- dynamically add IP entries with timeout
- dns regex entries and ubus api for providing dns lookup results

It can be configured via ubus call qosify config.

This call supports the following parameters:
- "reset": BOOL
	Reset the config to defaults instead of only updating supplied values

- "files": ARRAY of STRING
	List of files with port/IP/host mappings

- "timeout": INT32
	Default timeout for dynamically added entries

- "dscp_default_udp": STRING
	Default DSCP value for UDP packets

- "dscp_default_tcp": STRING
	Default DSCP value for TCP packets

- "dscp_prio": STRING
	DSCP value for priority-marked packets

- "dscp_bulk": STRING
	DSCP value for bulk-marked packets

- "dscp_icmp": STRING
	DSCP value for ICMP packets

- "bulk_trigger_pps": INT32
	Number of packets per second to trigger bulk flow detection

- "bulk_trigger_timeout": INT32
	Time below bulk_trigger_pps threshold until a bulk flow mark is removed

- "prio_max_avg_pkt_len": INT32
	Maximum average packet length for marking a flow as priority

- "interfaces": TABLE of TABLE
	netifd interfaces to enable QoS on

- "devices": TABLE of TABLE
	netdevs to enable QoS on


interface/device properties:
- "bandwidth_up": STRING
	Uplink bandwidth (same format as tc)

- "bandwidth_down": STRING
	Downlink bandwidth (same format as tc)

- "ingress": BOOL
	Enable ingress shaping

- "egress": BOOL
	Enable egress shaping

- "mode": STRING
	CAKE diffserv mode

- "nat": BOOL
	Enable CAKE NAT host detection via conntrack

- "host_isolate": BOOL
	Enable CAKE host isolation

- "autorate_ingress": BOOL
	Enable CAKE automatic rate estimation for ingress

- "ingress_options": STRING
	CAKE ingress options

- "egress_options": STRING
	CAKE egress options

- "options": STRING
	CAKE options for ingress + egress


Mapping file syntax:

Each line has two whitespace separated fields, match and dscp
match is one of:
- tcp:<port>[-<endport>]
	TCP single port, or range from <port> to <endport>
- udp:<port>[-<endport>]
	UDP single port, or range from <port> to <endport>
- <ipaddr>
	IPv4 address, e.g. 1.1.1.1
- <ipv6addr>
	IPv6 address, e.g. ff01::1
- dns:<pattern>
	fnmatch() pattern supporting * and ? as wildcard characters
- dns:/<regex>
	POSIX.2 extended regular expression for matching hostnames
	Only works, if dns lookups are passed to qosify via the add_dns_host ubus call.

dscp can be a raw value, or a codepoint like CS0
Adding a + in front of the value tells qosify to only override the DSCP value if it is zero


Planned features:
- Integration with dnsmasq to support hostname pattern based DSCP marking
- Support for LAN host based priority
