diff options
author | Anton Kling <anton@kling.gg> | 2024-10-06 11:12:16 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-10-06 11:12:16 +0200 |
commit | f18beba3cb3d85ed6e0f44fdff9256c50adcc5e1 (patch) | |
tree | 42e15026c9a0154269e5c7de71cd829866d6d564 /kernel/network/ethernet.c | |
parent | 6dc2637972f93dea8cc831d7ee225daefb74b8ab (diff) |
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.
Diffstat (limited to 'kernel/network/ethernet.c')
-rw-r--r-- | kernel/network/ethernet.c | 27 |
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) { |