diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2017-03-12 11:19:37 +0300 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2017-04-12 23:02:36 +0300 |
commit | fa09ae661fb5ab6f9826545d5128f2b7393bcf4a (patch) | |
tree | 3e97a905cfc5182279062b77b3be654db917876a /include/net/6lowpan.h | |
parent | 8a7a4b476719df1e06f8eae837b13bdf79908843 (diff) | |
download | linux-fa09ae661fb5ab6f9826545d5128f2b7393bcf4a.tar.xz |
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.h | 19 |
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, |