From ef82defaae26619e5b2ebddfdd86e9de61c399f1 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 8 Apr 2022 13:02:42 +0200 Subject: [PATCH] ubus: add active devices to bridger blacklist Ensures that bridge offload won't interfere with QoS Signed-off-by: Felix Fietkau --- interface.c | 20 ++++++++++++++++++++ qosify.h | 2 ++ ubus.c | 22 ++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/interface.c b/interface.c index e51db3f..837cb95 100644 --- a/interface.c +++ b/interface.c @@ -531,6 +531,7 @@ static void qos_iface_check_cb(struct uloop_timeout *t) qosify_iface_check_device(iface); vlist_for_each_element(&interfaces, iface, node) qosify_iface_check_interface(iface); + qosify_ubus_update_bridger(false); } void qosify_iface_check(void) @@ -602,6 +603,25 @@ qosify_nl_error_cb(struct sockaddr_nl *nla, struct nlmsgerr *err, return NL_STOP; } +static void +__qosify_iface_get_device(struct blob_buf *b, struct qosify_iface *iface) +{ + if (!iface->ifname[0] || !iface->active) + return; + + blobmsg_add_string(b, NULL, iface->ifname); +} + +void qosify_iface_get_devices(struct blob_buf *b) +{ + struct qosify_iface *iface; + + vlist_for_each_element(&devices, iface, node) + __qosify_iface_get_device(b, iface); + vlist_for_each_element(&interfaces, iface, node) + __qosify_iface_get_device(b, iface); +} + int qosify_iface_init(void) { int fd, opt; diff --git a/qosify.h b/qosify.h index dab1ebb..d1260ad 100644 --- a/qosify.h +++ b/qosify.h @@ -104,6 +104,7 @@ int qosify_iface_init(void); void qosify_iface_config_update(struct blob_attr *ifaces, struct blob_attr *devs); void qosify_iface_check(void); void qosify_iface_status(struct blob_buf *b); +void qosify_iface_get_devices(struct blob_buf *b); void qosify_iface_stop(void); int qosify_dns_init(void); @@ -112,5 +113,6 @@ void qosify_dns_stop(void); int qosify_ubus_init(void); void qosify_ubus_stop(void); int qosify_ubus_check_interface(const char *name, char *ifname, int ifname_len); +void qosify_ubus_update_bridger(bool shutdown); #endif diff --git a/ubus.c b/ubus.c index 644df1a..aaab043 100644 --- a/ubus.c +++ b/ubus.c @@ -342,6 +342,8 @@ qosify_ubus_event_cb(struct ubus_context *ctx, struct ubus_event_handler *ev, path = blobmsg_get_string(attr); if (!strcmp(path, "dnsmasq.dns")) qosify_subscribe_dnsmasq(ctx); + else if (!strcmp(path, "bridger")) + qosify_ubus_update_bridger(false); } @@ -359,6 +361,25 @@ ubus_connect_handler(struct ubus_context *ctx) static struct ubus_auto_conn conn; +void qosify_ubus_update_bridger(bool shutdown) +{ + struct ubus_request req; + uint32_t id; + void *c; + + if (ubus_lookup_id(&conn.ctx, "bridger", &id)) + return; + + blob_buf_init(&b, 0); + blobmsg_add_string(&b, "name", "qosify"); + c = blobmsg_open_array(&b, "devices"); + if (!shutdown) + qosify_iface_get_devices(&b); + blobmsg_close_array(&b, c); + + ubus_invoke_async(&conn.ctx, id, "set_blacklist", b.head, &req); +} + int qosify_ubus_init(void) { conn.cb = ubus_connect_handler; @@ -369,6 +390,7 @@ int qosify_ubus_init(void) void qosify_ubus_stop(void) { + qosify_ubus_update_bridger(true); ubus_auto_shutdown(&conn); } -- 2.30.2