summaryrefslogtreecommitdiff
path: root/Source/Core/Common/Network.cpp
diff options
context:
space:
mode:
authorschthack <schthack@yahoo.com>2022-05-22 12:21:28 -0400
committerschthack <schthack@yahoo.com>2022-07-02 18:02:50 -0400
commit01ada3850ff07c0225819fee2898f355aaf3707a (patch)
tree16175a35b4060a0c788eff71fa5004c4c4c3c01a /Source/Core/Common/Network.cpp
parentd625c612c4a40a8c8db3d90b313f5643aec9c890 (diff)
BBA: Added BuiltIn device that allow BBA emulation without the need of a TapDevice Configuration include a dns server setting
Diffstat (limited to 'Source/Core/Common/Network.cpp')
-rw-r--r--Source/Core/Common/Network.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/Source/Core/Common/Network.cpp b/Source/Core/Common/Network.cpp
index faa2a33c05..756dd0381e 100644
--- a/Source/Core/Common/Network.cpp
+++ b/Source/Core/Common/Network.cpp
@@ -5,6 +5,7 @@
#include <algorithm>
#include <string_view>
+#include <vector>
#ifndef _WIN32
#include <netinet/in.h>
@@ -141,6 +142,18 @@ TCPHeader::TCPHeader(const sockaddr_in& from, const sockaddr_in& to, u32 seq, co
checksum = htons(static_cast<u16>(tcp_checksum));
}
+TCPHeader::TCPHeader(const sockaddr_in& from, const sockaddr_in& to, u32 seq, u32 ack, u16 flags)
+{
+ source_port = from.sin_port;
+ destination_port = to.sin_port;
+ sequence_number = htonl(seq);
+ acknowledgement_number = htonl(ack);
+ properties = 0x50 | flags;
+
+ window_size = 0x7c;
+ checksum = 0;
+}
+
u16 TCPHeader::Size() const
{
return static_cast<u16>(SIZE);
@@ -170,6 +183,59 @@ u8 UDPHeader::IPProto() const
return static_cast<u8>(IPPROTO_UDP);
}
+ARPHeader::ARPHeader() = default;
+
+ARPHeader::ARPHeader(u32 from_ip, MACAddress from_mac, u32 to_ip, MACAddress to_mac)
+{
+ hardware_type = htons(BBA_HARDWARE_TYPE);
+ protocol_type = IPV4_HEADER_TYPE;
+ hardware_size = MAC_ADDRESS_SIZE;
+ protocol_size = IPV4_ADDR_LEN;
+ opcode = 0x200;
+ sender_ip = from_ip;
+ target_ip = to_ip;
+ targer_address = to_mac;
+ sender_address = from_mac;
+}
+
+u16 ARPHeader::Size() const
+{
+ return static_cast<u16>(SIZE);
+}
+
+DHCPBody::DHCPBody() = default;
+
+DHCPBody::DHCPBody(u32 transaction, MACAddress client_address, u32 new_ip, u32 serv_ip)
+{
+ transaction_id = transaction;
+ message_type = DHCPConst::MESSAGE_REPLY;
+ hardware_type = BBA_HARDWARE_TYPE;
+ hardware_addr = MAC_ADDRESS_SIZE;
+ client_mac = client_address;
+ your_ip = new_ip;
+ server_ip = serv_ip;
+}
+
+// Add an option to the DHCP Body
+bool DHCPBody::AddDHCPOption(u8 size, u8 fnc, const std::vector<u8>& params)
+{
+ int i = 0;
+ while (options[i] != 0)
+ {
+ i += options[i + 1] + 2;
+ if (i >= std::size(options))
+ {
+ return false;
+ }
+ }
+
+ options[i++] = fnc;
+ options[i++] = size;
+ for (auto val : params)
+ options[i++] = val;
+ return true;
+}
+
// Compute the network checksum with a 32-bit accumulator using the
// "Normal" order, see RFC 1071 for more details.
u16 ComputeNetworkChecksum(const void* data, u16 length, u32 initial_value)
@@ -187,6 +253,20 @@ u16 ComputeNetworkChecksum(const void* data, u16 length, u32 initial_value)
return ~static_cast<u16>(checksum);
}
+// Compute the TCP network checksum with a fake header
+u16 ComputeTCPNetworkChecksum(const sockaddr_in& from, const sockaddr_in& to, const void* data,
+ u16 length, u8 protocol)
+{
+ // Compute the TCP checksum with its pseudo header
+ const u32 source_addr = ntohl(from.sin_addr.s_addr);
+ const u32 destination_addr = ntohl(to.sin_addr.s_addr);
+ const u32 initial_value = (source_addr >> 16) + (source_addr & 0xFFFF) +
+ (destination_addr >> 16) + (destination_addr & 0xFFFF) + protocol +
+ length;
+ const u32 tcp_checksum = ComputeNetworkChecksum(data, length, initial_value);
+ return htons(static_cast<u16>(tcp_checksum));
+}
+
NetworkErrorState SaveNetworkErrorState()
{
return {