From ec91e81a4fcfd7ee6bc4150f06d8740e82f808da Mon Sep 17 00:00:00 2001
From: Anton Kling <anton@kling.gg>
Date: Wed, 22 Nov 2023 21:58:30 +0100
Subject: Networking: Split network packets if they are too large

---
 kernel/drivers/rtl8139.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

(limited to 'kernel/drivers/rtl8139.c')

diff --git a/kernel/drivers/rtl8139.c b/kernel/drivers/rtl8139.c
index 4b53ef4..dd81533 100644
--- a/kernel/drivers/rtl8139.c
+++ b/kernel/drivers/rtl8139.c
@@ -103,12 +103,16 @@ __attribute__((interrupt)) void rtl8139_handler(void *regs) {
   EOI(0xB);
 }
 
-int rtl8139_send_data(u8 *data, u16 data_size) {
+void rtl8139_send_data(u8 *data, u16 data_size) {
   const struct PCI_DEVICE *device = &rtl8139;
   // FIXME: It should block or fail if there is too little space for the
   // buffer
-  if (data_size > 0x1000)
-    return 0;
+  if (data_size > 0x1000) {
+    rtl8139_send_data(data, 0x1000);
+    data += 0x1000;
+    data_size -= 0x1000;
+    return rtl8139_send_data(data, data_size);
+  }
   if (send_buffers_loop > 3) {
     send_buffers_loop = 0;
   }
@@ -117,7 +121,6 @@ int rtl8139_send_data(u8 *data, u16 data_size) {
        (u32)virtual_to_physical(send_buffers[send_buffers_loop], NULL));
   outl(device->gen.base_mem_io + 0x10 + send_buffers_loop * 4, data_size);
   send_buffers_loop += 1;
-  return 1;
 }
 
 void get_mac_address(u8 mac[6]) {
-- 
cgit v1.2.3