diff options
| author | Felix Fietkau | 2022-03-04 13:15:44 +0000 |
|---|---|---|
| committer | Felix Fietkau | 2022-03-05 14:21:18 +0000 |
| commit | 558eabc13c64bdbd2d380e9520d56107d60a13cd (patch) | |
| tree | 8e4bb2b546bd2344709b6d98167d082de04c923c | |
| parent | 3276aed81c7375cab59c5d2a06a0f2b3c1002e5a (diff) | |
| download | qosify-558eabc13c64bdbd2d380e9520d56107d60a13cd.tar.gz | |
map: move dns host based lookup code to a separate function
Signed-off-by: Felix Fietkau <nbd@nbd.name>
| -rw-r--r-- | map.c | 54 | ||||
| -rw-r--r-- | qosify.h | 1 |
2 files changed, 34 insertions, 21 deletions
@@ -710,31 +710,18 @@ void qosify_map_gc(void) uloop_timeout_set(&qosify_map_timer, timeout * 1000); } - -int qosify_map_add_dns_host(char *host, const char *addr, const char *type, int ttl) +int qosify_map_lookup_dns_entry(char *host, uint8_t *dscp) { struct qosify_map_data data = { .id = CL_MAP_DNS, .addr.dns.pattern = "", }; struct qosify_map_entry *e; - int prev_timeout = qosify_map_timeout; + bool ret = -1; char *c; e = avl_find_ge_element(&map_data, &data, e, avl); if (!e) - return 0; - - memset(&data, 0, sizeof(data)); - data.user = true; - if (!strcmp(type, "A")) - data.id = CL_MAP_IPV4_ADDR; - else if (!strcmp(type, "AAAA")) - data.id = CL_MAP_IPV6_ADDR; - else - return 0; - - if (qosify_map_fill_ip(&data, addr)) return -1; for (c = host; *c; c++) @@ -744,7 +731,7 @@ int qosify_map_add_dns_host(char *host, const char *addr, const char *type, int regex_t *regex = &e->data.addr.dns.regex; if (e->data.id != CL_MAP_DNS) - return 0; + break; if (e->data.addr.dns.pattern[0] == '/') { if (regexec(regex, host, 0, NULL, 0) != 0) @@ -754,13 +741,38 @@ int qosify_map_add_dns_host(char *host, const char *addr, const char *type, int continue; } - if (ttl) - qosify_map_timeout = ttl; - data.dscp = e->data.dscp; - __qosify_map_set_entry(&data); - qosify_map_timeout = prev_timeout; + *dscp = e->data.dscp; + ret = 0; } + return ret; +} + + +int qosify_map_add_dns_host(char *host, const char *addr, const char *type, int ttl) +{ + struct qosify_map_data data = {}; + int prev_timeout = qosify_map_timeout; + + if (qosify_map_lookup_dns_entry(host, &data.dscp)) + return 0; + + data.user = true; + if (!strcmp(type, "A")) + data.id = CL_MAP_IPV4_ADDR; + else if (!strcmp(type, "AAAA")) + data.id = CL_MAP_IPV6_ADDR; + else + return 0; + + if (qosify_map_fill_ip(&data, addr)) + return -1; + + if (ttl) + qosify_map_timeout = ttl; + __qosify_map_set_entry(&data); + qosify_map_timeout = prev_timeout; + return 0; } @@ -86,6 +86,7 @@ void qosify_map_set_dscp_default(enum qosify_map_id id, uint8_t val); void qosify_map_reset_config(void); void qosify_map_update_config(void); void qosify_map_set_classes(struct blob_attr *val); +int qosify_map_lookup_dns_entry(char *host, uint8_t *dscp); int qosify_map_add_dns_host(char *host, const char *addr, const char *type, int ttl); int map_parse_flow_config(struct qosify_flow_config *cfg, struct blob_attr *attr, bool reset); |