[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