interface: support "zone" config option
authorRafał Miłecki <rafal@milecki.pl>
Wed, 27 Jul 2022 05:34:39 +0000 (07:34 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Thu, 11 Aug 2022 15:07:58 +0000 (17:07 +0200)
Many protocol handlers support "zone" option independently and they pass
it in the "data". Then it's read e.g. by a firewall[34].

Add support for "zone" directly to the netifd so:
1. It works for all protocols
2. Handlers don't have to duplicate code

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
interface.c
interface.h
ubus.c

index b3bb60121306006b21c917dee4f446bb2d5b20e3..255ce84950385bf586e284b14b6727ec4d64d9c1 100644 (file)
@@ -34,6 +34,7 @@ enum {
        IFACE_ATTR_IFNAME, /* Backward compatibility */
        IFACE_ATTR_PROTO,
        IFACE_ATTR_AUTO,
+       IFACE_ATTR_ZONE,
        IFACE_ATTR_JAIL,
        IFACE_ATTR_JAIL_DEVICE,
        IFACE_ATTR_JAIL_IFNAME,
@@ -62,6 +63,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = {
        [IFACE_ATTR_PROTO] = { .name = "proto", .type = BLOBMSG_TYPE_STRING },
        [IFACE_ATTR_IFNAME] = { .name = "ifname", .type = BLOBMSG_TYPE_STRING },
        [IFACE_ATTR_AUTO] = { .name = "auto", .type = BLOBMSG_TYPE_BOOL },
+       [IFACE_ATTR_ZONE] = { .name = "zone", .type = BLOBMSG_TYPE_STRING },
        [IFACE_ATTR_JAIL] = { .name = "jail", .type = BLOBMSG_TYPE_STRING },
        [IFACE_ATTR_JAIL_DEVICE] = { .name = "jail_device", .type = BLOBMSG_TYPE_STRING },
        [IFACE_ATTR_JAIL_IFNAME] = { .name = "jail_ifname", .type = BLOBMSG_TYPE_STRING },
@@ -832,6 +834,10 @@ interface_alloc(const char *name, struct blob_attr *config, bool dynamic)
        blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb,
                      blob_data(config), blob_len(config));
 
+       iface->zone = NULL;
+       if ((cur = tb[IFACE_ATTR_ZONE]))
+               iface->zone = strdup(blobmsg_get_string(cur));
+
        if ((cur = tb[IFACE_ATTR_PROTO]))
                proto_name = blobmsg_data(cur);
 
index 73a907059b8b605f27189b5cfeb6e45b5d40dc1b..9343ade2327bfe12b9b8fdc281daa20bebf31fc6 100644 (file)
@@ -108,6 +108,7 @@ struct interface {
 
        const char *name;
        const char *device;
+       const char *zone;
        char *jail;
        char *jail_device;
        char *host_device;
diff --git a/ubus.c b/ubus.c
index 2876e7d173fb5fef23732171f3aa431df4ce9f29..7f4821ddbff2ff34e6d844f669b978012b6237a0 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -918,6 +918,9 @@ netifd_dump_status(struct interface *iface)
        }
 
        a = blobmsg_open_table(&b, "data");
+
+       if (iface->zone)
+               blobmsg_add_string(&b, "zone", iface->zone);
        avl_for_each_element(&iface->data, data, node)
                blobmsg_add_blob(&b, data->data);