diff options
author | Felix Fietkau <nbd@nbd.name> | 2018-03-13 12:52:43 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2018-03-13 12:57:40 +0100 |
commit | c06f84238952211b35c2940a82fcce3fcc3221c1 (patch) | |
tree | 10c9006c5bce37cc64f2939177ee4e22b50efb5d | |
parent | 1f5a29c3de6e3fec5883796ee772e25d56db6a69 (diff) |
device: add support for setting the isolate options for bridge ports
Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r-- | device.c | 6 | ||||
-rw-r--r-- | device.h | 3 | ||||
-rw-r--r-- | system-linux.c | 9 |
3 files changed, 18 insertions, 0 deletions
@@ -57,6 +57,7 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = { [DEV_ATTR_UNICAST_FLOOD] = { .name ="unicast_flood", .type = BLOBMSG_TYPE_BOOL }, [DEV_ATTR_SENDREDIRECTS] = { .name = "sendredirects", .type = BLOBMSG_TYPE_BOOL }, [DEV_ATTR_NEIGHLOCKTIME] = { .name = "neighlocktime", .type = BLOBMSG_TYPE_INT32 }, + [DEV_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL }, }; const struct uci_blob_param_list device_attr_list = { @@ -362,6 +363,11 @@ device_init_settings(struct device *dev, struct blob_attr **tb) s->flags |= DEV_OPT_SENDREDIRECTS; } + if ((cur = tb[DEV_ATTR_ISOLATE])) { + s->isolate = blobmsg_get_bool(cur); + s->flags |= DEV_OPT_ISOLATE; + } + device_set_disabled(dev, disabled); } @@ -50,6 +50,7 @@ enum { DEV_ATTR_NEIGHGCSTALETIME, DEV_ATTR_SENDREDIRECTS, DEV_ATTR_NEIGHLOCKTIME, + DEV_ATTR_ISOLATE, __DEV_ATTR_MAX, }; @@ -102,6 +103,7 @@ enum { DEV_OPT_MULTICAST_FAST_LEAVE = (1 << 20), DEV_OPT_SENDREDIRECTS = (1 << 21), DEV_OPT_NEIGHLOCKTIME = (1 << 22), + DEV_OPT_ISOLATE = (1 << 23), }; /* events broadcasted to all users of a device */ @@ -168,6 +170,7 @@ struct device_settings { bool learning; bool unicast_flood; bool sendredirects; + bool isolate; }; /* diff --git a/system-linux.c b/system-linux.c index 4f3b9b0..0ca5256 100644 --- a/system-linux.c +++ b/system-linux.c @@ -346,6 +346,11 @@ static void system_bridge_set_hairpin_mode(struct device *dev, const char *val) system_set_dev_sysctl("/sys/class/net/%s/brport/hairpin_mode", dev->ifname, val); } +static void system_bridge_set_isolate_mode(struct device *dev, const char *val) +{ + system_set_dev_sysctl("/sys/class/net/%s/brport/isolate_mode", dev->ifname, val); +} + static void system_bridge_set_multicast_router(struct device *dev, const char *val, bool bridge) { system_set_dev_sysctl(bridge ? "/sys/class/net/%s/bridge/multicast_router" : @@ -748,6 +753,10 @@ int system_bridge_addif(struct device *bridge, struct device *dev) !dev->settings.unicast_flood) system_bridge_set_unicast_flood(dev, "0"); + if (dev->settings.flags & DEV_OPT_ISOLATE && + dev->settings.isolate) + system_bridge_set_isolate_mode(dev, "1"); + return ret; } |