echo_request_t prepare_echo_request(unsigned short identifier, unsigned char *local_ip, unsigned char *local_mac, unsigned char *dest_ip, unsigned char *dest_mac) { char *buffer = calloc(sizeof(char), BUFFER_LEN); char *bufferptr = buffer; // Prepare packet data as needed bufferptr = write_ethernet(bufferptr, dest_mac, local_mac); bufferptr = write_ipv4(bufferptr, identifier + sequence_number, local_ip, dest_ip); bufferptr = write_icmp(bufferptr, identifier); echo_request_t req = { .identifier = identifier, .sequence_number = sequence_number++, .local_mac = local_mac, .local_ip = local_ip, .raw_packet = buffer }; return req; } // Write the ethernet headers char *write_ethernet(char *bufferptr, unsigned char *dest_mac, unsigned char *local_mac) { memcpy(bufferptr, dest_mac, MAC_ADDR_LEN); bufferptr += MAC_ADDR_LEN; memcpy(bufferptr, local_mac, MAC_ADDR_LEN); bufferptr += MAC_ADDR_LEN; short int etherTypeT = htons(0x0800); memcpy(bufferptr, &(etherTypeT), sizeof(etherTypeT)); return bufferptr + ETHERTYPE_LEN; }
int write_token_ip_entry(FILE* h_token2ip, const char* token, uint8_t* ip) { if (!write_string(h_token2ip, token)) return 0; if (!write_ipv4(h_token2ip, ip)) return 0; return 1; }