From f18beba3cb3d85ed6e0f44fdff9256c50adcc5e1 Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Sun, 6 Oct 2024 11:12:16 +0200 Subject: Kernel/Networking: Modify outgoing packet in place This avoids creation of new buffers and unnecessary memcpys. The old interface still exists for UDP but will be removed when I am less lazy. From testing it does not appear to have any performance improvement but this is most likely due to other bottlenecks as extra copies should always be worse. --- kernel/drivers/rtl8139.c | 18 ++++++++++++++++++ kernel/drivers/rtl8139.h | 2 ++ 2 files changed, 20 insertions(+) (limited to 'kernel/drivers') diff --git a/kernel/drivers/rtl8139.c b/kernel/drivers/rtl8139.c index 669cb6c..946c405 100644 --- a/kernel/drivers/rtl8139.c +++ b/kernel/drivers/rtl8139.c @@ -111,6 +111,24 @@ void rtl8139_handler(void *regs) { EOI(0xB); } +u8 *nic_get_buffer(void) { + if (send_buffers_loop > 3) { + send_buffers_loop = 0; + } + return send_buffers[send_buffers_loop]; +} + +void nic_send_buffer(u16 data_size) { + const struct PCI_DEVICE *device = &rtl8139; + outl(device->gen.base_mem_io + 0x20 + send_buffers_loop * 4, + (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; + if (send_buffers_loop > 3) { + send_buffers_loop = 0; + } +} + void rtl8139_send_data(u8 *data, u16 data_size) { if (data_size > 0x1000) { rtl8139_send_data(data, 0x1000); diff --git a/kernel/drivers/rtl8139.h b/kernel/drivers/rtl8139.h index c61e6de..ebefd77 100644 --- a/kernel/drivers/rtl8139.h +++ b/kernel/drivers/rtl8139.h @@ -2,3 +2,5 @@ void get_mac_address(u8 mac[6]); void rtl8139_init(void); void rtl8139_send_data(u8 *data, u16 data_size); +u8 *nic_get_buffer(void); +void nic_send_buffer(u16 data_size); -- cgit v1.2.3