mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-27 15:31:17 +01:00
Merge pull request #2523 from gebart/pr/lowpan-eui-short-addr-local
sixlowpan: Handle short hardware addresses correctly
This commit is contained in:
commit
a846409a55
@ -429,22 +429,11 @@ int net_if_get_eui64(net_if_eui64_t *eui64, int if_id, int force_generation)
|
||||
}
|
||||
|
||||
/* RFC 6282 Section 3.2.2 / RFC 2464 Section 4 */
|
||||
eui64->uint32[0] = HTONL(0x000000ff);
|
||||
/* Since this is a short address, which is never globally unique, we set
|
||||
* the local/universal bit to 1. */
|
||||
eui64->uint32[0] = HTONL(0x020000ff);
|
||||
eui64->uint16[2] = HTONS(0xfe00);
|
||||
|
||||
if (sizeof(hwaddr) == 2) {
|
||||
eui64->uint16[3] = HTONS(hwaddr);
|
||||
}
|
||||
else if (sizeof(hwaddr) == 1) {
|
||||
eui64->uint8[6] = 0;
|
||||
eui64->uint8[7] = (uint8_t)hwaddr;
|
||||
}
|
||||
else {
|
||||
DEBUG("Error on EUI-64 generation: do not know what to do with "
|
||||
"hardware address of length %d\n", sizeof(hwaddr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
eui64->uint16[3] = HTONS(hwaddr);
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
@ -690,15 +690,7 @@ ipv6_addr_t *ipv6_addr_set_by_eui64(ipv6_addr_t *out, int if_id,
|
||||
|
||||
if (net_if_get_eui64((net_if_eui64_t *) &out->uint8[8], if_id,
|
||||
force_generation)) {
|
||||
#ifdef MODULE_SIXLOWPAN
|
||||
|
||||
if (!sixlowpan_lowpan_eui64_to_short_addr((net_if_eui64_t *)&out->uint8[8])) {
|
||||
out->uint8[8] ^= 0x02;
|
||||
}
|
||||
|
||||
#else
|
||||
out->uint8[8] ^= 0x02;
|
||||
#endif
|
||||
return out;
|
||||
}
|
||||
else {
|
||||
|
||||
@ -895,10 +895,10 @@ uint8_t lowpan_iphc_encoding(int if_id, const uint8_t *dest, int dest_len,
|
||||
if (!net_if_get_eui64(&own_iid, if_id, 0)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
own_iid.uint8[0] ^= 0x02;
|
||||
}
|
||||
|
||||
own_iid.uint8[0] ^= 0x02;
|
||||
|
||||
ipv6_buf = ipv6_buf_extra;
|
||||
|
||||
memset(&lowpan_iphc, 0, 2);
|
||||
|
||||
@ -54,7 +54,9 @@ static uint8_t macdsn;
|
||||
static inline void mac_frame_short_to_eui64(net_if_eui64_t *eui64,
|
||||
uint8_t *frame_short)
|
||||
{
|
||||
eui64->uint32[0] = HTONL(0x000000ff);
|
||||
/* Since this is a short address, which is never globally unique, we set
|
||||
* the local/universal bit to 1. */
|
||||
eui64->uint32[0] = HTONL(0x020000ff);
|
||||
eui64->uint16[2] = HTONS(0xfe00);
|
||||
eui64->uint8[6] = frame_short[1];
|
||||
eui64->uint8[7] = frame_short[0];
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user