network/protocols: Set and check L3/L4_CHECKSUM_VALID flags.
iperf3 TCP on loopback, 1 core (in VMware) goes from ~7.2 Gbits/sec to ~9.4 Gbits/sec. Change-Id: I0c93254fab9ee1b5040ef5f71000982bac1a5d15 Reviewed-on: https://review.haiku-os.org/c/haiku/+/7917 Haiku-Format: Haiku-format Bot <[email protected]> Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
258ae0c892
commit
2a2f213fde
@@ -1559,6 +1559,7 @@ ipv4_send_routed_data(net_protocol* _protocol, struct net_route* route,
|
|||||||
if (checksumNeeded) {
|
if (checksumNeeded) {
|
||||||
*IPChecksumField(buffer) = gBufferModule->checksum(buffer, 0,
|
*IPChecksumField(buffer) = gBufferModule->checksum(buffer, 0,
|
||||||
sizeof(ipv4_header), true);
|
sizeof(ipv4_header), true);
|
||||||
|
buffer->buffer_flags |= NET_BUFFER_L3_CHECKSUM_VALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((buffer->msg_flags & MSG_MCAST) != 0
|
if ((buffer->msg_flags & MSG_MCAST) != 0
|
||||||
@@ -1741,9 +1742,10 @@ ipv4_receive_data(net_buffer* buffer)
|
|||||||
|| headerLength < sizeof(ipv4_header))
|
|| headerLength < sizeof(ipv4_header))
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
|
|
||||||
// TODO: would be nice to have a direct checksum function somewhere
|
if ((buffer->buffer_flags & NET_BUFFER_L3_CHECKSUM_VALID) == 0) {
|
||||||
if (gBufferModule->checksum(buffer, 0, headerLength, true) != 0)
|
if (gBufferModule->checksum(buffer, 0, headerLength, true) != 0)
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
|
}
|
||||||
|
|
||||||
// lower layers notion of broadcast or multicast have no relevance to us
|
// lower layers notion of broadcast or multicast have no relevance to us
|
||||||
// other than deciding whether to send an ICMP error
|
// other than deciding whether to send an ICMP error
|
||||||
|
|||||||
@@ -435,6 +435,7 @@ add_tcp_header(net_address_module_info* addressModule,
|
|||||||
|
|
||||||
*TCPChecksumField(buffer) = Checksum::PseudoHeader(addressModule,
|
*TCPChecksumField(buffer) = Checksum::PseudoHeader(addressModule,
|
||||||
gBufferModule, buffer, IPPROTO_TCP);
|
gBufferModule, buffer, IPPROTO_TCP);
|
||||||
|
buffer->buffer_flags |= NET_BUFFER_L4_CHECKSUM_VALID;
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -698,9 +699,10 @@ tcp_receive_data(net_buffer* buffer)
|
|||||||
if (headerLength < sizeof(tcp_header))
|
if (headerLength < sizeof(tcp_header))
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
|
|
||||||
if (Checksum::PseudoHeader(addressModule, gBufferModule, buffer,
|
if ((buffer->buffer_flags & NET_BUFFER_L4_CHECKSUM_VALID) == 0) {
|
||||||
IPPROTO_TCP) != 0)
|
if (Checksum::PseudoHeader(addressModule, gBufferModule, buffer, IPPROTO_TCP) != 0)
|
||||||
return B_BAD_DATA;
|
return B_BAD_DATA;
|
||||||
|
}
|
||||||
|
|
||||||
addressModule->set_port(buffer->source, header.source_port);
|
addressModule->set_port(buffer->source, header.source_port);
|
||||||
addressModule->set_port(buffer->destination, header.destination_port);
|
addressModule->set_port(buffer->destination, header.destination_port);
|
||||||
|
|||||||
@@ -828,7 +828,7 @@ UdpEndpointManager::Deframe(net_buffer* buffer)
|
|||||||
if (buffer->size > udpLength)
|
if (buffer->size > udpLength)
|
||||||
gBufferModule->trim(buffer, udpLength);
|
gBufferModule->trim(buffer, udpLength);
|
||||||
|
|
||||||
if (header.udp_checksum != 0) {
|
if (header.udp_checksum != 0 && (buffer->buffer_flags & NET_BUFFER_L4_CHECKSUM_VALID) == 0) {
|
||||||
// check UDP-checksum (simulating a so-called "pseudo-header"):
|
// check UDP-checksum (simulating a so-called "pseudo-header"):
|
||||||
uint16 sum = Checksum::PseudoHeader(addressModule, gBufferModule,
|
uint16 sum = Checksum::PseudoHeader(addressModule, gBufferModule,
|
||||||
buffer, IPPROTO_UDP);
|
buffer, IPPROTO_UDP);
|
||||||
@@ -1042,6 +1042,7 @@ UdpEndpoint::SendRoutedData(net_buffer *buffer, net_route *route)
|
|||||||
calculatedChecksum = 0xffff;
|
calculatedChecksum = 0xffff;
|
||||||
|
|
||||||
*UDPChecksumField(buffer) = calculatedChecksum;
|
*UDPChecksumField(buffer) = calculatedChecksum;
|
||||||
|
buffer->buffer_flags |= NET_BUFFER_L4_CHECKSUM_VALID;
|
||||||
|
|
||||||
return next->module->send_routed_data(next, route, buffer);
|
return next->module->send_routed_data(next, route, buffer);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user