summaryrefslogtreecommitdiff
path: root/network/ethernet.c
diff options
context:
space:
mode:
Diffstat (limited to 'network/ethernet.c')
-rw-r--r--network/ethernet.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/network/ethernet.c b/network/ethernet.c
index ae8e814..11a3876 100644
--- a/network/ethernet.c
+++ b/network/ethernet.c
@@ -4,6 +4,7 @@
#include <network/arp.h>
#include <network/bytes.h>
#include <network/ethernet.h>
+#include <network/ipv4.h>
#include <stdio.h>
struct ETHERNET_HEADER {
@@ -44,10 +45,10 @@ uint32_t crc32(const char *buf, size_t len) {
return ~crc;
}
-void handle_ethernet(uint8_t *packet, uint64_t packet_length) {
+void handle_ethernet(const uint8_t *packet, uint64_t packet_length) {
struct ETHERNET_HEADER *eth_header = (struct ETHERNET_HEADER *)packet;
packet += sizeof(struct ETHERNET_HEADER);
- uint8_t *payload = packet;
+ const uint8_t *payload = packet;
packet += packet_length - sizeof(struct ETHERNET_HEADER);
uint32_t crc = *((uint32_t *)packet - 1);
kprintf("PACKET crc: %x\n", crc);
@@ -70,7 +71,7 @@ void handle_ethernet(uint8_t *packet, uint64_t packet_length) {
handle_arp(payload);
break;
case 0x0800:
- kprintf("IPV4 message\n");
+ handle_ipv4(payload, packet_length - sizeof(struct ETHERNET_HEADER) - 4);
break;
default:
kprintf("Can't handle ethernet type\n");
@@ -97,5 +98,6 @@ void send_ethernet_packet(uint8_t mac_dst[6], uint16_t type, uint8_t *payload,
htonl(crc32((const char *)buffer_start, buffer_size - 4));
assert(rtl8139_send_data(buffer_start, buffer_size));
+ kfree(buffer_start);
kprintf("sent data\n");
}