#ifndef IPV4_H #define IPV4_H #include "stdint.h" #include "stddef.h" #define NETWORK_PROTOCOL_IPV4_ADDR_STRING 4 * 4 + 1 // protocol_address_len #define NETWORK_PROTOCOL_IPV4_ADDRESS_LENGTH 4 // protocol string len #define NETWORK_PROTOCOL_IPV4_PROTOCOL_STRING 5 #if defined( __TINYC__ ) #pragma pack(1) #endif typedef struct { uint8_t byte[NETWORK_PROTOCOL_IPV4_ADDRESS_LENGTH]; } __attribute__( ( packed ) ) network_ipv4_address_t; typedef uint8_t network_ipv4_protocol_t; // TODO: network order not host oder, so for now swap it #define NETWORK_IPV4_PROTOCOL_ICMP (network_ipv4_protocol_t)0x01 #define NETWORK_IPV4_PROTOCOL_UDP (network_ipv4_protocol_t)0x11 typedef struct { uint8_t internet_header_length : 4; uint8_t version : 4; uint8_t explicit_congestion_notification : 2; uint8_t differentiated_services_code_point : 6; uint16_t total_length; uint16_t identification; uint16_t fragment_offset : 13; uint16_t flags : 3; uint8_t time_to_live; network_ipv4_protocol_t protocol; uint16_t checksum; network_ipv4_address_t source_address; network_ipv4_address_t destination_address; } __attribute__( ( packed ) ) network_ipv4_packet_t; #if defined( __TINYC__ ) #pragma pack() #endif char *network_ipv4_address_to_string( network_ipv4_address_t addr, char *buf, size_t buflen ); char *network_ipv4_protocol_to_string( network_ipv4_protocol_t protocol, char *buf, size_t buflen ); #endif // IPV4_H