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