aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/include/net/6lowpan.h
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2017-03-12 10:19:37 +0200
committerMarcel Holtmann <marcel@holtmann.org>2017-04-12 22:02:36 +0200
commitfa09ae661fb5ab6f9826545d5128f2b7393bcf4a (patch)
tree3e97a905cfc5182279062b77b3be654db917876a /include/net/6lowpan.h
parentipv6: addrconf: fix 48 bit 6lowpan autoconfiguration (diff)
downloadwireguard-linux-fa09ae661fb5ab6f9826545d5128f2b7393bcf4a.tar.xz
wireguard-linux-fa09ae661fb5ab6f9826545d5128f2b7393bcf4a.zip
6lowpan: Use netdev addr_len to determine lladdr len
This allow technologies such as Bluetooth to use its native lladdr which is eui48 instead of eui64 which was expected by functions like lowpan_header_decompress and lowpan_header_compress. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'include/net/6lowpan.h')
-rw-r--r--include/net/6lowpan.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
index 5ab4c9901ccc..c5792cb6c3eb 100644
--- a/include/net/6lowpan.h
+++ b/include/net/6lowpan.h
@@ -198,6 +198,25 @@ static inline void lowpan_iphc_uncompress_eui64_lladdr(struct in6_addr *ipaddr,
ipaddr->s6_addr[8] ^= 0x02;
}
+static inline void lowpan_iphc_uncompress_eui48_lladdr(struct in6_addr *ipaddr,
+ const void *lladdr)
+{
+ /* fe:80::XXXX:XXff:feXX:XXXX
+ * \_________________/
+ * hwaddr
+ */
+ ipaddr->s6_addr[0] = 0xFE;
+ ipaddr->s6_addr[1] = 0x80;
+ memcpy(&ipaddr->s6_addr[8], lladdr, 3);
+ ipaddr->s6_addr[11] = 0xFF;
+ ipaddr->s6_addr[12] = 0xFE;
+ memcpy(&ipaddr->s6_addr[13], lladdr + 3, 3);
+ /* second bit-flip (Universe/Local)
+ * is done according RFC2464
+ */
+ ipaddr->s6_addr[8] ^= 0x02;
+}
+
#ifdef DEBUG
/* print data in line */
static inline void raw_dump_inline(const char *caller, char *msg,