[PATCH 2/6] add device setting for disabeling arp
Oldřich Jedlička
oldium.pro at gmail.com
Fri Nov 4 00:54:24 PDT 2022
Hi Joerg,
pá 4. 11. 2022 v 7:25 odesílatel Joerg Vehlow <lkml at jv-coder.de> napsal:
>
> From: Joerg Vehlow <joerg.vehlow at aox.de>
>
> ---
> device.c | 7 +++++++
> device.h | 3 +++
> system-linux.c | 7 +++++++
> 3 files changed, 17 insertions(+)
>
> diff --git a/device.c b/device.c
> index 4f55906..9ed50ef 100644
> --- a/device.c
> +++ b/device.c
> @@ -65,6 +65,7 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = {
> [DEV_ATTR_DUPLEX] = { .name = "duplex", .type = BLOBMSG_TYPE_BOOL },
> [DEV_ATTR_IP_FORWARDING] = { .name = "ip_forwarding", .type = BLOBMSG_TYPE_BOOL},
> [DEV_ATTR_IP6_FORWARDING] = { .name = "ip6_forwarding", .type = BLOBMSG_TYPE_BOOL},
> + [DEV_ATTR_ARP] = { .name = "arp", .type = BLOBMSG_TYPE_BOOL},
> };
>
> const struct uci_blob_param_list device_attr_list = {
> @@ -284,6 +285,7 @@ device_merge_settings(struct device *dev, struct device_settings *n)
> n->duplex = s->flags & DEV_OPT_DUPLEX ? s->duplex : os->duplex;
> n->ip_forwarding = s->flags & DEV_OPT_IP_FORWARDING ? s->ip_forwarding : os->ip_forwarding;
> n->ip6_forwarding = s->flags & DEV_OPT_IP6_FORWARDING ? s->ip6_forwarding : os->ip6_forwarding;
> + n->arp = s->flags & DEV_OPT_ARP ? s->arp : os->arp;
> n->flags = s->flags | os->flags | os->valid_flags;
> }
>
> @@ -478,6 +480,11 @@ device_init_settings(struct device *dev, struct blob_attr **tb)
> s->flags |= DEV_OPT_IP6_FORWARDING;
> }
>
> + if ((cur = tb[DEV_ATTR_ARP])) {
> + s->arp = blobmsg_get_bool(cur);
> + s->flags |= DEV_OPT_ARP;
> + }
> +
> device_set_disabled(dev, disabled);
> }
>
> diff --git a/device.h b/device.h
> index 066f537..f78bbcb 100644
> --- a/device.h
> +++ b/device.h
> @@ -64,6 +64,7 @@ enum {
> DEV_ATTR_DUPLEX,
> DEV_ATTR_IP_FORWARDING,
> DEV_ATTR_IP6_FORWARDING,
> + DEV_ATTR_ARP,
> __DEV_ATTR_MAX,
> };
>
> @@ -130,6 +131,7 @@ enum {
> DEV_OPT_DUPLEX = (1ULL << 31),
> DEV_OPT_IP_FORWARDING = (1ULL << 32),
> DEV_OPT_IP6_FORWARDING = (1ULL << 33),
> + DEV_OPT_ARP = (1ULL << 34),
> };
>
> /* events broadcasted to all users of a device */
> @@ -209,6 +211,7 @@ struct device_settings {
> bool duplex;
> bool ip_forwarding;
> bool ip6_forwarding;
> + bool arp;
> };
>
> /*
> diff --git a/system-linux.c b/system-linux.c
> index 6232a26..7b82e17 100644
> --- a/system-linux.c
> +++ b/system-linux.c
> @@ -1736,6 +1736,9 @@ system_if_get_settings(struct device *dev, struct device_settings *s)
>
> s->multicast = ifr.ifr_flags & IFF_MULTICAST;
> s->flags |= DEV_OPT_MULTICAST;
> +
> + s->arp = !(ifr.ifr_flags & IFF_NOARP);
> + s->arp |= DEV_OPT_ARP;
I am just a random reader, but this looks like a bug – shouldn't
DEV_OPT_ARP be applied to s->flags and not to s->arp?
Oldrich.
> }
>
> if (!system_get_rpfilter(dev, buf, sizeof(buf))) {
> @@ -1929,6 +1932,10 @@ system_if_apply_settings(struct device *dev, struct device_settings *s, uint64_t
> system_set_ip_forwarding(dev, s->ip_forwarding ? "1" : "0");
> if (apply_mask & DEV_OPT_IP6_FORWARDING)
> system_set_ip6_forwarding(dev, s->ip6_forwarding ? "1" : "0");
> + if (apply_mask & DEV_OPT_ARP) {
> + if (system_if_flags(dev->ifname, !s->arp ? IFF_NOARP : 0, s->arp ? IFF_NOARP : 0) < 0)
> + s->flags &= ~DEV_OPT_ARP;
> + }
>
> system_set_ethtool_settings(dev, s);
> }
> --
> 2.25.1
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list