device/interface: add "tags" attribute from config to status dump
authorFelix Fietkau <nbd@nbd.name>
Fri, 8 Nov 2024 09:33:35 +0000 (10:33 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 8 Nov 2024 09:33:45 +0000 (10:33 +0100)
This allows annotating interfaces/devices in the config in a way that can be
queried through status. One example use case is to mark wifi interfaces for
use with specific services without having to explicitly reference sections
from elsewhere.

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

index 0ec3409ff32e89f38e36eb53430b1caba3eeb9bd..06f52cc89e7d908a1b7f53eab6feb7d19d920cf7 100644 (file)
--- a/device.c
+++ b/device.c
@@ -75,6 +75,7 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = {
        [DEV_ATTR_GRO] = { .name = "gro", .type = BLOBMSG_TYPE_BOOL },
        [DEV_ATTR_MASTER] = { .name = "conduit", .type = BLOBMSG_TYPE_STRING },
        [DEV_ATTR_EEE] = { .name = "eee", .type = BLOBMSG_TYPE_BOOL },
+       [DEV_ATTR_TAGS] = { .name = "tags", .type = BLOBMSG_TYPE_ARRAY },
 };
 
 const struct uci_blob_param_list device_attr_list = {
@@ -585,6 +586,10 @@ device_init_settings(struct device *dev, struct blob_attr **tb)
        free(dev->config_auth_vlans);
        dev->config_auth_vlans = cur ? blob_memdup(cur) : NULL;
 
+       cur = tb[DEV_ATTR_TAGS];
+       free(dev->tags);
+       dev->tags = cur ? blob_memdup(cur) : NULL;
+
        device_set_extra_vlans(dev, tb[DEV_ATTR_VLAN]);
        device_set_disabled(dev, disabled);
 }
@@ -1085,6 +1090,7 @@ device_free(struct device *dev)
        free(dev->auth_vlans);
        free(dev->config);
        device_cleanup(dev);
+       free(dev->tags);
        free(dev->config_auth_vlans);
        free(dev->extra_vlan);
        dev->type->free(dev);
@@ -1351,6 +1357,9 @@ device_dump_status(struct blob_buf *b, struct device *dev)
        blobmsg_add_u8(b, "carrier", !!dev->link_active);
        blobmsg_add_u8(b, "auth_status", !!dev->auth_status);
 
+       if (dev->tags)
+               blobmsg_add_blob(b, dev->tags);
+
        if (dev->type->dump_info)
                dev->type->dump_info(dev, b);
        else
index 1c01b58889ed7b957bb9bc36af33f467d2d533ef..bda204c7a5fff536a8cffaec1c7b4d07694076fd 100644 (file)
--- a/device.h
+++ b/device.h
@@ -72,6 +72,7 @@ enum {
        DEV_ATTR_GRO,
        DEV_ATTR_MASTER,
        DEV_ATTR_EEE,
+       DEV_ATTR_TAGS,
        __DEV_ATTR_MAX,
 };
 
@@ -250,6 +251,7 @@ struct device {
        struct kvlist vlan_aliases;
        struct blob_attr *config_auth_vlans;
        struct blob_attr *auth_vlans;
+       struct blob_attr *tags;
 
        char ifname[IFNAMSIZ];
        int ifindex;
index 923b5b3c9889043e5a3a49cd1626f944bb2dc671..3fcfc79eae4ccf519c4ecf0899e5a00a1fe24522 100644 (file)
@@ -57,6 +57,7 @@ enum {
        IFACE_ATTR_IP6IFACEID,
        IFACE_ATTR_FORCE_LINK,
        IFACE_ATTR_IP6WEIGHT,
+       IFACE_ATTR_TAGS,
        IFACE_ATTR_MAX
 };
 
@@ -87,6 +88,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = {
        [IFACE_ATTR_IP6IFACEID] = { .name = "ip6ifaceid", .type = BLOBMSG_TYPE_STRING },
        [IFACE_ATTR_FORCE_LINK] = { .name = "force_link", .type = BLOBMSG_TYPE_BOOL },
        [IFACE_ATTR_IP6WEIGHT] = { .name = "ip6weight", .type = BLOBMSG_TYPE_INT32 },
+       [IFACE_ATTR_TAGS] = { .name = "tags", .type = BLOBMSG_TYPE_ARRAY },
 };
 
 const struct uci_blob_param_list interface_attr_list = {
@@ -978,6 +980,7 @@ static bool __interface_add(struct interface *iface, struct blob_attr *config, b
        }
 
        iface->config = config;
+       iface->tags = tb[IFACE_ATTR_TAGS];
        vlist_add(&interfaces, &iface->node, iface->name);
 
        if (name) {
@@ -1321,6 +1324,7 @@ interface_change_config(struct interface *if_old, struct interface *if_new)
        })
 
        if_old->config = if_new->config;
+       if_old->tags = if_new->tags;
        if (if_old->config_autostart != if_new->config_autostart) {
                if (if_old->config_autostart)
                        reload = true;
index 122864f9f08b04d53c4bcd7f14f8e2a929f23571..08d74eb10b65e29153f2f5c598f8a9e9785900bb 100644 (file)
@@ -145,6 +145,7 @@ struct interface {
        struct device_user l3_dev;
 
        struct blob_attr *config;
+       struct blob_attr *tags;
 
        /* primary protocol state */
        const struct proto_handler *proto_handler;
diff --git a/ubus.c b/ubus.c
index 3c3a7dccb6c201d59d08a16579931370cdf35ff6..5ab1884a3e7cb8b169953016174b61ad46f123c8 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -838,6 +838,8 @@ netifd_dump_status(struct interface *iface)
 
        if (iface->jail_device)
                blobmsg_add_string(&b, "jail_device", iface->jail_device);
+       if (iface->tags)
+               blobmsg_add_blob(&b, iface->tags);
 
        if (iface->state == IFS_UP) {
                if (iface->updated) {