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

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

 



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))
+		return false;
+
 	/* check for if we can evaluate the dispatch */
 	if (unlikely(!skb->len))
 		return false;
-- 
2.5.0

--
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