diff mbox

[bluetooth-next,3/3] ieee802154: 6lowpan: fix intra pan id check

Message ID 20160617163450.3229-3-aar@pengutronix.de (mailing list archive)
State Superseded
Headers show

Commit Message

Alexander Aring June 17, 2016, 4:34 p.m. UTC
The RIOT-OS stack does send intra-pan frames but don't set the intra pan
flag inside the mac header. It seems this is valid frame addressing but
inefficient. Anyway this patch adds a new function for intra pan
addressing, doesn't matter if intra pan flag or source and destination
are the same. The newly introduction function will be used to check on
intra pan addressing for 6lowpan.

Signed-off-by: Alexander Aring <aar@pengutronix.de>
---
 include/linux/ieee802154.h  |  1 +
 include/net/mac802154.h     | 19 +++++++++++++++++++
 net/ieee802154/6lowpan/rx.c |  2 +-
 3 files changed, 21 insertions(+), 1 deletion(-)

Comments

Stefan Schmidt June 22, 2016, 2:42 p.m. UTC | #1
Hello.

On 17/06/16 18:34, Alexander Aring wrote:
> The RIOT-OS stack does send intra-pan frames but don't set the intra pan
> flag inside the mac header. It seems this is valid frame addressing but
> inefficient. Anyway this patch adds a new function for intra pan
> addressing, doesn't matter if intra pan flag or source and destination
> are the same. The newly introduction function will be used to check on
> intra pan addressing for 6lowpan.
>
> Signed-off-by: Alexander Aring <aar@pengutronix.de>
> ---
>   include/linux/ieee802154.h  |  1 +
>   include/net/mac802154.h     | 19 +++++++++++++++++++
>   net/ieee802154/6lowpan/rx.c |  2 +-
>   3 files changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/ieee802154.h b/include/linux/ieee802154.h
> index fd14815..ddb8901 100644
> --- a/include/linux/ieee802154.h
> +++ b/include/linux/ieee802154.h
> @@ -50,6 +50,7 @@
>   
>   #define IEEE802154_EXTENDED_ADDR_LEN	8
>   #define IEEE802154_SHORT_ADDR_LEN	2
> +#define IEEE802154_PAN_ID_LEN		2
>   
>   #define IEEE802154_LIFS_PERIOD		40
>   #define IEEE802154_SIFS_PERIOD		12
> diff --git a/include/net/mac802154.h b/include/net/mac802154.h
> index deb90a1..df34187 100644
> --- a/include/net/mac802154.h
> +++ b/include/net/mac802154.h
> @@ -333,6 +333,25 @@ static inline unsigned char *ieee802154_skb_src_pan(__le16 fc,
>   }
>   
>   /**
> + * ieee802154_skb_is_intra_pan_addressing - checks whenever the mac addressing
> + *	is an intra pan communication
> + * @fc: mac header frame control field
> + * @skb: skb where the source and destination pan should be get from
> + */
> +static inline bool ieee802154_skb_is_intra_pan_addressing(__le16 fc,
> +							  const struct sk_buff *skb)
> +{
> +	unsigned char *dst_pan = ieee802154_skb_dst_pan(fc, skb),
> +		      *src_pan = ieee802154_skb_src_pan(fc, skb);
> +
> +	/* if one is NULL is no intra pan addressing */
> +	if (!dst_pan || !src_pan)
> +		return false;
> +
> +	return !memcmp(dst_pan, src_pan, IEEE802154_PAN_ID_LEN);
> +}

This seems like a complicated way to compare two PAN IDs which are 
basicall le16 types. Why would you could the detour here expressing them 
as char *?

In my opinion the ieee802154_skb_{src,dst}_pan() should just return the 
PAN ID as le16 value. That is what I would expect.
> +
> +/**
>    * ieee802154_be64_to_le64 - copies and convert be64 to le64
>    * @le64_dst: le64 destination pointer
>    * @be64_src: be64 source pointer
> diff --git a/net/ieee802154/6lowpan/rx.c b/net/ieee802154/6lowpan/rx.c
> index ef185dd..649e7d45 100644
> --- a/net/ieee802154/6lowpan/rx.c
> +++ b/net/ieee802154/6lowpan/rx.c
> @@ -262,7 +262,7 @@ static inline bool lowpan_rx_h_check(struct sk_buff *skb)
>   
>   	/* check on ieee802154 conform 6LoWPAN header */
>   	if (!ieee802154_is_data(fc) ||
> -	    !ieee802154_is_intra_pan(fc))
> +	    !ieee802154_skb_is_intra_pan_addressing(fc, skb))
>   		return false;
>   
>   	/* check if we can dereference the dispatch */

regards
Stefan Schmidt
--
To unsubscribe from this list: send the line "unsubscribe linux-wpan" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alexander Aring June 22, 2016, 8:41 p.m. UTC | #2
Hi,

On 06/22/2016 04:42 PM, Stefan Schmidt wrote:
> Hello.
> 
> On 17/06/16 18:34, Alexander Aring wrote:
>> The RIOT-OS stack does send intra-pan frames but don't set the intra pan
>> flag inside the mac header. It seems this is valid frame addressing but
>> inefficient. Anyway this patch adds a new function for intra pan
>> addressing, doesn't matter if intra pan flag or source and destination
>> are the same. The newly introduction function will be used to check on
>> intra pan addressing for 6lowpan.
>>
>> Signed-off-by: Alexander Aring <aar@pengutronix.de>
>> ---
>>   include/linux/ieee802154.h  |  1 +
>>   include/net/mac802154.h     | 19 +++++++++++++++++++
>>   net/ieee802154/6lowpan/rx.c |  2 +-
>>   3 files changed, 21 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/linux/ieee802154.h b/include/linux/ieee802154.h
>> index fd14815..ddb8901 100644
>> --- a/include/linux/ieee802154.h
>> +++ b/include/linux/ieee802154.h
>> @@ -50,6 +50,7 @@
>>     #define IEEE802154_EXTENDED_ADDR_LEN    8
>>   #define IEEE802154_SHORT_ADDR_LEN    2
>> +#define IEEE802154_PAN_ID_LEN        2
>>     #define IEEE802154_LIFS_PERIOD        40
>>   #define IEEE802154_SIFS_PERIOD        12
>> diff --git a/include/net/mac802154.h b/include/net/mac802154.h
>> index deb90a1..df34187 100644
>> --- a/include/net/mac802154.h
>> +++ b/include/net/mac802154.h
>> @@ -333,6 +333,25 @@ static inline unsigned char *ieee802154_skb_src_pan(__le16 fc,
>>   }
>>     /**
>> + * ieee802154_skb_is_intra_pan_addressing - checks whenever the mac addressing
>> + *    is an intra pan communication
>> + * @fc: mac header frame control field
>> + * @skb: skb where the source and destination pan should be get from
>> + */
>> +static inline bool ieee802154_skb_is_intra_pan_addressing(__le16 fc,
>> +                              const struct sk_buff *skb)
>> +{
>> +    unsigned char *dst_pan = ieee802154_skb_dst_pan(fc, skb),
>> +              *src_pan = ieee802154_skb_src_pan(fc, skb);
>> +
>> +    /* if one is NULL is no intra pan addressing */
>> +    if (!dst_pan || !src_pan)
>> +        return false;
>> +
>> +    return !memcmp(dst_pan, src_pan, IEEE802154_PAN_ID_LEN);
>> +}
> 
> This seems like a complicated way to compare two PAN IDs which are basicall le16 types. Why would you could the detour here expressing them as char *?
> 

I thought many times about how do deal with that for my current use-case
which is comparing src_pan and dst_pan.

These function delivers the pointer on mac_header where the src and dst
pan id is. To compare the src and dst pan id, we don't need to put them
on stack dealing with unaligned memory access. Also in case of intra pan
flag, then we have "dst_pan == src_pan" and I think some memcmp
implementations doesn't compare data if dst, src pointers are the same.
This is also what 802.15.4 says for the intra pan communication.

Sometimes I would like to simple compare directly on mac_header, e.g.
comparing destination address with current wpan_dev MIB addressing values
without putting these attributes on the stack. (I think this is also one
reason why we save mostly everything in byteorder like mac header).
Also dealing with pointers let us handle the none case by returning NULL.

This doesn't work every time, for different use-case we can introduce a
higher-level function which use the "getting the right pointer by frame
control field" functions, see below.

> In my opinion the ieee802154_skb_{src,dst}_pan() should just return the PAN ID as le16 value. That is what I would expect.

For this we can and should add some function without keyword "_skb_" which
maybe call the lower functionality "ieee802154_skb_{src,dst}_pan" and do
some mempcy on __le16 type and return it, but you _maybe_ need to check if
addr mode for saddr/daddr isn't none.

I say maybe here, because there exists some tweaks in 802.15.4 frame
format to decide if it's valid frame format and I think for dataframes
one (src or dst addr mode, I don't remember) can't be none, such frames
should be filtered out before deliver to packet layer, so we can sure
some things after checking on dataframes.

btw: I don't believe that we do that, such filtering and also don't
trust the hardware filters here, the hardware filters may filter such
frames or not. We don't know it so we check twice. :-)

---

I hope these arguments are enough to get this approach into kernel.

- Alex
--
To unsubscribe from this list: send the line "unsubscribe linux-wpan" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/linux/ieee802154.h b/include/linux/ieee802154.h
index fd14815..ddb8901 100644
--- a/include/linux/ieee802154.h
+++ b/include/linux/ieee802154.h
@@ -50,6 +50,7 @@ 
 
 #define IEEE802154_EXTENDED_ADDR_LEN	8
 #define IEEE802154_SHORT_ADDR_LEN	2
+#define IEEE802154_PAN_ID_LEN		2
 
 #define IEEE802154_LIFS_PERIOD		40
 #define IEEE802154_SIFS_PERIOD		12
diff --git a/include/net/mac802154.h b/include/net/mac802154.h
index deb90a1..df34187 100644
--- a/include/net/mac802154.h
+++ b/include/net/mac802154.h
@@ -333,6 +333,25 @@  static inline unsigned char *ieee802154_skb_src_pan(__le16 fc,
 }
 
 /**
+ * ieee802154_skb_is_intra_pan_addressing - checks whenever the mac addressing
+ *	is an intra pan communication
+ * @fc: mac header frame control field
+ * @skb: skb where the source and destination pan should be get from
+ */
+static inline bool ieee802154_skb_is_intra_pan_addressing(__le16 fc,
+							  const struct sk_buff *skb)
+{
+	unsigned char *dst_pan = ieee802154_skb_dst_pan(fc, skb),
+		      *src_pan = ieee802154_skb_src_pan(fc, skb);
+
+	/* if one is NULL is no intra pan addressing */
+	if (!dst_pan || !src_pan)
+		return false;
+
+	return !memcmp(dst_pan, src_pan, IEEE802154_PAN_ID_LEN);
+}
+
+/**
  * ieee802154_be64_to_le64 - copies and convert be64 to le64
  * @le64_dst: le64 destination pointer
  * @be64_src: be64 source pointer
diff --git a/net/ieee802154/6lowpan/rx.c b/net/ieee802154/6lowpan/rx.c
index ef185dd..649e7d45 100644
--- a/net/ieee802154/6lowpan/rx.c
+++ b/net/ieee802154/6lowpan/rx.c
@@ -262,7 +262,7 @@  static inline bool lowpan_rx_h_check(struct sk_buff *skb)
 
 	/* check on ieee802154 conform 6LoWPAN header */
 	if (!ieee802154_is_data(fc) ||
-	    !ieee802154_is_intra_pan(fc))
+	    !ieee802154_skb_is_intra_pan_addressing(fc, skb))
 		return false;
 
 	/* check if we can dereference the dispatch */