diff mbox series

[wpan-next,2/5] mac802154: Use the PAN coordinator parameter when stamping packets

Message ID 20231128111655.507479-3-miquel.raynal@bootlin.com (mailing list archive)
State Accepted
Headers show
Series ieee802154: Association tweaks | expand

Commit Message

Miquel Raynal Nov. 28, 2023, 11:16 a.m. UTC
ACKs come with the source and destination address empty, this has been
clarified already. But there is something else: if the destination
address is empty but the source address is valid, it may be a way to
reach the PAN coordinator. Either the device receiving this frame is the
PAN coordinator itself and should process what it just received
(PACKET_HOST) or it is not and may, if supported, relay the packet as it
is targeted to another device in the network.

Right now we do not support relaying so the packet should be dropped in
the first place, but the stamping looks more accurate this way.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
---
 net/mac802154/rx.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

Stefan Schmidt Dec. 7, 2023, 8:44 p.m. UTC | #1
Hello.

On 28.11.23 12:16, Miquel Raynal wrote:
> ACKs come with the source and destination address empty, this has been
> clarified already. But there is something else: if the destination
> address is empty but the source address is valid, it may be a way to
> reach the PAN coordinator. Either the device receiving this frame is the
> PAN coordinator itself and should process what it just received
> (PACKET_HOST) or it is not and may, if supported, relay the packet as it
> is targeted to another device in the network.
> 
> Right now we do not support relaying so the packet should be dropped in
> the first place, but the stamping looks more accurate this way.
> 
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> ---
>   net/mac802154/rx.c | 11 +++++++----
>   1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/net/mac802154/rx.c b/net/mac802154/rx.c
> index 0024341ef9c5..e40a988d6c80 100644
> --- a/net/mac802154/rx.c
> +++ b/net/mac802154/rx.c
> @@ -156,12 +156,15 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
>   
>   	switch (mac_cb(skb)->dest.mode) {
>   	case IEEE802154_ADDR_NONE:
> -		if (hdr->source.mode != IEEE802154_ADDR_NONE)
> -			/* FIXME: check if we are PAN coordinator */
> -			skb->pkt_type = PACKET_OTHERHOST;
> -		else
> +		if (hdr->source.mode == IEEE802154_ADDR_NONE)
>   			/* ACK comes with both addresses empty */
>   			skb->pkt_type = PACKET_HOST;
> +		else if (!wpan_dev->parent)
> +			/* No dest means PAN coordinator is the recipient */
> +			skb->pkt_type = PACKET_HOST;
> +		else
> +			/* We are not the PAN coordinator, just relaying */
> +			skb->pkt_type = PACKET_OTHERHOST;
>   		break;
>   	case IEEE802154_ADDR_LONG:
>   		if (mac_cb(skb)->dest.pan_id != span &&

Acked-by: Stefan Schmidt <stefan@datenfreihafen.org>

regards
Stefan Schmidt
Alexander Aring Dec. 15, 2023, 2:46 a.m. UTC | #2
Hi,

On Tue, Nov 28, 2023 at 6:17 AM Miquel Raynal <miquel.raynal@bootlin.com> wrote:
>
> ACKs come with the source and destination address empty, this has been
> clarified already. But there is something else: if the destination
> address is empty but the source address is valid, it may be a way to
> reach the PAN coordinator. Either the device receiving this frame is the
> PAN coordinator itself and should process what it just received
> (PACKET_HOST) or it is not and may, if supported, relay the packet as it
> is targeted to another device in the network.
>
> Right now we do not support relaying so the packet should be dropped in
> the first place, but the stamping looks more accurate this way.
>
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> ---
>  net/mac802154/rx.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/net/mac802154/rx.c b/net/mac802154/rx.c
> index 0024341ef9c5..e40a988d6c80 100644
> --- a/net/mac802154/rx.c
> +++ b/net/mac802154/rx.c
> @@ -156,12 +156,15 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
>
>         switch (mac_cb(skb)->dest.mode) {
>         case IEEE802154_ADDR_NONE:
> -               if (hdr->source.mode != IEEE802154_ADDR_NONE)
> -                       /* FIXME: check if we are PAN coordinator */
> -                       skb->pkt_type = PACKET_OTHERHOST;
> -               else
> +               if (hdr->source.mode == IEEE802154_ADDR_NONE)
>                         /* ACK comes with both addresses empty */
>                         skb->pkt_type = PACKET_HOST;
> +               else if (!wpan_dev->parent)
> +                       /* No dest means PAN coordinator is the recipient */
> +                       skb->pkt_type = PACKET_HOST;
> +               else
> +                       /* We are not the PAN coordinator, just relaying */
> +                       skb->pkt_type = PACKET_OTHERHOST;
>                 break;
>         case IEEE802154_ADDR_LONG:
>                 if (mac_cb(skb)->dest.pan_id != span &&

So if I understand it correctly, the "wpan_dev->parent" check acts
like a "forwarding" setting on an IP capable interface here? The
"forwarding" setting changes the interface to act as a router, which
is fine... but we have a difference here with the actual hardware and
the address filtering setting which we don't have in e.g. ethernet. My
concern is here that this code is probably interface type specific,
e.g. node vs coordinator type and currently we handle both in one
receive part.

I am fine with that and probably it is just a thing to change in future...

- Alex
Alexander Aring Dec. 15, 2023, 3:05 a.m. UTC | #3
Hi,

On Thu, Dec 14, 2023 at 9:46 PM Alexander Aring <aahringo@redhat.com> wrote:
>
> Hi,
>
> On Tue, Nov 28, 2023 at 6:17 AM Miquel Raynal <miquel.raynal@bootlin.com> wrote:
> >
> > ACKs come with the source and destination address empty, this has been
> > clarified already. But there is something else: if the destination
> > address is empty but the source address is valid, it may be a way to
> > reach the PAN coordinator. Either the device receiving this frame is the
> > PAN coordinator itself and should process what it just received
> > (PACKET_HOST) or it is not and may, if supported, relay the packet as it
> > is targeted to another device in the network.
> >
> > Right now we do not support relaying so the packet should be dropped in
> > the first place, but the stamping looks more accurate this way.
> >
> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>

Acked-by: Alexander Aring <aahringo@redhat.com>

- Alex
Miquel Raynal Dec. 15, 2023, 10:42 a.m. UTC | #4
Hi Alexander,

aahringo@redhat.com wrote on Thu, 14 Dec 2023 21:46:06 -0500:

> Hi,
> 
> On Tue, Nov 28, 2023 at 6:17 AM Miquel Raynal <miquel.raynal@bootlin.com> wrote:
> >
> > ACKs come with the source and destination address empty, this has been
> > clarified already. But there is something else: if the destination
> > address is empty but the source address is valid, it may be a way to
> > reach the PAN coordinator. Either the device receiving this frame is the
> > PAN coordinator itself and should process what it just received
> > (PACKET_HOST) or it is not and may, if supported, relay the packet as it
> > is targeted to another device in the network.
> >
> > Right now we do not support relaying so the packet should be dropped in
> > the first place, but the stamping looks more accurate this way.
> >
> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> > ---
> >  net/mac802154/rx.c | 11 +++++++----
> >  1 file changed, 7 insertions(+), 4 deletions(-)
> >
> > diff --git a/net/mac802154/rx.c b/net/mac802154/rx.c
> > index 0024341ef9c5..e40a988d6c80 100644
> > --- a/net/mac802154/rx.c
> > +++ b/net/mac802154/rx.c
> > @@ -156,12 +156,15 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
> >
> >         switch (mac_cb(skb)->dest.mode) {
> >         case IEEE802154_ADDR_NONE:
> > -               if (hdr->source.mode != IEEE802154_ADDR_NONE)
> > -                       /* FIXME: check if we are PAN coordinator */
> > -                       skb->pkt_type = PACKET_OTHERHOST;
> > -               else
> > +               if (hdr->source.mode == IEEE802154_ADDR_NONE)
> >                         /* ACK comes with both addresses empty */
> >                         skb->pkt_type = PACKET_HOST;
> > +               else if (!wpan_dev->parent)
> > +                       /* No dest means PAN coordinator is the recipient */
> > +                       skb->pkt_type = PACKET_HOST;
> > +               else
> > +                       /* We are not the PAN coordinator, just relaying */
> > +                       skb->pkt_type = PACKET_OTHERHOST;
> >                 break;
> >         case IEEE802154_ADDR_LONG:
> >                 if (mac_cb(skb)->dest.pan_id != span &&  
> 
> So if I understand it correctly, the "wpan_dev->parent" check acts
> like a "forwarding" setting on an IP capable interface here? The

Kind of, yes, in this case having a parent means we are not the top
level PAN coordinator.

> "forwarding" setting changes the interface to act as a router, which
> is fine... 

I think there is no true "router" role but depending on the frame
construction (dest field) we might sometimes act as a router. This is
not supported in Linux, just a feature of the spec.

> but we have a difference here with the actual hardware and
> the address filtering setting which we don't have in e.g. ethernet. My
> concern is here that this code is probably interface type specific,
> e.g. node vs coordinator type and currently we handle both in one
> receive part.
> 
> I am fine with that and probably it is just a thing to change in future...

That is true and probably will need adaptations if/when we come to this
feature. What we do here however is just stamping the packet, in a
manner that is more accurate. So in practice all type of interfaces may
want to do that. However the handling of the packet later in the
stack will be interface specific, I agree.

Thanks,
Miquèl
Miquel Raynal Dec. 20, 2023, 7:32 a.m. UTC | #5
On Tue, 2023-11-28 at 11:16:52 UTC, Miquel Raynal wrote:
> ACKs come with the source and destination address empty, this has been
> clarified already. But there is something else: if the destination
> address is empty but the source address is valid, it may be a way to
> reach the PAN coordinator. Either the device receiving this frame is the
> PAN coordinator itself and should process what it just received
> (PACKET_HOST) or it is not and may, if supported, relay the packet as it
> is targeted to another device in the network.
> 
> Right now we do not support relaying so the packet should be dropped in
> the first place, but the stamping looks more accurate this way.
> 
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> Acked-by: Stefan Schmidt <stefan@datenfreihafen.org>
> Acked-by: Alexander Aring <aahringo@redhat.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/wpan/wpan-next.git master.

Miquel
diff mbox series

Patch

diff --git a/net/mac802154/rx.c b/net/mac802154/rx.c
index 0024341ef9c5..e40a988d6c80 100644
--- a/net/mac802154/rx.c
+++ b/net/mac802154/rx.c
@@ -156,12 +156,15 @@  ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
 
 	switch (mac_cb(skb)->dest.mode) {
 	case IEEE802154_ADDR_NONE:
-		if (hdr->source.mode != IEEE802154_ADDR_NONE)
-			/* FIXME: check if we are PAN coordinator */
-			skb->pkt_type = PACKET_OTHERHOST;
-		else
+		if (hdr->source.mode == IEEE802154_ADDR_NONE)
 			/* ACK comes with both addresses empty */
 			skb->pkt_type = PACKET_HOST;
+		else if (!wpan_dev->parent)
+			/* No dest means PAN coordinator is the recipient */
+			skb->pkt_type = PACKET_HOST;
+		else
+			/* We are not the PAN coordinator, just relaying */
+			skb->pkt_type = PACKET_OTHERHOST;
 		break;
 	case IEEE802154_ADDR_LONG:
 		if (mac_cb(skb)->dest.pan_id != span &&