Re: [PATCH 05/15] vendor_quirks: initial skeleton
Marcel Holtmann <[email protected]> Sat, 23 Aug 2025 16:43:44 +0200
| Newsgroups | dev.linux.lists.iwd |
|---|---|
| Message-ID | <[email protected]> |
Hi James,
> This module will provide a database for known issues or quirks with
> wireless vendors. For now the list of quirks is limited to 32 as
> that is the size returned in the bit mask. This could be extended
> to 64 in the future if needed, but of course the goal is to never
> reach that level.
>
> The vendor_quirks() API is intended to be called from scan.c when
> parsing vendor attributes. This will lookup any quirks associated
> with the OUI provided and a mask of quirks will be returned. This
> can be repeated against all the vendor OUI's seen in the scan. The
> result is then a bitmask containing all quirks for that BSS. This
> can then be referenced later during various operations in IWD.
> ---
> Makefile.am | 2 ++
> src/vendor_quirks.c | 53 +++++++++++++++++++++++++++++++++++++++++++++
> src/vendor_quirks.h | 25 +++++++++++++++++++++
> 3 files changed, 80 insertions(+)
> create mode 100644 src/vendor_quirks.c
> create mode 100644 src/vendor_quirks.h
>
> diff --git a/Makefile.am b/Makefile.am
> index 92adfa6e..c01cd4c4 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -274,6 +274,8 @@ src_iwd_SOURCES = src/main.c linux/nl80211.h src/iwd.h \
> src/dpp.c \
> src/udev.c \
> src/pmksa.h src/pmksa.c \
> + src/vendor_quirks.h \
> + src/vendor_quirks.c \
> $(eap_sources) \
> $(builtin_sources)
>
> diff --git a/src/vendor_quirks.c b/src/vendor_quirks.c
> new file mode 100644
> index 00000000..ccfcb444
> --- /dev/null
> +++ b/src/vendor_quirks.c
> @@ -0,0 +1,53 @@
> +/*
> + *
> + * Wireless daemon for Linux
> + *
> + * Copyright (C) 2025 Locus Robotics Corporation. All rights reserved.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> + *
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include <string.h>
> +
> +#include <ell/ell.h>
> +
> +#include "src/vendor_quirks.h"
> +
> +static const struct {
> + uint8_t oui[3];
> + uint32_t quirks;
> +} quirk_db[] = {
> + { }
> +};
> +
> +uint32_t vendor_quirks(const uint8_t *oui)
> +{
> + size_t i;
> + uint32_t ret = 0;
> +
> + for (i = 0; i < L_ARRAY_SIZE(quirk_db); i++) {
> + if (memcmp(quirk_db[i].oui, oui, 3))
> + continue;
> +
> + ret |= quirk_db[i].quirks;
> + }
if you are using an empty {} entry to signal end of the array, then it makes no sense to also use L_ARRAY_SIZE.
Regards
Marcel