]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - include/net/mac802154.h
ieee802154: add ieee802154_skb_src_pan helper
[mirror_ubuntu-bionic-kernel.git] / include / net / mac802154.h
index e465c8551ac3c08061406b521ce13be4c80fdbbc..ec01b35bc969e46c0fea311e8857884907175ab8 100644 (file)
@@ -257,6 +257,94 @@ static inline __le16 ieee802154_get_fc_from_skb(const struct sk_buff *skb)
        return get_unaligned_le16(skb_mac_header(skb));
 }
 
+/**
+ * ieee802154_skb_dst_pan - get the pointer to destination pan field
+ * @fc: mac header frame control field
+ * @skb: skb where the destination pan pointer will be get from
+ */
+static inline unsigned char *ieee802154_skb_dst_pan(__le16 fc,
+                                                   const struct sk_buff *skb)
+{
+       unsigned char *dst_pan;
+
+       switch (ieee802154_daddr_mode(fc)) {
+       case cpu_to_le16(IEEE802154_FCTL_ADDR_NONE):
+               dst_pan = NULL;
+               break;
+       case cpu_to_le16(IEEE802154_FCTL_DADDR_SHORT):
+       case cpu_to_le16(IEEE802154_FCTL_DADDR_EXTENDED):
+               dst_pan = skb_mac_header(skb) +
+                         IEEE802154_FC_LEN +
+                         IEEE802154_SEQ_LEN;
+               break;
+       default:
+               WARN_ONCE(1, "invalid addr mode detected");
+               dst_pan = NULL;
+               break;
+       }
+
+       return dst_pan;
+}
+
+/**
+ * ieee802154_skb_src_pan - get the pointer to source pan field
+ * @fc: mac header frame control field
+ * @skb: skb where the source pan pointer will be get from
+ */
+static inline unsigned char *ieee802154_skb_src_pan(__le16 fc,
+                                                   const struct sk_buff *skb)
+{
+       unsigned char *src_pan;
+
+       switch (ieee802154_saddr_mode(fc)) {
+       case cpu_to_le16(IEEE802154_FCTL_ADDR_NONE):
+               src_pan = NULL;
+               break;
+       case cpu_to_le16(IEEE802154_FCTL_SADDR_SHORT):
+       case cpu_to_le16(IEEE802154_FCTL_SADDR_EXTENDED):
+               /* if intra-pan and source addr mode is non none,
+                * then source pan id is equal destination pan id.
+                */
+               if (ieee802154_is_intra_pan(fc)) {
+                       src_pan = ieee802154_skb_dst_pan(fc, skb);
+                       break;
+               }
+
+               switch (ieee802154_daddr_mode(fc)) {
+               case cpu_to_le16(IEEE802154_FCTL_ADDR_NONE):
+                       src_pan = skb_mac_header(skb) +
+                                 IEEE802154_FC_LEN +
+                                 IEEE802154_SEQ_LEN;
+                       break;
+               case cpu_to_le16(IEEE802154_FCTL_DADDR_SHORT):
+                       src_pan = skb_mac_header(skb) +
+                                 IEEE802154_FC_LEN +
+                                 IEEE802154_SEQ_LEN +
+                                 IEEE802154_PAN_ID_LEN +
+                                 IEEE802154_SHORT_ADDR_LEN;
+                       break;
+               case cpu_to_le16(IEEE802154_FCTL_DADDR_EXTENDED):
+                       src_pan = skb_mac_header(skb) +
+                                 IEEE802154_FC_LEN +
+                                 IEEE802154_SEQ_LEN +
+                                 IEEE802154_PAN_ID_LEN +
+                                 IEEE802154_EXTENDED_ADDR_LEN;
+                       break;
+               default:
+                       WARN_ONCE(1, "invalid addr mode detected");
+                       src_pan = NULL;
+                       break;
+               }
+               break;
+       default:
+               WARN_ONCE(1, "invalid addr mode detected");
+               src_pan = NULL;
+               break;
+       }
+
+       return src_pan;
+}
+
 /**
  * ieee802154_be64_to_le64 - copies and convert be64 to le64
  * @le64_dst: le64 destination pointer