summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/net')
-rw-r--r--src/net/ipv4.c18
-rw-r--r--src/net/ipv4.h36
2 files changed, 53 insertions, 1 deletions
diff --git a/src/net/ipv4.c b/src/net/ipv4.c
index 38ae7da..b30fe15 100644
--- a/src/net/ipv4.c
+++ b/src/net/ipv4.c
@@ -1,6 +1,7 @@
#include "ipv4.h"
#include "stdio.h"
+#include "string.h"
char *network_ipv4_address_to_string( network_ipv4_address_t addr, char *buf, size_t buflen )
{
@@ -11,3 +12,20 @@ char *network_ipv4_address_to_string( network_ipv4_address_t addr, char *buf, si
return buf;
}
+char *network_ipv4_protocol_to_string( network_ipv4_protocol_t protocol, char *buf, size_t buflen )
+{
+ switch( protocol ) {
+ case NETWORK_IPV4_PROTOCOL_ICMP:
+ strlcpy( buf, "ICMP", NETWORK_PROTOCOL_IPV4_PROTOCOL_STRING );
+ break;
+
+ case NETWORK_IPV4_PROTOCOL_UDP:
+ strlcpy( buf, "UDP", NETWORK_PROTOCOL_IPV4_PROTOCOL_STRING );
+ break;
+
+ default:
+ strlcpy( buf, "?", NETWORK_PROTOCOL_IPV4_PROTOCOL_STRING );
+ break;
+ }
+ return buf;
+}
diff --git a/src/net/ipv4.h b/src/net/ipv4.h
index acf7f7f..95dec18 100644
--- a/src/net/ipv4.h
+++ b/src/net/ipv4.h
@@ -9,10 +9,44 @@
// 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];
-} network_ipv4_address_t;
+} __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