static void send_arp_probe_ipv4(void){ // "random address" static uint8_t requested_address[4] = {169, 254, 1, 0}; requested_address[3]++; int pos = setup_ethernet_header(1, 0, 1, NETWORK_TYPE_IPv4); big_endian_store_16(network_buffer, pos, HARDWARE_TYPE_ETHERNET); pos += 2; big_endian_store_16(network_buffer, pos, NETWORK_TYPE_IPv4); pos += 2; network_buffer[pos++] = 6; // Hardware length (HLEN) - 6 MAC Address network_buffer[pos++] = 4; // Protocol length (PLEN) - 4 IPv4 Address big_endian_store_16(network_buffer, pos, ARP_OPERATION_REQUEST); pos += 2; bd_addr_copy(&network_buffer[pos], local_addr); // Sender Hardware Address (SHA) pos += 6; memset(&network_buffer[pos], 0, 4); // Sender Protocol Adress (SPA) pos += 4; bd_addr_copy(&network_buffer[pos], other_addr); // Target Hardware Address (THA) (ignored for requests) pos += 6; memcpy(&network_buffer[pos], requested_address, 4); pos += 4; // magically, add some extra bytes for Ethernet padding pos += 18; send_buffer(pos); }
static uint16_t setup_ethernet_header(int src_compressed, int dst_compressed, int broadcast, uint16_t network_protocol_type){ // setup packet int pos = 0; // destination if (broadcast){ bd_addr_copy(&network_buffer[pos], broadcast_addr); } else { bd_addr_copy(&network_buffer[pos], dst_compressed ? pts_addr : other_addr); } pos += 6; // source bd_addr_copy(&network_buffer[pos], src_compressed ? local_addr : other_addr); pos += 6; big_endian_store_16(network_buffer, pos, network_protocol_type); pos += 2; return pos; }
static void add_to_blacklist(bd_addr_t addr){ printf("%s added to blacklist (no battery service found\n", bd_addr_to_str(addr)); bd_addr_copy(blacklist[blacklist_index], addr); blacklist_index = (blacklist_index + 1) % blacklist_size(); }