summaryrefslogtreecommitdiff
path: root/Source/Core/Common/Network.cpp
diff options
context:
space:
mode:
authorSepalani <sepalani@hotmail.fr>2022-07-10 13:56:33 +0400
committerSepalani <sepalani@hotmail.fr>2022-07-10 13:56:33 +0400
commit6238834c05d173e92cf5857bcecf9b9a59ebdf68 (patch)
treef42c45e3f27a740f5f99c6b10c05d0354af17ece /Source/Core/Common/Network.cpp
parent4efe1e7ca7ca4377b5f54e277e2d086a649c2cbd (diff)
Common/Network: Add InsertObj helper
Diffstat (limited to 'Source/Core/Common/Network.cpp')
-rw-r--r--Source/Core/Common/Network.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/Source/Core/Common/Network.cpp b/Source/Core/Common/Network.cpp
index 5bc6469912..2f5ddd44df 100644
--- a/Source/Core/Common/Network.cpp
+++ b/Source/Core/Common/Network.cpp
@@ -314,6 +314,14 @@ u16 ComputeTCPNetworkChecksum(const IPAddress& from, const IPAddress& to, const
return htons(static_cast<u16>(tcp_checksum));
}
+template <typename Container, typename T>
+static inline void InsertObj(Container* container, const T& obj)
+{
+ static_assert(std::is_trivially_copyable_v<T>);
+ const u8* const ptr = reinterpret_cast<const u8*>(&obj);
+ container->insert(container->end(), ptr, ptr + sizeof(obj));
+}
+
ARPPacket::ARPPacket() = default;
u16 ARPPacket::Size() const
@@ -332,10 +340,8 @@ std::vector<u8> ARPPacket::Build() const
{
std::vector<u8> result;
result.reserve(EthernetHeader::SIZE + ARPHeader::SIZE);
- const u8* eth_ptr = reinterpret_cast<const u8*>(&eth_header);
- result.insert(result.end(), eth_ptr, eth_ptr + EthernetHeader::SIZE);
- const u8* arp_ptr = reinterpret_cast<const u8*>(&arp_header);
- result.insert(result.end(), arp_ptr, arp_ptr + ARPHeader::SIZE);
+ InsertObj(&result, eth_header);
+ InsertObj(&result, arp_header);
return result;
}
@@ -359,10 +365,8 @@ std::vector<u8> TCPPacket::Build()
TCPHeader::SIZE + tcp_options.size() + data.size()));
// copy data
- const u8* eth_ptr = reinterpret_cast<const u8*>(&eth_header);
- result.insert(result.end(), eth_ptr, eth_ptr + EthernetHeader::SIZE);
- const u8* ip_ptr = reinterpret_cast<const u8*>(&ip_header);
- result.insert(result.end(), ip_ptr, ip_ptr + IPv4Header::SIZE);
+ InsertObj(&result, eth_header);
+ InsertObj(&result, ip_header);
std::size_t offset = EthernetHeader::SIZE + IPv4Header::SIZE;
if (ipv4_options.size() > 0)
{
@@ -419,10 +423,8 @@ std::vector<u8> UDPPacket::Build()
udp_header.length = htons(static_cast<u16>(UDPHeader::SIZE + data.size()));
// copy data
- const u8* eth_ptr = reinterpret_cast<const u8*>(&eth_header);
- result.insert(result.end(), eth_ptr, eth_ptr + EthernetHeader::SIZE);
- const u8* ip_ptr = reinterpret_cast<const u8*>(&ip_header);
- result.insert(result.end(), ip_ptr, ip_ptr + IPv4Header::SIZE);
+ InsertObj(&result, eth_header);
+ InsertObj(&result, ip_header);
std::size_t offset = EthernetHeader::SIZE + IPv4Header::SIZE;
if (ipv4_options.size() > 0)
{