Re: [RFC 15/16] ieee802154: 6lowpan: check on valid 802.15.4 frame

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello.

On 03/08/15 08:23, Alexander Aring wrote:
This patch adds frame control checks to check if the received frame is
something which could contain a 6LoWPAN packet.

Signed-off-by: Alexander Aring<alex.aring@xxxxxxxxx>
---
  include/linux/ieee802154.h  | 48 ++++++++++++++++++++++++++++++++++++++++++++-
  net/ieee802154/6lowpan/rx.c |  9 +++++++++
  2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/include/linux/ieee802154.h b/include/linux/ieee802154.h
index 4f26c01..5a64fc0 100644
--- a/include/linux/ieee802154.h
+++ b/include/linux/ieee802154.h
@@ -208,7 +208,24 @@ enum {
  };
/* frame control handling */
-#define IEEE802154_FCTL_ACKREQ	0x0020
+#define IEEE802154_FCTL_FTYPE		0x0003
+#define IEEE802154_FTYPE_DATA		0x0001
+#define IEEE802154_FCTL_ACKREQ		0x0020
+#define IEEE802154_FCTL_INTRA_PAN	0x0040
+#define IEEE802154_FCTL_DADDR		0x0c00
+#define IEEE802154_FCTL_DADDR_NONE	0x0000
+#define IEEE802154_FCTL_SADDR		0xc000
+#define IEEE802154_FCTL_SADDR_NONE	0x0000
+
+/*
+ * ieee802154_is_data - check if type is IEEE802154_FTYPE_DATA
+ * @fc: frame control bytes in little-endian byteorder
+ */
+static inline int ieee802154_is_data(__le16 fc)
+{
+	return (fc & cpu_to_le16(IEEE802154_FCTL_FTYPE)) ==
+		cpu_to_le16(IEEE802154_FTYPE_DATA);
+}
/**
   * ieee802154_is_ackreq - check if acknowledgment request bit is set
@@ -220,6 +237,35 @@ static inline bool ieee802154_is_ackreq(__le16 fc)
  }
/**
+ * ieee802154_is_intra_pan - check if intra pan id communication
+ * @fc: frame control bytes in little-endian byteorder
+ */
+static inline bool ieee802154_is_intra_pan(__le16 fc)
+{
+	return fc & cpu_to_le16(IEEE802154_FCTL_INTRA_PAN);
+}
+
+/**
+ * ieee802154_is_daddr_none - check if daddr mode is none
+ * @fc: frame control bytes in little-endian byteorder
+ */
+static inline bool ieee802154_is_daddr_none(__le16 fc)
+{
+	return (fc & cpu_to_le16(IEEE802154_FCTL_DADDR)) ==
+		cpu_to_le16(IEEE802154_FCTL_DADDR_NONE);
+}
+
+/**
+ * ieee802154_is_saddr_none - check if saddr mode is none
+ * @fc: frame control bytes in little-endian byteorder
+ */
+static inline bool ieee802154_is_saddr_none(__le16 fc)
+{
+	return (fc & cpu_to_le16(IEEE802154_FCTL_SADDR)) ==
+		cpu_to_le16(IEEE802154_FCTL_SADDR_NONE);
+}
+
+/**
   * ieee802154_get_fc_from_skb - get the frame control field from an skb
   * @skb: skb where the frame control field will be get from
   */
diff --git a/net/ieee802154/6lowpan/rx.c b/net/ieee802154/6lowpan/rx.c
index 48869ac..b1a9d14 100644
--- a/net/ieee802154/6lowpan/rx.c
+++ b/net/ieee802154/6lowpan/rx.c
@@ -264,6 +264,15 @@ static inline bool lowpan_is_reserved(u8 dispatch)
   */
  static bool lowpan_rx_h_check(struct sk_buff *skb)
  {
+	__le16 fc = ieee802154_get_fc_from_skb(skb);
+
+	/* check on ieee802154 conform 6LoWPAN header */
+	if (!ieee802154_is_data(fc) ||
+	    ieee802154_is_daddr_none(fc) ||
+	    ieee802154_is_saddr_none(fc) ||
+	    !ieee802154_is_intra_pan(fc))

Interesting, 6LoWPAN frames always have to have the intra PAN flag set? Did not know this until now.
+		return false;
+
  	/* check for if we can evaluate the dispatch */
  	if (unlikely(!skb->len))
  		return false;

Reviewed-by: Stefan Schmidt <stefan@xxxxxxxxxxxxxxx>

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



[Index of Archives]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux