arc: Move platform2/arc/network/ to platform2/patchpanel
Next step in the arc-networkd -> patchpanel rename, this patch moves the
location of the code.
BUG=b:151879931
TEST=units,flashed image to atlas
TEST=tasts arc.PlayStore, crostini.LaunchTerminal.download
Change-Id: I1b5cf8d670e1631d46f6449b725395157bf88dde
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2115863
Tested-by: Garrick Evans <garrick@chromium.org>
Commit-Queue: Garrick Evans <garrick@chromium.org>
Reviewed-by: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: Eric Caruso <ejcaruso@chromium.org>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
Reviewed-by: Hugo Benichi <hugobenichi@google.com>
diff --git a/patchpanel/net_util.h b/patchpanel/net_util.h
new file mode 100644
index 0000000..50e97ec
--- /dev/null
+++ b/patchpanel/net_util.h
@@ -0,0 +1,134 @@
+// Copyright 2019 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <arpa/inet.h>
+#include <ifaddrs.h>
+#include <linux/in6.h>
+#include <linux/vm_sockets.h>
+#include <net/route.h>
+#include <netinet/icmp6.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/ip6.h>
+#include <netinet/udp.h>
+#include <stdint.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/un.h>
+
+#include <string>
+
+#include <brillo/brillo_export.h>
+
+#include "patchpanel/mac_address_generator.h"
+
+#ifndef PATCHPANEL_NET_UTIL_H_
+#define PATCHPANEL_NET_UTIL_H_
+
+namespace patchpanel {
+
+// Reverses the byte order of the argument.
+BRILLO_EXPORT constexpr uint32_t Byteswap32(uint32_t x) {
+ return (x >> 24) | (x << 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000);
+}
+
+// Reverses the byte order of the argument.
+BRILLO_EXPORT constexpr uint16_t Byteswap16(uint16_t x) {
+ return (x >> 8) | (x << 8);
+}
+
+// Constexpr version of ntohl().
+BRILLO_EXPORT constexpr uint32_t Ntohl(uint32_t x) {
+ return Byteswap32(x);
+}
+
+// Constexpr version of htonl().
+BRILLO_EXPORT constexpr uint32_t Htonl(uint32_t x) {
+ return Byteswap32(x);
+}
+
+// Constexpr version of ntohs().
+BRILLO_EXPORT constexpr uint16_t Ntohs(uint16_t x) {
+ return Byteswap16(x);
+}
+
+// Constexpr version of htons().
+BRILLO_EXPORT constexpr uint16_t Htons(uint16_t x) {
+ return Byteswap16(x);
+}
+
+// Returns the network-byte order int32 representation of the IPv4 address given
+// byte per byte, most significant bytes first.
+BRILLO_EXPORT constexpr uint32_t Ipv4Addr(uint8_t b0,
+ uint8_t b1,
+ uint8_t b2,
+ uint8_t b3) {
+ return (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
+}
+
+// Returns the netmask in network byte order given a prefixl length.
+BRILLO_EXPORT uint32_t Ipv4Netmask(uint32_t prefix_len);
+
+// Returns the broadcast address in network byte order for the subnet provided.
+BRILLO_EXPORT uint32_t Ipv4BroadcastAddr(uint32_t base, uint32_t prefix_len);
+
+// Returns the literal representation of the IPv4 address given in network byte
+// order.
+BRILLO_EXPORT std::string IPv4AddressToString(uint32_t addr);
+
+// Returns the CIDR representation of an IPv4 address given in network byte
+// order.
+BRILLO_EXPORT std::string IPv4AddressToCidrString(uint32_t addr,
+ uint32_t prefix_length);
+
+// Returns a string representation of MAC address given.
+BRILLO_EXPORT std::string MacAddressToString(const MacAddress& addr);
+
+BRILLO_EXPORT bool FindFirstIPv6Address(const std::string& ifname,
+ struct in6_addr* address);
+
+BRILLO_EXPORT bool GenerateRandomIPv6Prefix(struct in6_addr* prefix, int len);
+
+BRILLO_EXPORT void SetSockaddrIn(struct sockaddr* sockaddr, uint32_t addr);
+
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct in_addr& addr);
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct in6_addr& addr);
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct sockaddr& addr);
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct sockaddr_storage& addr);
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct sockaddr_in& addr);
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct sockaddr_in6& addr);
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct sockaddr_un& addr);
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct sockaddr_vm& addr);
+
+BRILLO_EXPORT std::ostream& operator<<(std::ostream& stream,
+ const struct rtentry& route);
+
+// Fold 32-bit into 16 bits.
+BRILLO_EXPORT uint16_t FoldChecksum(uint32_t sum);
+
+// RFC 1071: We are doing calculation directly in network order.
+// Note this algorithm works regardless of the endianness of the host.
+BRILLO_EXPORT uint32_t NetChecksum(const void* data, ssize_t len);
+
+BRILLO_EXPORT uint16_t Ipv4Checksum(const iphdr* ip);
+
+// UDPv4 checksum along with IPv4 pseudo-header is defined in RFC 793,
+// Section 3.1.
+BRILLO_EXPORT uint16_t Udpv4Checksum(const iphdr* ip, const udphdr* udp);
+
+// ICMPv6 checksum is defined in RFC 8200 Section 8.1
+BRILLO_EXPORT uint16_t Icmpv6Checksum(const ip6_hdr* ip6,
+ const icmp6_hdr* icmp6);
+
+} // namespace patchpanel
+
+#endif // PATCHPANEL_NET_UTIL_H_