[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAK-6q+hh4Ny7zV-MbdjrGQq-Dtb783A8m3G5GMcXSdhSwicuiw@mail.gmail.com>
Date: Sun, 6 Nov 2022 21:03:19 -0500
From: Alexander Aring <aahringo@...hat.com>
To: Miquel Raynal <miquel.raynal@...tlin.com>
Cc: Alexander Aring <alex.aring@...il.com>,
Stefan Schmidt <stefan@...enfreihafen.org>,
linux-wpan@...r.kernel.org,
David Girault <david.girault@...vo.com>,
Romuald Despres <romuald.despres@...vo.com>,
Frederic Blain <frederic.blain@...vo.com>,
Nicolas Schodet <nico@...fr.eu.org>,
Guilhem Imberton <guilhem.imberton@...vo.com>,
Thomas Petazzoni <thomas.petazzoni@...tlin.com>,
"David S. Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>,
Eric Dumazet <edumazet@...gle.com>, netdev@...r.kernel.org
Subject: Re: [PATCH wpan-next 2/3] ieee802154: Handle coordinators discovery
Hi,
On Wed, Nov 2, 2022 at 11:20 AM Miquel Raynal <miquel.raynal@...tlin.com> wrote:
>
> Let's introduce helpers for giving the MAC layer a generic interface for
> advertising discovered coordinators/PANs upon beacon reception. This
> support requires the MAC layers to:
> - Allocate a coordinator/PAN descriptor and fill it.
> - Register this structure, giving the generic ieee802154 layer the
> necessary information about the coordinator/PAN the beacon originates
> from.
> - To flush all the allocated structures once the scan is done.
>
> The generic layer keeps a temporary list of the discovered coordinators
> to tell the user whether or not the beacon comes from a new device or
> not, so stateless userspace applications might not spam the user with
> identical information if not required.
>
> Co-developed-by: David Girault <david.girault@...vo.com>
> Signed-off-by: David Girault <david.girault@...vo.com>
> Signed-off-by: Miquel Raynal <miquel.raynal@...tlin.com>
> ---
> include/net/cfg802154.h | 12 ++++
> net/ieee802154/Makefile | 2 +-
> net/ieee802154/core.c | 2 +
> net/ieee802154/nl802154.c | 2 +
> net/ieee802154/pan.c | 114 ++++++++++++++++++++++++++++++++++++++
> 5 files changed, 131 insertions(+), 1 deletion(-)
> create mode 100644 net/ieee802154/pan.c
>
> diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h
> index 8d67d9ed438d..3057b4e0726c 100644
> --- a/include/net/cfg802154.h
> +++ b/include/net/cfg802154.h
> @@ -401,6 +401,10 @@ struct wpan_dev {
>
> /* fallback for acknowledgment bit setting */
> bool ackreq;
> +
> + /* Coordinators management during scans */
> + spinlock_t coord_list_lock;
> + struct list_head coord_list;
> };
>
> #define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
> @@ -451,4 +455,12 @@ static inline const char *wpan_phy_name(struct wpan_phy *phy)
>
> void ieee802154_configure_durations(struct wpan_phy *phy);
>
> +struct ieee802154_coord_desc *
> +cfg802154_alloc_coordinator(struct ieee802154_addr *coord, gfp_t gfp);
> +void cfg802154_free_coordinator_desc(struct ieee802154_coord_desc *desc);
> +void cfg802154_record_coordinator(struct wpan_phy *wpan_phy,
> + struct wpan_dev *wpan_dev,
> + struct ieee802154_coord_desc *desc);
> +void cfg802154_flush_known_coordinators(struct wpan_dev *wpan_dev);
> +
> #endif /* __NET_CFG802154_H */
> diff --git a/net/ieee802154/Makefile b/net/ieee802154/Makefile
> index f05b7bdae2aa..6b7c66de730d 100644
> --- a/net/ieee802154/Makefile
> +++ b/net/ieee802154/Makefile
> @@ -4,7 +4,7 @@ obj-$(CONFIG_IEEE802154_SOCKET) += ieee802154_socket.o
> obj-y += 6lowpan/
>
> ieee802154-y := netlink.o nl-mac.o nl-phy.o nl_policy.o core.o \
> - header_ops.o sysfs.o nl802154.o trace.o
> + header_ops.o sysfs.o nl802154.o pan.o trace.o
> ieee802154_socket-y := socket.o
>
> CFLAGS_trace.o := -I$(src)
> diff --git a/net/ieee802154/core.c b/net/ieee802154/core.c
> index 57546e07e06a..091eb467fde6 100644
> --- a/net/ieee802154/core.c
> +++ b/net/ieee802154/core.c
> @@ -276,6 +276,8 @@ static int cfg802154_netdev_notifier_call(struct notifier_block *nb,
> wpan_dev->identifier = ++rdev->wpan_dev_id;
> list_add_rcu(&wpan_dev->list, &rdev->wpan_dev_list);
> rdev->devlist_generation++;
> + spin_lock_init(&wpan_dev->coord_list_lock);
> + INIT_LIST_HEAD(&wpan_dev->coord_list);
>
> wpan_dev->netdev = dev;
> break;
> diff --git a/net/ieee802154/nl802154.c b/net/ieee802154/nl802154.c
> index f6fb7a228747..b6bd04fe160b 100644
> --- a/net/ieee802154/nl802154.c
> +++ b/net/ieee802154/nl802154.c
> @@ -1368,6 +1368,8 @@ static int nl802154_advertise_coordinator(struct wpan_phy *wpan_phy,
> struct sk_buff *msg;
> int ret;
>
> + lockdep_assert(&wpan_dev->coord_list_lock);
> +
> msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
> if (!msg)
> return -ENOMEM;
> diff --git a/net/ieee802154/pan.c b/net/ieee802154/pan.c
> new file mode 100644
> index 000000000000..0d4f752a090a
> --- /dev/null
> +++ b/net/ieee802154/pan.c
> @@ -0,0 +1,114 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * IEEE 802.15.4 PAN management
> + *
> + * Copyright (C) 2021 Qorvo US, Inc
> + * Authors:
> + * - David Girault <david.girault@...vo.com>
> + * - Miquel Raynal <miquel.raynal@...tlin.com>
> + */
> +
> +#include <linux/slab.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/device.h>
> +
> +#include <net/cfg802154.h>
> +#include <net/af_ieee802154.h>
> +
> +#include "ieee802154.h"
> +#include "../ieee802154/nl802154.h"
> +
> +struct ieee802154_coord_desc *
> +cfg802154_alloc_coordinator(struct ieee802154_addr *coord, gfp_t gfp)
> +{
> + struct ieee802154_coord_desc *desc;
> +
> + desc = kzalloc(sizeof(*desc), gfp);
> + if (!desc)
> + return ERR_PTR(-ENOMEM);
> +
> + desc->addr = kzalloc(sizeof(*coord), gfp);
> + if (!desc->addr) {
> + kfree(desc);
> + return ERR_PTR(-ENOMEM);
> + }
> +
> + memcpy(desc->addr, coord, sizeof(*coord));
> +
> + return desc;
> +}
> +EXPORT_SYMBOL_GPL(cfg802154_alloc_coordinator);
> +
> +void cfg802154_free_coordinator_desc(struct ieee802154_coord_desc *desc)
> +{
> + kfree(desc->addr);
> + kfree(desc);
> +}
> +EXPORT_SYMBOL_GPL(cfg802154_free_coordinator_desc);
> +
> +static bool
> +cfg802154_is_same_coordinator(struct ieee802154_coord_desc *a,
> + struct ieee802154_coord_desc *b)
> +{
> + if (a->addr->pan_id != b->addr->pan_id)
> + return false;
> +
> + if (a->addr->mode != b->addr->mode)
> + return false;
> +
> + if (a->addr->mode == IEEE802154_ADDR_SHORT &&
> + a->addr->short_addr == b->addr->short_addr)
> + return true;
> + else if (a->addr->mode == IEEE802154_ADDR_LONG &&
> + a->addr->extended_addr == b->addr->extended_addr)
> + return true;
> +
> + return false;
semantic is a little bit different, can we use "ieee802154_addr_equal()" here?
- Alex
Powered by blists - more mailing lists