Move the 464xlat control plane from clatd to netd.

Some of this code comes from clatd and will be deleted from there
once this topic is merged.

Bug: 65674744
Test: builds, boots
Test: system/netd/tests/runtests.sh
Change-Id: Ifa30652a853401a401d0b74d259d4d27d322e758
diff --git a/server/ClatdController.h b/server/ClatdController.h
index 7af6ac3..9f25d67 100644
--- a/server/ClatdController.h
+++ b/server/ClatdController.h
@@ -19,6 +19,13 @@
 
 #include <map>
 #include <mutex>
+#include <string>
+
+#include <linux/if.h>
+#include <netinet/in.h>
+
+#include "Fwmark.h"
+#include "NetdConstants.h"
 
 namespace android {
 namespace net {
@@ -30,15 +37,48 @@
     explicit ClatdController(NetworkController* controller);
     virtual ~ClatdController();
 
-    int startClatd(const char* interface);
-    int stopClatd(const char* interface);
+    int startClatd(const std::string& interface, const std::string& nat64Prefix,
+                   std::string* v6Addr);
+    int stopClatd(const std::string& interface);
 
     std::mutex mutex;
 
   private:
-    NetworkController* const mNetCtrl;
-    std::map<std::string, pid_t> mClatdPids;
-    pid_t getClatdPid(const char* interface);
+    struct ClatdTracker {
+        const NetworkController* netCtrl = nullptr;
+        pid_t pid = -1;
+        char iface[IFNAMSIZ];
+        Fwmark fwmark;
+        char fwmarkString[UINT32_STRLEN];
+        unsigned netId;
+        char netIdString[UINT32_STRLEN];
+        in_addr v4;
+        char v4Str[INET_ADDRSTRLEN];
+        in6_addr v6;
+        char v6Str[INET6_ADDRSTRLEN];
+        in6_addr dst;
+        char dstString[INET6_ADDRSTRLEN];
+
+        ClatdTracker() = default;
+        explicit ClatdTracker(const NetworkController* netCtrl) : netCtrl(netCtrl) {}
+
+        int init(const std::string& interface, const std::string& nat64Prefix);
+    };
+
+    const NetworkController* mNetCtrl;
+    std::map<std::string, ClatdTracker> mClatdTrackers;
+    ClatdTracker* getClatdTracker(const std::string& interface);
+
+    static in_addr_t selectIpv4Address(const in_addr ip, int16_t prefixlen);
+    static int generateIpv6Address(const char* iface, const in_addr v4, const in6_addr& nat64Prefix,
+                                   in6_addr* v6);
+    static void makeChecksumNeutral(in6_addr* v6, const in_addr v4, const in6_addr& nat64Prefix);
+
+    // For testing.
+    friend class ClatdControllerTest;
+
+    static bool (*isIpv4AddressFreeFunc)(in_addr_t);
+    static bool isIpv4AddressFree(in_addr_t addr);
 };
 
 }  // namespace net