From: Miquel Raynal <miquel.raynal@bootlin.com>
To: Alexander Aring <aahringo@redhat.com>
Cc: Alexander Aring <alex.aring@gmail.com>,
Stefan Schmidt <stefan@datenfreihafen.org>,
linux-wpan@vger.kernel.org,
"David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Eric Dumazet <edumazet@google.com>,
netdev@vger.kernel.org, David Girault <david.girault@qorvo.com>,
Romuald Despres <romuald.despres@qorvo.com>,
Frederic Blain <frederic.blain@qorvo.com>,
Nicolas Schodet <nico@ni.fr.eu.org>,
Guilhem Imberton <guilhem.imberton@qorvo.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: Re: [PATCH wpan-next v4 07/11] mac802154: Handle association requests from peers
Date: Wed, 27 Sep 2023 16:39:48 +0200 [thread overview]
Message-ID: <20230927163948.672a479b@xps-13> (raw)
In-Reply-To: <CAK-6q+jFmvXGWOJFvHagC06mnbu6O1=Ndg8auNkGXTaqSf-7rg@mail.gmail.com>
Hi Alexander,
aahringo@redhat.com wrote on Tue, 26 Sep 2023 21:31:09 -0400:
> Hi,
>
> On Mon, Sep 25, 2023 at 3:43 AM Miquel Raynal <miquel.raynal@bootlin.com> wrote:
> >
> > Hi Alexander,
> >
> > aahringo@redhat.com wrote on Sun, 24 Sep 2023 20:13:34 -0400:
> >
> > > Hi,
> > >
> > > On Fri, Sep 22, 2023 at 11:51 AM Miquel Raynal
> > > <miquel.raynal@bootlin.com> wrote:
> > > >
> > > > 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 | 30 +++++++
> > > > net/mac802154/ieee802154_i.h | 2 +
> > > > net/mac802154/rx.c | 8 ++
> > > > net/mac802154/scan.c | 142 ++++++++++++++++++++++++++++++++
> > > > 7 files changed, 202 insertions(+)
> > > >
> > > > diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h
> > > > index 9b036ab20079..c844ae63bc04 100644
> > > > --- a/include/net/cfg802154.h
> > > > +++ b/include/net/cfg802154.h
> > > > @@ -583,4 +583,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 a08d75dd56ad..1670a71327a7 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);
> > > >
> > > > kfree(wpan_dev->parent);
> > > > wpan_dev->parent = NULL;
> > > >
> > > > + list_for_each_entry_safe(child, tmp, &wpan_dev->children, node) {
> > > > + list_del(&child->node);
> > > > + kfree(child);
> > > > + }
> > > > +
> > > > mutex_unlock(&wpan_dev->association_lock);
> > > > }
> > > >
> > > > diff --git a/net/ieee802154/pan.c b/net/ieee802154/pan.c
> > > > index 9e1f1973c294..e99c64054dcb 100644
> > > > --- a/net/ieee802154/pan.c
> > > > +++ b/net/ieee802154/pan.c
> > > > @@ -73,3 +73,33 @@ 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);
> > > > + if (addr == cpu_to_le16(IEEE802154_ADDR_SHORT_BROADCAST) ||
> > > > + addr == cpu_to_le16(IEEE802154_ADDR_SHORT_UNSPEC))
> > > > + continue;
> > > > +
> > > > + if (wpan_dev->short_addr == addr)
> > > > + continue;
> > > > +
> > > > + if (wpan_dev->parent && wpan_dev->parent->short_addr == addr)
> > > > + continue;
> > > > +
> > > > + list_for_each_entry(child, &wpan_dev->children, node)
> > > > + if (child->short_addr == addr)
> > > > + continue;
> > > > +
> > > > + break;
> > > > + } while (1);
> > > > +
> > >
> > > I still believe that this random 2 bytes and check if it's already
> > > being used is wrong here. We need something to use the next free
> > > available number according to the data we are storing here.
> >
> > This issue I still have in mind is when you have this typology:
> >
> > device A -------> device B --------> device C <-------- device D
> > (leaf) (coord) (PAN coord) (leaf)
> >
> > B associates with C
> > A associates with B
> > D associates with C
> >
> > If B and C run Linux's stack, they will always have the same short
> > address. Yes this can be handled (realignment procedure). But any time
> > this happens, you'll have a load of predictable realignments when A and
> > D get in range with B or C.
> >
>
> I see that it can be "more" predictable, but what happens when there
> is the same short address case with the random number generator? It
> sounds to me like there needs to be a kind of duplicate address
> detection going on and then choose another one, if 802.15.4 even
> handles this case...
Yes it may happen, and yes it is handled by the spec (I did not
implement it yet). When such a situation occurs (two devices using the
same short address in a given PAN), the third-party device which
detects the faulty situation must notify its coordinator and the
coordinator (IIRC) must allocate a new short address as part of a
realignment procedure.
> I am also thinking that there is only one number left and the random
> generator runs multiple times to find the last one aka "it's random
> you can never be sure", when it always returns the same address.
I'll try to summarize the two issues and solutions we have:
- incremental short address: if two coordinators distribute
short addresses in a PAN, at the time we perform a realignment
procedure, if Coord A has allocated 1 short address (0) and Coord B
in the same PAN has allocated 10 short addresses (from 0 to 9), you
know that the device that needs a new address will be given 1, which
will lead to a realignment, then 2, then 3... and produce a *lot* of
noise. However despite being long on big network, we can assume the
time to find the relevant address is bounded.
- random short address: no conflict should happen following a
realignment procedure (assuming regular-sized networks, probability
is very low, close to 1/65000) however in case we have a huge
network, the time taken to find a free slot is unbounded.
At this stage I believe the former issue is more likely to happen than
the second, but the second is a bit critical as it can lead to DoS
situations. One easy way to mitigate this is to limit the number of
devices on the network (as you said in another mail, we can refuse
devices arbitrarily), which is the first denial procedure I've
implemented, knowing that it should be improved as well, as that can be
done later without much additional constraints.
> However, that's only my thoughts about it and hopefully can be
> improved in future.
Yes, I am not convinced this is the perfect choice but at least it's
simple enough and will work like a charm on small networks.
Thanks,
Miquèl
next prev parent reply other threads:[~2023-09-27 14:39 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-22 15:50 [PATCH wpan-next v4 00/11] ieee802154: Associations between devices Miquel Raynal
2023-09-22 15:50 ` [PATCH wpan-next v4 01/11] ieee802154: Let PAN IDs be reset Miquel Raynal
2023-09-24 20:42 ` Alexander Aring
2023-09-25 7:34 ` Miquel Raynal
2023-09-22 15:50 ` [PATCH wpan-next v4 02/11] ieee802154: Internal PAN management Miquel Raynal
2023-09-24 20:47 ` Alexander Aring
2023-09-27 16:10 ` Miquel Raynal
2023-09-29 0:22 ` Alexander Aring
2023-09-22 15:50 ` [PATCH wpan-next v4 03/11] ieee802154: Add support for user association requests Miquel Raynal
2023-09-22 15:50 ` [PATCH wpan-next v4 04/11] mac802154: Handle associating Miquel Raynal
2023-09-25 11:35 ` kernel test robot
2023-09-22 15:50 ` [PATCH wpan-next v4 05/11] ieee802154: Add support for user disassociation requests Miquel Raynal
2023-09-22 15:50 ` [PATCH wpan-next v4 06/11] mac802154: Handle disassociations Miquel Raynal
2023-09-22 15:50 ` [PATCH wpan-next v4 07/11] mac802154: Handle association requests from peers Miquel Raynal
2023-09-25 0:13 ` Alexander Aring
2023-09-25 7:43 ` Miquel Raynal
2023-09-27 1:31 ` Alexander Aring
2023-09-27 14:39 ` Miquel Raynal [this message]
2023-09-27 1:37 ` Alexander Aring
2023-09-27 15:40 ` Miquel Raynal
2023-09-29 0:19 ` Alexander Aring
2023-09-22 15:50 ` [PATCH wpan-next v4 08/11] ieee802154: Add support for limiting the number of associated devices Miquel Raynal
2023-09-22 15:50 ` [PATCH wpan-next v4 09/11] mac802154: Follow " Miquel Raynal
2023-09-22 15:50 ` [PATCH wpan-next v4 10/11] mac802154: Handle disassociation notifications from peers Miquel Raynal
2023-09-22 15:50 ` [PATCH wpan-next v4 11/11] ieee802154: Give the user the association list Miquel Raynal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230927163948.672a479b@xps-13 \
--to=miquel.raynal@bootlin.com \
--cc=aahringo@redhat.com \
--cc=alex.aring@gmail.com \
--cc=davem@davemloft.net \
--cc=david.girault@qorvo.com \
--cc=edumazet@google.com \
--cc=frederic.blain@qorvo.com \
--cc=guilhem.imberton@qorvo.com \
--cc=kuba@kernel.org \
--cc=linux-wpan@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nico@ni.fr.eu.org \
--cc=pabeni@redhat.com \
--cc=romuald.despres@qorvo.com \
--cc=stefan@datenfreihafen.org \
--cc=thomas.petazzoni@bootlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).