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/network/ethernet.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'kernel/network/ethernet.c') 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 #include -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) { -- cgit v1.2.3