diff options
| author | Sepalani <sepalani@hotmail.fr> | 2022-07-10 13:56:33 +0400 |
|---|---|---|
| committer | Sepalani <sepalani@hotmail.fr> | 2022-07-10 13:56:33 +0400 |
| commit | 6238834c05d173e92cf5857bcecf9b9a59ebdf68 (patch) | |
| tree | f42c45e3f27a740f5f99c6b10c05d0354af17ece /Source/Core/Common/Network.cpp | |
| parent | 4efe1e7ca7ca4377b5f54e277e2d086a649c2cbd (diff) | |
Common/Network: Add InsertObj helper
Diffstat (limited to 'Source/Core/Common/Network.cpp')
| -rw-r--r-- | Source/Core/Common/Network.cpp | 26 |
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*>(ð_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*>(ð_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*>(ð_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) { |
