Thread (24 messages) 24 messages, 3 authors, 2023-09-01

Re: [PATCH wpan-next 07/11] mac802154: Handle association requests from peers

From: Miquel Raynal <miquel.raynal@bootlin.com>
Date: 2023-08-21 08:53:08

Hi Alexander,

aahringo@redhat.com wrote on Sat, 3 Jun 2023 07:28:25 -0400:
Hi,

On Thu, Jun 1, 2023 at 11:50 AM Miquel Raynal [off-list ref] wrote:
quoted
Coordinators may have to handle association requests from peers which
want to join the PAN. The logic involves:
- Acknowledging the request (done by hardware)
- If requested, a random short address that is free on this PAN should
  be chosen for the device.
- Sending an association response with the short address allocated for
  the peer and expecting it to be ack'ed.

If anything fails during this procedure, the peer is considered not
associated.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
---
 include/net/cfg802154.h         |   7 ++
 include/net/ieee802154_netdev.h |   6 ++
 net/ieee802154/core.c           |   7 ++
 net/ieee802154/pan.c            |  27 ++++++
 net/mac802154/ieee802154_i.h    |   2 +
 net/mac802154/rx.c              |   8 ++
 net/mac802154/scan.c            | 147 ++++++++++++++++++++++++++++++++
 7 files changed, 204 insertions(+)
diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h
index 01bc6c2da7b9..4404072365e7 100644
--- a/include/net/cfg802154.h
+++ b/include/net/cfg802154.h
@@ -582,4 +582,11 @@ struct ieee802154_pan_device *
 cfg802154_device_is_child(struct wpan_dev *wpan_dev,
                          struct ieee802154_addr *target);

+/**
+ * cfg802154_get_free_short_addr - Get a free address among the known devices
+ * @wpan_dev: the wpan device
+ * @return: a random short address expectedly unused on our PAN
+ */
+__le16 cfg802154_get_free_short_addr(struct wpan_dev *wpan_dev);
+
 #endif /* __NET_CFG802154_H */
diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h
index 16194356cfe7..4de858f9929e 100644
--- a/include/net/ieee802154_netdev.h
+++ b/include/net/ieee802154_netdev.h
@@ -211,6 +211,12 @@ struct ieee802154_association_req_frame {
        struct ieee802154_assoc_req_pl assoc_req_pl;
 };

+struct ieee802154_association_resp_frame {
+       struct ieee802154_hdr mhr;
+       struct ieee802154_mac_cmd_pl mac_pl;
+       struct ieee802154_assoc_resp_pl assoc_resp_pl;
+};
+
 struct ieee802154_disassociation_notif_frame {
        struct ieee802154_hdr mhr;
        struct ieee802154_mac_cmd_pl mac_pl;
diff --git a/net/ieee802154/core.c b/net/ieee802154/core.c
index 8bf01bb7e858..39674db64336 100644
--- a/net/ieee802154/core.c
+++ b/net/ieee802154/core.c
@@ -200,11 +200,18 @@ EXPORT_SYMBOL(wpan_phy_free);

 static void cfg802154_free_peer_structures(struct wpan_dev *wpan_dev)
 {
+       struct ieee802154_pan_device *child, *tmp;
+
        mutex_lock(&wpan_dev->association_lock);

        if (wpan_dev->parent)
                kfree(wpan_dev->parent);

+       list_for_each_entry_safe(child, tmp, &wpan_dev->children, node) {
+               list_del(&child->node);
+               kfree(child);
+       }
+
        wpan_dev->association_generation++;

        mutex_unlock(&wpan_dev->association_lock);
diff --git a/net/ieee802154/pan.c b/net/ieee802154/pan.c
index 477e8dad0cf0..7756906c201d 100644
--- a/net/ieee802154/pan.c
+++ b/net/ieee802154/pan.c
@@ -66,3 +66,30 @@ cfg802154_device_is_child(struct wpan_dev *wpan_dev,
        return NULL;
 }
 EXPORT_SYMBOL_GPL(cfg802154_device_is_child);
+
+__le16 cfg802154_get_free_short_addr(struct wpan_dev *wpan_dev)
+{
+       struct ieee802154_pan_device *child;
+       __le16 addr;
+
+       lockdep_assert_held(&wpan_dev->association_lock);
+
+       do {
+               get_random_bytes(&addr, 2);  
This is combined with the max associations setting? I am not sure if
this is the best way to get free values from a u16 value where we have
some data structure of "given" addresses to a node. I recently was
looking into idr/xarray data structure... maybe we can use something
from there.
I actually thought about using an increasing index, but the pseudo
random generator seemed appropriate because of its "unpredictability",
but there is not real use for that (besides maybe testing purposes). I
can definitely switch to another solution.

Thanks,
Miquèl
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help