mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 03:58:12 +00:00
IPv4: Remove an unnecessary copy of each outgoing IPv4 payload
There's no need for send_ipv4() to take a ByteBuffer&&, the data is immediately cooked into a packet and transmitted. Instead, just pass it the address+length of whatever buffer we've been using locally. The more we can reduce the pressure on kmalloc the better. :^)
This commit is contained in:
parent
6347e3aa51
commit
52cfe9ebae
6 changed files with 9 additions and 9 deletions
|
@ -164,7 +164,7 @@ ssize_t IPv4Socket::sendto(FileDescription&, const void* data, size_t data_lengt
|
||||||
kprintf("sendto: destination=%s:%u\n", m_peer_address.to_string().characters(), m_peer_port);
|
kprintf("sendto: destination=%s:%u\n", m_peer_address.to_string().characters(), m_peer_port);
|
||||||
|
|
||||||
if (type() == SOCK_RAW) {
|
if (type() == SOCK_RAW) {
|
||||||
adapter->send_ipv4(MACAddress(), m_peer_address, (IPv4Protocol)protocol(), ByteBuffer::copy(data, data_length));
|
adapter->send_ipv4(MACAddress(), m_peer_address, (IPv4Protocol)protocol(), (const u8*)data, data_length);
|
||||||
return data_length;
|
return data_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,9 +56,9 @@ void NetworkAdapter::send(const MACAddress& destination, const ARPPacket& packet
|
||||||
send_raw((u8*)eth, size_in_bytes);
|
send_raw((u8*)eth, size_in_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkAdapter::send_ipv4(const MACAddress& destination_mac, const IPv4Address& destination_ipv4, IPv4Protocol protocol, ByteBuffer&& payload)
|
void NetworkAdapter::send_ipv4(const MACAddress& destination_mac, const IPv4Address& destination_ipv4, IPv4Protocol protocol, const u8* payload, size_t payload_size)
|
||||||
{
|
{
|
||||||
size_t size_in_bytes = sizeof(EthernetFrameHeader) + sizeof(IPv4Packet) + payload.size();
|
size_t size_in_bytes = sizeof(EthernetFrameHeader) + sizeof(IPv4Packet) + payload_size;
|
||||||
auto buffer = ByteBuffer::create_zeroed(size_in_bytes);
|
auto buffer = ByteBuffer::create_zeroed(size_in_bytes);
|
||||||
auto& eth = *(EthernetFrameHeader*)buffer.pointer();
|
auto& eth = *(EthernetFrameHeader*)buffer.pointer();
|
||||||
eth.set_source(mac_address());
|
eth.set_source(mac_address());
|
||||||
|
@ -70,11 +70,11 @@ void NetworkAdapter::send_ipv4(const MACAddress& destination_mac, const IPv4Addr
|
||||||
ipv4.set_source(ipv4_address());
|
ipv4.set_source(ipv4_address());
|
||||||
ipv4.set_destination(destination_ipv4);
|
ipv4.set_destination(destination_ipv4);
|
||||||
ipv4.set_protocol((u8)protocol);
|
ipv4.set_protocol((u8)protocol);
|
||||||
ipv4.set_length(sizeof(IPv4Packet) + payload.size());
|
ipv4.set_length(sizeof(IPv4Packet) + payload_size);
|
||||||
ipv4.set_ident(1);
|
ipv4.set_ident(1);
|
||||||
ipv4.set_ttl(64);
|
ipv4.set_ttl(64);
|
||||||
ipv4.set_checksum(ipv4.compute_checksum());
|
ipv4.set_checksum(ipv4.compute_checksum());
|
||||||
memcpy(ipv4.payload(), payload.pointer(), payload.size());
|
memcpy(ipv4.payload(), payload, payload_size);
|
||||||
send_raw((const u8*)ð, size_in_bytes);
|
send_raw((const u8*)ð, size_in_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ public:
|
||||||
void set_ipv4_address(const IPv4Address&);
|
void set_ipv4_address(const IPv4Address&);
|
||||||
|
|
||||||
void send(const MACAddress&, const ARPPacket&);
|
void send(const MACAddress&, const ARPPacket&);
|
||||||
void send_ipv4(const MACAddress&, const IPv4Address&, IPv4Protocol, ByteBuffer&& payload);
|
void send_ipv4(const MACAddress&, const IPv4Address&, IPv4Protocol, const u8* payload, size_t payload_size);
|
||||||
|
|
||||||
RefPtr<KBuffer> dequeue_packet();
|
RefPtr<KBuffer> dequeue_packet();
|
||||||
|
|
||||||
|
|
|
@ -228,7 +228,7 @@ void handle_icmp(const EthernetFrameHeader& eth, int frame_size)
|
||||||
if (size_t icmp_payload_size = icmp_packet_size - sizeof(ICMPEchoPacket))
|
if (size_t icmp_payload_size = icmp_packet_size - sizeof(ICMPEchoPacket))
|
||||||
memcpy(response.payload(), request.payload(), icmp_payload_size);
|
memcpy(response.payload(), request.payload(), icmp_payload_size);
|
||||||
response.header.set_checksum(internet_checksum(&response, icmp_packet_size));
|
response.header.set_checksum(internet_checksum(&response, icmp_packet_size));
|
||||||
adapter->send_ipv4(eth.source(), ipv4_packet.source(), IPv4Protocol::ICMP, move(buffer));
|
adapter->send_ipv4(eth.source(), ipv4_packet.source(), IPv4Protocol::ICMP, buffer.data(), buffer.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,7 @@ void TCPSocket::send_tcp_packet(u16 flags, const void* payload, int payload_size
|
||||||
tcp_packet.sequence_number(),
|
tcp_packet.sequence_number(),
|
||||||
tcp_packet.ack_number());
|
tcp_packet.ack_number());
|
||||||
#endif
|
#endif
|
||||||
adapter->send_ipv4(MACAddress(), peer_address(), IPv4Protocol::TCP, move(buffer));
|
adapter->send_ipv4(MACAddress(), peer_address(), IPv4Protocol::TCP, buffer.data(), buffer.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkOrdered<u16> TCPSocket::compute_tcp_checksum(const IPv4Address& source, const IPv4Address& destination, const TCPPacket& packet, u16 payload_size)
|
NetworkOrdered<u16> TCPSocket::compute_tcp_checksum(const IPv4Address& source, const IPv4Address& destination, const TCPPacket& packet, u16 payload_size)
|
||||||
|
|
|
@ -70,7 +70,7 @@ int UDPSocket::protocol_send(const void* data, int data_length)
|
||||||
local_port(),
|
local_port(),
|
||||||
peer_address().to_string().characters(),
|
peer_address().to_string().characters(),
|
||||||
peer_port());
|
peer_port());
|
||||||
adapter->send_ipv4(MACAddress(), peer_address(), IPv4Protocol::UDP, move(buffer));
|
adapter->send_ipv4(MACAddress(), peer_address(), IPv4Protocol::UDP, buffer.data(), buffer.size());
|
||||||
return data_length;
|
return data_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue