diff --git a/Source/Core/Common/Network.cpp b/Source/Core/Common/Network.cpp index f35308a5ab..2d532690c1 100644 --- a/Source/Core/Common/Network.cpp +++ b/Source/Core/Common/Network.cpp @@ -377,9 +377,15 @@ std::vector TCPPacket::Build() const (static_cast((tcp_options.size() + TCPHeader::SIZE) & 0x3c) << 10); Common::BitCastPtr(tcp_ptr + offsetof(TCPHeader, properties)) = htons(tcp_properties); - const u16 ip_total_len = static_cast(IPv4Header::SIZE + ipv4_options.size() + tcp_length); + const u16 ip_header_size = static_cast(IPv4Header::SIZE + ipv4_options.size()); + const u16 ip_total_len = ip_header_size + tcp_length; Common::BitCastPtr(ip_ptr + offsetof(IPv4Header, total_len)) = htons(ip_total_len); + auto ip_checksum_bitcast_ptr = + Common::BitCastPtr(ip_ptr + offsetof(IPv4Header, header_checksum)); + ip_checksum_bitcast_ptr = u16(0); + ip_checksum_bitcast_ptr = htons(Common::ComputeNetworkChecksum(ip_ptr, ip_header_size)); + auto checksum_bitcast_ptr = Common::BitCastPtr(tcp_ptr + offsetof(TCPHeader, checksum)); checksum_bitcast_ptr = u16(0); checksum_bitcast_ptr = ComputeTCPNetworkChecksum( @@ -421,9 +427,15 @@ std::vector UDPPacket::Build() const const u16 udp_length = static_cast(UDPHeader::SIZE + data.size()); Common::BitCastPtr(udp_ptr + offsetof(UDPHeader, length)) = htons(udp_length); - const u16 ip_total_len = static_cast(IPv4Header::SIZE + ipv4_options.size() + udp_length); + const u16 ip_header_size = static_cast(IPv4Header::SIZE + ipv4_options.size()); + const u16 ip_total_len = ip_header_size + udp_length; Common::BitCastPtr(ip_ptr + offsetof(IPv4Header, total_len)) = htons(ip_total_len); + auto ip_checksum_bitcast_ptr = + Common::BitCastPtr(ip_ptr + offsetof(IPv4Header, header_checksum)); + ip_checksum_bitcast_ptr = u16(0); + ip_checksum_bitcast_ptr = htons(Common::ComputeNetworkChecksum(ip_ptr, ip_header_size)); + auto checksum_bitcast_ptr = Common::BitCastPtr(udp_ptr + offsetof(UDPHeader, checksum)); checksum_bitcast_ptr = u16(0); checksum_bitcast_ptr = ComputeTCPNetworkChecksum(