summaryrefslogtreecommitdiff
path: root/src/net/ipv4.h
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