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:[-] TCP single port, or range from to - udp:[-] UDP single port, or range from to - IPv4 address, e.g. 1.1.1.1 - IPv6 address, e.g. ff01::1 - dns: fnmatch() pattern supporting * and ? as wildcard characters - dns:/ 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: - Support for LAN host based priority