
The majority of the time in NetworkTask was being spent in allocating and deallocating KBuffers for each incoming packet. We'll now keep up to 100 buffers around and reuse them for new packets if the next incoming packet fits in an old buffer. This is pretty naively implemented but definitely cuts down on time spent here.
33 lines
915 B
C++
33 lines
915 B
C++
#pragma once
|
|
|
|
#include <AK/NetworkOrdered.h>
|
|
#include <Kernel/Net/MACAddress.h>
|
|
|
|
#pragma GCC diagnostic ignored "-Warray-bounds"
|
|
|
|
class [[gnu::packed]] EthernetFrameHeader
|
|
{
|
|
public:
|
|
EthernetFrameHeader() {}
|
|
~EthernetFrameHeader() {}
|
|
|
|
MACAddress destination() const { return m_destination; }
|
|
void set_destination(const MACAddress& address) { m_destination = address; }
|
|
|
|
MACAddress source() const { return m_source; }
|
|
void set_source(const MACAddress& address) { m_source = address; }
|
|
|
|
u16 ether_type() const { return m_ether_type; }
|
|
void set_ether_type(u16 ether_type) { m_ether_type = ether_type; }
|
|
|
|
const void* payload() const { return &m_payload[0]; }
|
|
void* payload() { return &m_payload[0]; }
|
|
|
|
private:
|
|
MACAddress m_destination;
|
|
MACAddress m_source;
|
|
NetworkOrdered<u16> m_ether_type;
|
|
u32 m_payload[0];
|
|
};
|
|
|
|
static_assert(sizeof(EthernetFrameHeader) == 14);
|