diff --git a/drivers/wireless/ieee802154/xbee/xbee_netdev.c b/drivers/wireless/ieee802154/xbee/xbee_netdev.c index 68041eec20e..f4b6fef3304 100644 --- a/drivers/wireless/ieee802154/xbee/xbee_netdev.c +++ b/drivers/wireless/ieee802154/xbee/xbee_netdev.c @@ -283,7 +283,18 @@ static int xbeenet_set_ipaddress(FAR struct net_driver_s *dev) /* Set the MAC address as the eaddr */ eaddr = arg.getreq.attrval.mac.eaddr; - IEEE802154_EADDRCOPY(dev->d_mac.radio.nv_addr, eaddr); + + /* Network layers expect address in Network Order (Big Endian) */ + + dev->d_mac.radio.nv_addr[0] = eaddr[7]; + dev->d_mac.radio.nv_addr[1] = eaddr[6]; + dev->d_mac.radio.nv_addr[2] = eaddr[5]; + dev->d_mac.radio.nv_addr[3] = eaddr[4]; + dev->d_mac.radio.nv_addr[4] = eaddr[3]; + dev->d_mac.radio.nv_addr[5] = eaddr[2]; + dev->d_mac.radio.nv_addr[6] = eaddr[1]; + dev->d_mac.radio.nv_addr[7] = eaddr[0]; + dev->d_mac.radio.nv_addrlen = IEEE802154_EADDRSIZE; /* Set the IP address based on the eaddr */ @@ -292,10 +303,10 @@ static int xbeenet_set_ipaddress(FAR struct net_driver_s *dev) dev->d_ipv6addr[1] = 0; dev->d_ipv6addr[2] = 0; dev->d_ipv6addr[3] = 0; - dev->d_ipv6addr[4] = (uint16_t)eaddr[0] << 8 | (uint16_t)eaddr[1]; - dev->d_ipv6addr[5] = (uint16_t)eaddr[2] << 8 | (uint16_t)eaddr[3]; - dev->d_ipv6addr[6] = (uint16_t)eaddr[4] << 8 | (uint16_t)eaddr[5]; - dev->d_ipv6addr[7] = (uint16_t)eaddr[6] << 8 | (uint16_t)eaddr[7]; + dev->d_ipv6addr[4] = HTONS((uint16_t)eaddr[7] << 8 | (uint16_t)eaddr[6]); + dev->d_ipv6addr[5] = HTONS((uint16_t)eaddr[5] << 8 | (uint16_t)eaddr[4]); + dev->d_ipv6addr[6] = HTONS((uint16_t)eaddr[3] << 8 | (uint16_t)eaddr[2]); + dev->d_ipv6addr[7] = HTONS((uint16_t)eaddr[1] << 8 | (uint16_t)eaddr[0]); /* Invert the U/L bit */ @@ -324,7 +335,12 @@ static int xbeenet_set_ipaddress(FAR struct net_driver_s *dev) /* Set the MAC address as the saddr */ saddr = arg.getreq.attrval.mac.saddr; - IEEE802154_SADDRCOPY(dev->d_mac.radio.nv_addr, saddr); + + /* Network layers expect address in Network Order (Big Endian) */ + + dev->d_mac.radio.nv_addr[0] = saddr[1]; + dev->d_mac.radio.nv_addr[1] = saddr[0]; + dev->d_mac.radio.nv_addrlen = IEEE802154_SADDRSIZE; /* Set the IP address based on the saddr */ @@ -336,7 +352,7 @@ static int xbeenet_set_ipaddress(FAR struct net_driver_s *dev) dev->d_ipv6addr[4] = 0; dev->d_ipv6addr[5] = HTONS(0x00ff); dev->d_ipv6addr[6] = HTONS(0xfe00); - dev->d_ipv6addr[7] = (uint16_t)saddr[0] << 8 | (uint16_t)saddr[1]; + dev->d_ipv6addr[7] = HTONS((uint16_t)saddr[1] << 8 | (uint16_t)saddr[0]); return OK; } #endif diff --git a/net/sixlowpan/sixlowpan_framer.c b/net/sixlowpan/sixlowpan_framer.c index 38c65b6b205..10d3ab645c4 100644 --- a/net/sixlowpan/sixlowpan_framer.c +++ b/net/sixlowpan/sixlowpan_framer.c @@ -206,17 +206,34 @@ int sixlowpan_meta_data(FAR struct radio_driver_s *radio, /* Extended destination address mode */ meta->destaddr.mode = IEEE802154_ADDRMODE_EXTENDED; - sixlowpan_eaddrcopy(&meta->destaddr.eaddr, pktmeta->dest.nm_addr); + + /* 802.15.4 layer expects address in Little-Endian byte order */ + + meta->destaddr.eaddr[0] = pktmeta->dest.nm_addr[7]; + meta->destaddr.eaddr[1] = pktmeta->dest.nm_addr[6]; + meta->destaddr.eaddr[2] = pktmeta->dest.nm_addr[5]; + meta->destaddr.eaddr[3] = pktmeta->dest.nm_addr[4]; + meta->destaddr.eaddr[4] = pktmeta->dest.nm_addr[3]; + meta->destaddr.eaddr[5] = pktmeta->dest.nm_addr[2]; + meta->destaddr.eaddr[6] = pktmeta->dest.nm_addr[1]; + meta->destaddr.eaddr[7] = pktmeta->dest.nm_addr[0]; } else { /* Short destination address mode */ meta->destaddr.mode = IEEE802154_ADDRMODE_SHORT; - sixlowpan_saddrcopy(&meta->destaddr.saddr, pktmeta->dest.nm_addr); + + /* 802.15.4 layer expects address in Little-Endian byte order */ + + meta->destaddr.saddr[0] = pktmeta->dest.nm_addr[1]; + meta->destaddr.saddr[1] = pktmeta->dest.nm_addr[0]; } - IEEE802154_PANIDCOPY(meta->destaddr.panid, pktmeta->dpanid); + /* 802.15.4 layer expects address in Little-Endian byte order */ + + meta->destaddr.panid[0] = pktmeta->dpanid[1]; + meta->destaddr.panid[1] = pktmeta->dpanid[0]; /* Handle associated with MSDU. Will increment once per packet, not * necesarily per frame: The same MSDU handle will be used for each diff --git a/net/sixlowpan/sixlowpan_hc06.c b/net/sixlowpan/sixlowpan_hc06.c index c7bdf9a808c..2ef0e2b1aa8 100644 --- a/net/sixlowpan/sixlowpan_hc06.c +++ b/net/sixlowpan/sixlowpan_hc06.c @@ -507,22 +507,15 @@ static void uncompress_addr(FAR const struct netdev_varaddr_s *addr, for (i = destndx; i < 8; i++) { - if (usemac) - { - ipaddr[i] = (uint16_t)srcptr[0] << 8 | (uint16_t)srcptr[1]; - } - else - { #ifdef CONFIG_ENDIAN_BIG - /* Preserve big-endian, network order */ + /* Preserve big-endian, network order */ - ipaddr[i] = (uint16_t)srcptr[0] << 8 | (uint16_t)srcptr[1]; + ipaddr[i] = (uint16_t)srcptr[0] << 8 | (uint16_t)srcptr[1]; #else - /* Preserve big-endian, network order */ + /* Preserve big-endian, network order */ - ipaddr[i] = (uint16_t)srcptr[1] << 8 | (uint16_t)srcptr[0]; + ipaddr[i] = (uint16_t)srcptr[1] << 8 | (uint16_t)srcptr[0]; #endif - } srcptr += 2; } diff --git a/net/sixlowpan/sixlowpan_utils.c b/net/sixlowpan/sixlowpan_utils.c index 80cba607d42..896766b4606 100644 --- a/net/sixlowpan/sixlowpan_utils.c +++ b/net/sixlowpan/sixlowpan_utils.c @@ -127,7 +127,7 @@ static void sixlowpan_baddrfromip(const net_ipv6addr_t ipaddr, FAR uint8_t *badd { /* Big-endian uint16_t to byte order */ - baddr[0] = ipaddr[7] >> 8; + baddr[0] = NTOHS(ipaddr[7]) & 0xff; } #endif @@ -136,8 +136,8 @@ static void sixlowpan_saddrfromip(const net_ipv6addr_t ipaddr, FAR uint8_t *sadd { /* Big-endian uint16_t to byte order */ - saddr[0] = ipaddr[7] >> 8; - saddr[1] = ipaddr[7] & 0xff; + saddr[0] = NTOHS(ipaddr[7]) >> 8; + saddr[1] = NTOHS(ipaddr[7]) & 0xff; } #endif @@ -151,8 +151,8 @@ static void sixlowpan_eaddrfromip(const net_ipv6addr_t ipaddr, FAR uint8_t *eadd { /* Big-endian uint16_t to byte order */ - *eptr++ = ipaddr[i] >> 8; - *eptr++ = ipaddr[i] & 0xff; + *eptr++ = NTOHS(ipaddr[i]) >> 8; + *eptr++ = NTOHS(ipaddr[i]) & 0xff; } eaddr[0] ^= 0x02; @@ -433,7 +433,7 @@ static inline void sixlowpan_ipfrombyte(FAR const uint8_t *byte, ipaddr[4] = 0; ipaddr[5] = HTONS(0x00ff); ipaddr[6] = HTONS(0xfe00); - ipaddr[7] = (uint16_t)byte[0] << 8; + ipaddr[7] = HTONS((uint16_t)byte[0]); } #endif @@ -448,7 +448,10 @@ static inline void sixlowpan_ipfromsaddr(FAR const uint8_t *saddr, ipaddr[4] = 0; ipaddr[5] = HTONS(0x00ff); ipaddr[6] = HTONS(0xfe00); - ipaddr[7] = (uint16_t)saddr[0] << 8 | (uint16_t)saddr[1]; + + /* Preserve big-endian */ + + memcpy(&ipaddr[7], saddr, 2); } #endif @@ -460,10 +463,13 @@ static inline void sixlowpan_ipfromeaddr(FAR const uint8_t *eaddr, ipaddr[1] = 0; ipaddr[2] = 0; ipaddr[3] = 0; - ipaddr[4] = (uint16_t)eaddr[0] << 8 | (uint16_t)eaddr[1]; - ipaddr[5] = (uint16_t)eaddr[2] << 8 | (uint16_t)eaddr[3]; - ipaddr[6] = (uint16_t)eaddr[4] << 8 | (uint16_t)eaddr[5]; - ipaddr[7] = (uint16_t)eaddr[6] << 8 | (uint16_t)eaddr[7]; + + /* Preserve big-endian */ + + memcpy(&ipaddr[4], eaddr , 2); + memcpy(&ipaddr[5], eaddr + 2, 2); + memcpy(&ipaddr[6], eaddr + 4, 2); + memcpy(&ipaddr[7], eaddr + 6, 2); /* Invert the U/L bit */ @@ -522,7 +528,7 @@ static inline bool sixlowpan_isbytebased(const net_ipv6addr_t ipaddr, { return (ipaddr[5] == HTONS(0x00ff) && ipaddr[6] == HTONS(0xfe00) && - ipaddr[7] == ((uint16_t)byte << 8)); + ipaddr[7] == HTONS((uint16_t)byte)); } #endif @@ -531,16 +537,22 @@ static inline bool sixlowpan_issaddrbased(const net_ipv6addr_t ipaddr, { return (ipaddr[5] == HTONS(0x00ff) && ipaddr[6] == HTONS(0xfe00) && - ipaddr[7] == (GETUINT16(saddr, 0))); + ipaddr[7] == *(uint16_t *)saddr); } static inline bool sixlowpan_iseaddrbased(const net_ipv6addr_t ipaddr, FAR const uint8_t *eaddr) { - return (ipaddr[4] == (GETUINT16(eaddr, 0) ^ HTONS(0x0200)) && - ipaddr[5] == GETUINT16(eaddr, 2) && - ipaddr[6] == GETUINT16(eaddr, 4) && - ipaddr[7] == GETUINT16(eaddr, 6)); + /* If the U/L bit is not set, indicating that the address is universal, it + * can not be eaddr-based since EUI-64's are always universal + */ + + if ((ipaddr[4] & HTONS(0x0200)) == 0) return false; + + return (ipaddr[4] == ((*(uint16_t *)eaddr) ^ HTONS(0x0200)) && + ipaddr[5] == *(uint16_t *)(eaddr + 2) && + ipaddr[6] == *(uint16_t *)(eaddr + 4) && + ipaddr[7] == *(uint16_t *)(eaddr + 6)); } bool sixlowpan_ismacbased(const net_ipv6addr_t ipaddr, @@ -637,7 +649,11 @@ int sixlowpan_src_panid(FAR struct radio_driver_s *radio, return ret; } - IEEE802154_PANIDCOPY(panid, arg.u.getreq.attrval.mac.panid); + /* MAC802154 gives us PAN ID in Little Endinan Order, but we need it in Network Order */ + + panid[0] = arg.u.getreq.attrval.mac.panid[1]; + panid[1] = arg.u.getreq.attrval.mac.panid[0]; + return OK; } #endif @@ -676,12 +692,28 @@ int sixlowpan_extract_srcaddr(FAR struct radio_driver_s *radio, if (ind->src.mode == IEEE802154_ADDRMODE_SHORT) { srcaddr->nv_addrlen = NET_6LOWPAN_SADDRSIZE; - memcpy(srcaddr->nv_addr, ind->src.saddr, NET_6LOWPAN_SADDRSIZE); + + /* MAC802154 gives us Short Address in Little Endinan Order, but we + * need it in Network Order */ + + srcaddr->nv_addr[0] = ind->src.saddr[1]; + srcaddr->nv_addr[1] = ind->src.saddr[0]; } else { srcaddr->nv_addrlen = NET_6LOWPAN_EADDRSIZE; - memcpy(srcaddr->nv_addr, ind->src.eaddr, NET_6LOWPAN_EADDRSIZE); + + /* MAC802154 gives us Extended Address in Little Endinan Order, but + * we need it in Network Order */ + + srcaddr->nv_addr[0] = ind->src.eaddr[7]; + srcaddr->nv_addr[1] = ind->src.eaddr[6]; + srcaddr->nv_addr[2] = ind->src.eaddr[5]; + srcaddr->nv_addr[3] = ind->src.eaddr[4]; + srcaddr->nv_addr[4] = ind->src.eaddr[3]; + srcaddr->nv_addr[5] = ind->src.eaddr[2]; + srcaddr->nv_addr[6] = ind->src.eaddr[1]; + srcaddr->nv_addr[7] = ind->src.eaddr[0]; } return OK; @@ -743,12 +775,28 @@ int sixlowpan_extract_destaddr(FAR struct radio_driver_s *radio, if (ind->dest.mode == IEEE802154_ADDRMODE_SHORT) { destaddr->nv_addrlen = NET_6LOWPAN_SADDRSIZE; - memcpy(destaddr->nv_addr, ind->dest.saddr, NET_6LOWPAN_SADDRSIZE); + + /* MAC802154 gives us Short Address in Little Endinan Order, but we + * need it in Network Order */ + + destaddr->nv_addr[0] = ind->dest.saddr[1]; + destaddr->nv_addr[1] = ind->dest.saddr[0]; } else { destaddr->nv_addrlen = NET_6LOWPAN_EADDRSIZE; - memcpy(destaddr->nv_addr, ind->dest.eaddr, NET_6LOWPAN_EADDRSIZE); + + /* MAC802154 gives us Extended Address in Little Endinan Order, but + * we need it in Network Order */ + + destaddr->nv_addr[0] = ind->dest.eaddr[7]; + destaddr->nv_addr[1] = ind->dest.eaddr[6]; + destaddr->nv_addr[2] = ind->dest.eaddr[5]; + destaddr->nv_addr[3] = ind->dest.eaddr[4]; + destaddr->nv_addr[4] = ind->dest.eaddr[3]; + destaddr->nv_addr[5] = ind->dest.eaddr[2]; + destaddr->nv_addr[6] = ind->dest.eaddr[1]; + destaddr->nv_addr[7] = ind->dest.eaddr[0]; } return OK; diff --git a/wireless/ieee802154/mac802154_loopback.c b/wireless/ieee802154/mac802154_loopback.c index ff6d0787989..981fdb250f7 100644 --- a/wireless/ieee802154/mac802154_loopback.c +++ b/wireless/ieee802154/mac802154_loopback.c @@ -225,16 +225,16 @@ static void lo_addr2ip(FAR struct net_driver_s *dev) dev->d_ipv6addr[1] = 0; dev->d_ipv6addr[2] = 0; dev->d_ipv6addr[3] = 0; - dev->d_ipv6addr[4] = (uint16_t)g_eaddr[0] << 8 | (uint16_t)g_eaddr[1]; - dev->d_ipv6addr[5] = (uint16_t)g_eaddr[2] << 8 | (uint16_t)g_eaddr[3]; - dev->d_ipv6addr[6] = (uint16_t)g_eaddr[4] << 8 | (uint16_t)g_eaddr[5]; - dev->d_ipv6addr[7] = (uint16_t)g_eaddr[6] << 8 | (uint16_t)g_eaddr[7]; + dev->d_ipv6addr[4] = HTONS((uint16_t)g_eaddr[7] << 8 | (uint16_t)g_eaddr[6]); + dev->d_ipv6addr[5] = HTONS((uint16_t)g_eaddr[5] << 8 | (uint16_t)g_eaddr[4]); + dev->d_ipv6addr[6] = HTONS((uint16_t)g_eaddr[3] << 8 | (uint16_t)g_eaddr[2]); + dev->d_ipv6addr[7] = HTONS((uint16_t)g_eaddr[1] << 8 | (uint16_t)g_eaddr[0]); /* Invert the U/L bit */ dev->d_ipv6addr[4] ^= HTONS(0x0200); -} #endif +} #else static void lo_addr2ip(FAR struct net_driver_s *dev) { @@ -253,7 +253,7 @@ static void lo_addr2ip(FAR struct net_driver_s *dev) dev->d_ipv6addr[4] = 0; dev->d_ipv6addr[5] = HTONS(0x00ff); dev->d_ipv6addr[6] = HTONS(0xfe00); - dev->d_ipv6addr[7] = (uint16_t)g_saddr[0] << 8 | (uint16_t)g_saddr[1]; + dev->d_ipv6addr[7] = HTONS((uint16_t)g_saddr[1] << 8 | (uint16_t)g_saddr[0]); #endif } #endif diff --git a/wireless/ieee802154/mac802154_netdev.c b/wireless/ieee802154/mac802154_netdev.c index 3341f0a3696..2ce0e949a20 100644 --- a/wireless/ieee802154/mac802154_netdev.c +++ b/wireless/ieee802154/mac802154_netdev.c @@ -283,7 +283,18 @@ static int macnet_advertise(FAR struct net_driver_s *dev) /* Set the MAC address as the eaddr */ eaddr = arg.getreq.attrval.mac.eaddr; - IEEE802154_EADDRCOPY(dev->d_mac.radio.nv_addr, eaddr); + + /* Network layers expect address in Network Order (Big Endian) */ + + dev->d_mac.radio.nv_addr[0] = eaddr[7]; + dev->d_mac.radio.nv_addr[1] = eaddr[6]; + dev->d_mac.radio.nv_addr[2] = eaddr[5]; + dev->d_mac.radio.nv_addr[3] = eaddr[4]; + dev->d_mac.radio.nv_addr[4] = eaddr[3]; + dev->d_mac.radio.nv_addr[5] = eaddr[2]; + dev->d_mac.radio.nv_addr[6] = eaddr[1]; + dev->d_mac.radio.nv_addr[7] = eaddr[0]; + dev->d_mac.radio.nv_addrlen = IEEE802154_EADDRSIZE; /* Set the IP address based on the eaddr */ @@ -292,10 +303,10 @@ static int macnet_advertise(FAR struct net_driver_s *dev) dev->d_ipv6addr[1] = 0; dev->d_ipv6addr[2] = 0; dev->d_ipv6addr[3] = 0; - dev->d_ipv6addr[4] = (uint16_t)eaddr[0] << 8 | (uint16_t)eaddr[1]; - dev->d_ipv6addr[5] = (uint16_t)eaddr[2] << 8 | (uint16_t)eaddr[3]; - dev->d_ipv6addr[6] = (uint16_t)eaddr[4] << 8 | (uint16_t)eaddr[5]; - dev->d_ipv6addr[7] = (uint16_t)eaddr[6] << 8 | (uint16_t)eaddr[7]; + dev->d_ipv6addr[4] = HTONS((uint16_t)eaddr[7] << 8 | (uint16_t)eaddr[6]); + dev->d_ipv6addr[5] = HTONS((uint16_t)eaddr[5] << 8 | (uint16_t)eaddr[4]); + dev->d_ipv6addr[6] = HTONS((uint16_t)eaddr[3] << 8 | (uint16_t)eaddr[2]); + dev->d_ipv6addr[7] = HTONS((uint16_t)eaddr[1] << 8 | (uint16_t)eaddr[0]); /* Invert the U/L bit */ @@ -324,7 +335,12 @@ static int macnet_advertise(FAR struct net_driver_s *dev) /* Set the MAC address as the saddr */ saddr = arg.getreq.attrval.mac.saddr; - IEEE802154_SADDRCOPY(dev->d_mac.radio.nv_addr, saddr); + + /* Network layers expect address in Network Order (Big Endian) */ + + dev->d_mac.radio.nv_addr[0] = saddr[1]; + dev->d_mac.radio.nv_addr[1] = saddr[0]; + dev->d_mac.radio.nv_addrlen = IEEE802154_SADDRSIZE; /* Set the IP address based on the saddr */ @@ -336,7 +352,7 @@ static int macnet_advertise(FAR struct net_driver_s *dev) dev->d_ipv6addr[4] = 0; dev->d_ipv6addr[5] = HTONS(0x00ff); dev->d_ipv6addr[6] = HTONS(0xfe00); - dev->d_ipv6addr[7] = (uint16_t)saddr[0] << 8 | (uint16_t)saddr[1]; + dev->d_ipv6addr[7] = HTONS((uint16_t)saddr[1] << 8 | (uint16_t)saddr[0]); return OK; } #endif