blob: 95dec1804e3dddf7e13759bcd989f8bb5d25208d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#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
|