static inline enum net_verdict ieee802154_manage_recv_packet(struct net_if *iface, struct net_pkt *pkt) { enum net_verdict verdict = NET_CONTINUE; u32_t src; u32_t dst; /* Upper IP stack expects the link layer address to be in * big endian format so we must swap it here. */ if (net_pkt_ll_src(pkt)->addr && net_pkt_ll_src(pkt)->len == IEEE802154_EXT_ADDR_LENGTH) { sys_mem_swap(net_pkt_ll_src(pkt)->addr, net_pkt_ll_src(pkt)->len); } if (net_pkt_ll_dst(pkt)->addr && net_pkt_ll_dst(pkt)->len == IEEE802154_EXT_ADDR_LENGTH) { sys_mem_swap(net_pkt_ll_dst(pkt)->addr, net_pkt_ll_dst(pkt)->len); } /** Uncompress will drop the current fragment. Pkt ll src/dst address * will then be wrong and must be updated according to the new fragment. */ src = net_pkt_ll_src(pkt)->addr ? net_pkt_ll_src(pkt)->addr - net_pkt_ll(pkt) : 0; dst = net_pkt_ll_dst(pkt)->addr ? net_pkt_ll_dst(pkt)->addr - net_pkt_ll(pkt) : 0; #ifdef CONFIG_NET_L2_IEEE802154_FRAGMENT verdict = ieee802154_reassemble(pkt); if (verdict == NET_DROP) { goto out; } #else if (!net_6lo_uncompress(pkt)) { NET_DBG("Packet decompression failed"); verdict = NET_DROP; goto out; } #endif net_pkt_ll_src(pkt)->addr = src ? net_pkt_ll(pkt) + src : NULL; net_pkt_ll_dst(pkt)->addr = dst ? net_pkt_ll(pkt) + dst : NULL; pkt_hexdump(pkt, false); out: return verdict; }
void byteorder_test_mem_swap(void) { uint8_t buf_orig_1[8] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; uint8_t buf_orig_2[11] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xa0 }; uint8_t buf_chk_1[8] = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; uint8_t buf_chk_2[11] = { 0xa0, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; sys_mem_swap(buf_orig_1, 8); assert_true((memcmp(buf_orig_1, buf_chk_1, 8) == 0), "Swapping buffer failed"); sys_mem_swap(buf_orig_2, 11); assert_true((memcmp(buf_orig_2, buf_chk_2, 11) == 0), "Swapping buffer failed"); }