static bool received_dest_addr_matched(u8_t *rx_buffer) { struct upipe_context *upipe = upipe_dev->driver_data; /* Check destination PAN Id */ if (memcmp(&rx_buffer[PAN_ID_OFFSET], dev_pan_id, PAN_ID_SIZE) != 0 && memcmp(&rx_buffer[PAN_ID_OFFSET], BROADCAST_ADDRESS, PAN_ID_SIZE) != 0) { return false; } /* Check destination address */ switch (rx_buffer[DEST_ADDR_TYPE_OFFSET] & DEST_ADDR_TYPE_MASK) { case DEST_ADDR_TYPE_SHORT: /* First check if the destination is broadcast */ /* If not broadcast, check if lenght and address matches */ if (memcmp(&rx_buffer[DEST_ADDR_OFFSET], BROADCAST_ADDRESS, SHORT_ADDRESS_SIZE) != 0 && (net_if_get_link_addr(upipe->iface)->len != SHORT_ADDRESS_SIZE || memcmp(&rx_buffer[DEST_ADDR_OFFSET], dev_short_addr, SHORT_ADDRESS_SIZE) != 0)) { return false; } break; case DEST_ADDR_TYPE_EXTENDED: /* If not broadcast, check if lenght and address matches */ if (net_if_get_link_addr(upipe->iface)->len != EXTENDED_ADDRESS_SIZE || memcmp(&rx_buffer[DEST_ADDR_OFFSET], dev_ext_addr, EXTENDED_ADDRESS_SIZE) != 0) { return false; } break; default: return false; } return true; }
static void setup_eth_header(struct net_if *iface, struct net_pkt *pkt, struct net_eth_addr *hwaddr, u16_t type) { struct net_eth_hdr *hdr = (struct net_eth_hdr *)net_pkt_ll(pkt); memcpy(&hdr->dst.addr, hwaddr, sizeof(struct net_eth_addr)); memcpy(&hdr->src.addr, net_if_get_link_addr(iface)->addr, sizeof(struct net_eth_addr)); hdr->type = htons(type); }
static inline struct net_pkt *prepare_arp_reply(struct net_if *iface, struct net_pkt *req, struct net_eth_addr *addr) { struct net_pkt *pkt; struct net_buf *frag; struct net_arp_hdr *hdr; struct net_eth_hdr *eth; pkt = net_pkt_get_reserve_tx(sizeof(struct net_eth_hdr), K_FOREVER); if (!pkt) { goto fail; } frag = net_pkt_get_frag(pkt, K_FOREVER); if (!frag) { goto fail; } net_pkt_frag_add(pkt, frag); net_pkt_set_iface(pkt, iface); hdr = NET_ARP_HDR(pkt); eth = NET_ETH_HDR(pkt); eth->type = htons(NET_ETH_PTYPE_ARP); memset(ð->dst.addr, 0xff, sizeof(struct net_eth_addr)); memcpy(ð->src.addr, net_if_get_link_addr(iface)->addr, sizeof(struct net_eth_addr)); hdr->hwtype = htons(NET_ARP_HTYPE_ETH); hdr->protocol = htons(NET_ETH_PTYPE_IP); hdr->hwlen = sizeof(struct net_eth_addr); hdr->protolen = sizeof(struct in_addr); hdr->opcode = htons(NET_ARP_REPLY); memcpy(&hdr->dst_hwaddr.addr, ð->src.addr, sizeof(struct net_eth_addr)); memcpy(&hdr->src_hwaddr.addr, addr, sizeof(struct net_eth_addr)); net_ipaddr_copy(&hdr->dst_ipaddr, &NET_ARP_HDR(req)->src_ipaddr); net_ipaddr_copy(&hdr->src_ipaddr, &NET_ARP_HDR(req)->dst_ipaddr); net_buf_add(frag, sizeof(struct net_arp_hdr)); return pkt; fail: net_pkt_unref(pkt); return NULL; }