qosify.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2021 Felix Fietkau <nbd@nbd.name>
  4. */
  5. #ifndef __QOS_CLASSIFY_H
  6. #define __QOS_CLASSIFY_H
  7. #include <stdbool.h>
  8. #include <regex.h>
  9. #include <bpf/bpf.h>
  10. #include <bpf/libbpf.h>
  11. #include "qosify-bpf.h"
  12. #include <libubox/utils.h>
  13. #include <libubox/avl.h>
  14. #include <libubox/blobmsg.h>
  15. #include <libubox/ulog.h>
  16. #include <netinet/in.h>
  17. #define CLASSIFY_PROG_PATH "/lib/bpf/qosify-bpf.o"
  18. #define CLASSIFY_PIN_PATH "/sys/fs/bpf/qosify"
  19. #define CLASSIFY_DATA_PATH "/sys/fs/bpf/qosify_data"
  20. #define QOSIFY_DNS_IFNAME "ifb-dns"
  21. #define QOSIFY_PRIO_BASE 0x110
  22. enum qosify_map_id {
  23. CL_MAP_TCP_PORTS,
  24. CL_MAP_UDP_PORTS,
  25. CL_MAP_IPV4_ADDR,
  26. CL_MAP_IPV6_ADDR,
  27. CL_MAP_CLASS,
  28. CL_MAP_CONFIG,
  29. CL_MAP_DNS,
  30. __CL_MAP_MAX,
  31. };
  32. struct qosify_map_data {
  33. enum qosify_map_id id;
  34. bool file : 1;
  35. bool user : 1;
  36. uint8_t dscp;
  37. uint8_t file_dscp;
  38. union {
  39. uint32_t port;
  40. struct in_addr ip;
  41. struct in6_addr ip6;
  42. struct {
  43. uint32_t seq : 30;
  44. uint32_t only_cname : 1;
  45. const char *pattern;
  46. regex_t regex;
  47. } dns;
  48. } addr;
  49. };
  50. struct qosify_map_entry {
  51. struct avl_node avl;
  52. uint32_t timeout;
  53. struct qosify_map_data data;
  54. };
  55. extern int qosify_map_timeout;
  56. extern int qosify_active_timeout;
  57. extern struct qosify_config config;
  58. extern struct qosify_flow_config flow_config;
  59. int qosify_run_cmd(char *cmd, bool ignore_error);
  60. int qosify_loader_init(void);
  61. const char *qosify_get_program(uint32_t flags, int *fd);
  62. int qosify_map_init(void);
  63. int qosify_map_dscp_value(const char *val, uint8_t *dscp);
  64. int qosify_map_load_file(const char *file);
  65. void __qosify_map_set_entry(struct qosify_map_data *data);
  66. int qosify_map_set_entry(enum qosify_map_id id, bool file, const char *str,
  67. uint8_t dscp);
  68. void qosify_map_reload(void);
  69. void qosify_map_clear_files(void);
  70. void qosify_map_gc(void);
  71. void qosify_map_dump(struct blob_buf *b);
  72. void qosify_map_stats(struct blob_buf *b, bool reset);
  73. void qosify_map_set_dscp_default(enum qosify_map_id id, uint8_t val);
  74. void qosify_map_reset_config(void);
  75. void qosify_map_update_config(void);
  76. void qosify_map_set_classes(struct blob_attr *val);
  77. int qosify_map_lookup_dns_entry(char *host, bool cname, uint8_t *dscp, uint32_t *seq);
  78. int qosify_map_add_dns_host(char *host, const char *addr, const char *type, int ttl);
  79. int map_parse_flow_config(struct qosify_flow_config *cfg, struct blob_attr *attr,
  80. bool reset);
  81. int map_fill_dscp_value(uint8_t *dest, struct blob_attr *attr, bool reset);
  82. int qosify_iface_init(void);
  83. void qosify_iface_config_update(struct blob_attr *ifaces, struct blob_attr *devs);
  84. void qosify_iface_check(void);
  85. void qosify_iface_status(struct blob_buf *b);
  86. void qosify_iface_get_devices(struct blob_buf *b);
  87. void qosify_iface_stop(void);
  88. int qosify_dns_init(void);
  89. void qosify_dns_stop(void);
  90. int qosify_ubus_init(void);
  91. void qosify_ubus_stop(void);
  92. int qosify_ubus_check_interface(const char *name, char *ifname, int ifname_len);
  93. void qosify_ubus_update_bridger(bool shutdown);
  94. #endif