ubus: add active devices to bridger blacklist
authorFelix Fietkau <nbd@nbd.name>
Fri, 8 Apr 2022 11:02:42 +0000 (13:02 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 8 Apr 2022 11:02:43 +0000 (13:02 +0200)
Ensures that bridge offload won't interfere with QoS

Signed-off-by: Felix Fietkau <nbd@nbd.name>
interface.c
qosify.h
ubus.c

index e51db3fd1a0cb4f430bdff9189bd031fc076d176..837cb9503f05e12685ff989f969819e4fa846c3c 100644 (file)
@@ -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;
index dab1ebb7e3fda2431fa50d7a7ceaeed727f5a394..d1260ad1a2837eae019c7bc267864bcdea0222e0 100644 (file)
--- 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 644df1a8533bc4ec53c680d95a92c70a0a7b1182..aaab04382fb411ae104a5c0342f8579be75d90d6 100644 (file)
--- 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);
 }