summaryrefslogtreecommitdiff
path: root/kernel/network/ethernet.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/network/ethernet.c')
-rw-r--r--kernel/network/ethernet.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/kernel/network/ethernet.c b/kernel/network/ethernet.c
index dbd1b6d..fd385b3 100644
--- a/kernel/network/ethernet.c
+++ b/kernel/network/ethernet.c
@@ -9,12 +9,6 @@
#include <stdio.h>
#include <string.h>
-struct EthernetHeader {
- u8 mac_dst[6];
- u8 mac_src[6];
- u16 type;
-};
-
u32 crc32(const char *buf, size_t len) {
static u32 table[256];
static int have_table = 0;
@@ -68,6 +62,27 @@ void handle_ethernet(const u8 *packet, u64 packet_length) {
}
}
+void send_ethernet_packet2(u8 mac_dst[6], u16 type, u64 payload_length) {
+ u64 buffer_size =
+ sizeof(struct EthernetHeader) + payload_length + sizeof(u32);
+ assert(buffer_size < 0x1000);
+
+ u8 *buffer = nic_get_buffer();
+ struct EthernetHeader *eth_header = (struct EthernetHeader *)buffer;
+ memset(eth_header, 0, sizeof(struct EthernetHeader));
+ buffer += sizeof(struct EthernetHeader);
+ buffer += payload_length;
+
+ memcpy(eth_header->mac_dst, mac_dst, sizeof(u8[6]));
+ get_mac_address(eth_header->mac_src);
+ eth_header->type = htons(type);
+ *(u32 *)(buffer) =
+ htonl(crc32((const char *)nic_get_buffer(), buffer_size - 4));
+
+ nic_send_buffer(buffer_size);
+ // rtl8139_send_data(ethernet_buffer, buffer_size);
+}
+
u8 ethernet_buffer[0x1000];
void send_ethernet_packet(u8 mac_dst[6], u16 type, u8 *payload,
u64 payload_length) {