[RFCLAT#2] Move the packet socket creation from clatd to netd

This is a preparation for reducing the clatd required capability.

Function change:
- Opening packet socket in open_sockets() is moved to ClatdController
- remove open_sockets()

Argument change:
-r [read socket descriptor number]

Bug: 212345928
Test: manual test
1. Connect to ipv6-only wifi.
2. Try IPv4 traffic.
   $ ping 8.8.8.8

Change-Id: I912a4663dad101a4bcba30934340862572aa9318
diff --git a/clatd.c b/clatd.c
index 4a34bf3..6a0a0d8 100644
--- a/clatd.c
+++ b/clatd.c
@@ -177,21 +177,6 @@
   set_capability(0);
 }
 
-/* function: open_sockets
- * opens a packet socket to receive IPv6 packets and a raw socket to send them
- *   tunnel - tun device data
- *   mark - the socket mark to use for the sending raw socket
- */
-void open_sockets(struct tun_data *tunnel) {
-  // Will eventually be bound to htons(ETH_P_IPV6) protocol,
-  // but only after appropriate bpf filter is attached.
-  tunnel->read_fd6 = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
-  if (tunnel->read_fd6 < 0) {
-    logmsg(ANDROID_LOG_FATAL, "packet socket failed: %s", strerror(errno));
-    exit(1);
-  }
-}
-
 int ipv6_address_changed(const char *interface) {
   union anyip *interface_ip;
 
diff --git a/clatd.h b/clatd.h
index 6907829..21f3c95 100644
--- a/clatd.h
+++ b/clatd.h
@@ -41,7 +41,6 @@
 void configure_tun_ip(const struct tun_data *tunnel, const char *v4_addr, int mtu);
 void set_capability(uint64_t target_cap);
 void drop_root_and_caps();
-void open_sockets(struct tun_data *tunnel);
 int ipv6_address_changed(const char *interface);
 int configure_clat_ipv6_address(const struct tun_data *tunnel, const char *interface,
                                 const char *src_addr);
diff --git a/main.c b/main.c
index e4f7356..96fbd0d 100644
--- a/main.c
+++ b/main.c
@@ -51,6 +51,7 @@
   printf("-6 [IPv6 address]\n");
   printf("-m [socket mark]\n");
   printf("-t [tun file descriptor number]\n");
+  printf("-r [read socket descriptor number]\n");
   printf("-w [write socket descriptor number]\n");
 }
 
@@ -61,11 +62,12 @@
   struct tun_data tunnel;
   int opt;
   char *uplink_interface = NULL, *plat_prefix = NULL, *mark_str = NULL;
-  char *v4_addr = NULL, *v6_addr = NULL, *tunfd_str = NULL, *write_sock_str = NULL;
+  char *v4_addr = NULL, *v6_addr = NULL, *tunfd_str = NULL, *read_sock_str = NULL,
+       *write_sock_str = NULL;
   uint32_t mark   = MARK_UNSET;
   unsigned len;
 
-  while ((opt = getopt(argc, argv, "i:p:4:6:m:t:w:h")) != -1) {
+  while ((opt = getopt(argc, argv, "i:p:4:6:m:t:r:w:h")) != -1) {
     switch (opt) {
       case 'i':
         uplink_interface = optarg;
@@ -85,6 +87,9 @@
       case 't':
         tunfd_str = optarg;
         break;
+      case 'r':
+        read_sock_str = optarg;
+        break;
       case 'w':
         write_sock_str = optarg;
         break;
@@ -116,6 +121,15 @@
     exit(1);
   }
 
+  if (read_sock_str != NULL && !parse_int(read_sock_str, &tunnel.read_fd6)) {
+    logmsg(ANDROID_LOG_FATAL, "invalid sock_write %s", read_sock_str);
+    exit(1);
+  }
+  if (!tunnel.read_fd6) {
+    logmsg(ANDROID_LOG_FATAL, "no read_fd6 specified on commandline.");
+    exit(1);
+  }
+
   if (write_sock_str != NULL && !parse_int(write_sock_str, &tunnel.write_fd6)) {
     logmsg(ANDROID_LOG_FATAL, "invalid sock_write %s", write_sock_str);
     exit(1);
@@ -136,9 +150,6 @@
          plat_prefix ? plat_prefix : "(none)", v4_addr ? v4_addr : "(none)",
          v6_addr ? v6_addr : "(none)");
 
-  // open our raw sockets before dropping privs
-  open_sockets(&tunnel);
-
   configure_interface(uplink_interface, plat_prefix, v4_addr, v6_addr, &tunnel, mark);
 
   // run under a regular user with no capabilities