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