#pragma once #include namespace ip4 { struct header { uint8_t version_ihl; uint8_t type_of_service; uint16_t total_length; uint16_t identification; uint16_t fragment_offset; uint8_t time_to_live; uint8_t protocol; uint16_t header_checksum; uint32_t source_address; uint32_t destination_address; }; static_assert((sizeof (header)) == 20); char const * tostr(uint32_t a); uint32_t checksum_partial(uint32_t sum, void const * src, int length); uint32_t checksum_finish(uint32_t sum); uint32_t checksum(void const * src, int length); header * make_header(void * buf, uint16_t payload_length, uint16_t identification, uint32_t source_address, // big endian uint32_t destination_address); // big endian struct protocol { enum { udp = 17, }; }; }