diff --git a/net/sixlowpan/sixlowpan_hc06.c b/net/sixlowpan/sixlowpan_hc06.c index 0af4aed8b8..b3b25982e5 100644 --- a/net/sixlowpan/sixlowpan_hc06.c +++ b/net/sixlowpan/sixlowpan_hc06.c @@ -766,11 +766,11 @@ void sixlowpan_compresshdr_hc06(FAR struct ieee802154_driver_s *ieee, SIXLOWPAN_IPHC_SAM_BIT); } - /* No address context found for this address */ + /* No address context found for the source address */ else if (net_is_addr_linklocal(ipv6->srcipaddr) && - ipv6->destipaddr[1] == 0 && ipv6->destipaddr[2] == 0 && - ipv6->destipaddr[3] == 0) + ipv6->srcipaddr[1] == 0 && ipv6->srcipaddr[2] == 0 && + ipv6->srcipaddr[3] == 0) { iphc1 |= compress_laddr(ipv6->srcipaddr, &ieee->i_dev.d_mac.ieee802154, @@ -778,7 +778,7 @@ void sixlowpan_compresshdr_hc06(FAR struct ieee802154_driver_s *ieee, } else { - /* Send the full address ipaddr: SAC = 0, SAM = 00 */ + /* Send the full source address ipaddr: SAC = 0, SAM = 00 */ ninfo("Uncompressable srcipaddr=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", ipv6->srcipaddr[0], ipv6->srcipaddr[1], ipv6->srcipaddr[2], diff --git a/net/sixlowpan/sixlowpan_udpsend.c b/net/sixlowpan/sixlowpan_udpsend.c index f4324d1694..6e636bc68b 100644 --- a/net/sixlowpan/sixlowpan_udpsend.c +++ b/net/sixlowpan/sixlowpan_udpsend.c @@ -223,7 +223,7 @@ ssize_t psock_6lowpan_udp_sendto(FAR struct socket *psock, if (dev == NULL) #endif { - nwarn("WARNING: Not routable\n"); + nwarn("WARNING: Not routable or not IEEE802.15.4 MAC\n"); return (ssize_t)-ENETUNREACH; } #endif @@ -260,6 +260,8 @@ ssize_t psock_6lowpan_udp_sendto(FAR struct socket *psock, net_ipv6addr_hdrcopy(ipv6udp.ipv6.destipaddr, to6->sin6_addr.in6_u.u6_addr16); #ifdef CONFIG_NETDEV_MULTINIC net_ipv6addr_hdrcopy(ipv6udp.ipv6.srcipaddr, conn->u.ipv6.laddr); +#else + net_ipv6addr_hdrcopy(ipv6udp.ipv6.srcipaddr, dev->d_ipv6addr); #endif ninfo("IPv6 length: %d\n", diff --git a/wireless/ieee802154/mac802154_loopback.c b/wireless/ieee802154/mac802154_loopback.c index 28c84b117f..8f67e2b3ac 100644 --- a/wireless/ieee802154/mac802154_loopback.c +++ b/wireless/ieee802154/mac802154_loopback.c @@ -311,6 +311,10 @@ static int lo_loopback(FAR struct net_driver_s *dev) ind.dest.mode = IEEE802154_ADDRMODE_SHORT; #endif + /* Only loopback the local address is the destination and some (arbitrary) + * address is the source. + */ + IEEE802154_PANIDCOPY(ind.src.panid, g_panid); IEEE802154_SADDRCOPY(ind.src.saddr, g_src_saddr); IEEE802154_EADDRCOPY(ind.src.eaddr, g_src_eaddr);