clat: enable PACKET_AUXDATA cmsg processing

Test: flashed on a bluejay, ping 1.1.1.1 via v4-wlan0 works
Bug: 259872525
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I1288ba354cd02ba68b88c1169481140a53d1fa12
diff --git a/clatd.c b/clatd.c
index be1a42c..7eb7904 100644
--- a/clatd.c
+++ b/clatd.c
@@ -78,8 +78,19 @@
 
 // reads L3 IPv6 packet from AF_PACKET socket, translates to IPv4, writes to tun
 void process_packet_6_to_4(struct tun_data *tunnel) {
+  char cmsg_buf[CMSG_SPACE(sizeof(struct tpacket_auxdata))];
   uint8_t buf[MAXMTU];
-  ssize_t readlen = read(tunnel->read_fd6, buf, MAXMTU);
+  struct iovec iov = {
+    .iov_base = buf,
+    .iov_len = MAXMTU,
+  };
+  struct msghdr msgh = {
+    .msg_iov = &iov,
+    .msg_iovlen = 1,
+    .msg_control = cmsg_buf,
+    .msg_controllen = sizeof(cmsg_buf),
+  };
+  ssize_t readlen = recvmsg(tunnel->read_fd6, &msgh, /*flags*/ 0);
 
   if (readlen < 0) {
     if (errno != EAGAIN) {
@@ -95,6 +106,21 @@
     return;
   }
 
+  __u32 tp_status = 0;
+
+  for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL; cmsg = CMSG_NXTHDR(&msgh,cmsg)) {
+    if (cmsg->cmsg_level == SOL_PACKET && cmsg->cmsg_type == PACKET_AUXDATA) {
+      struct tpacket_auxdata *aux = (struct tpacket_auxdata *)CMSG_DATA(cmsg);
+      tp_status = aux->tp_status;
+      break;
+    }
+  }
+
+  // This will detect a skb->ip_summed == CHECKSUM_PARTIAL packet with non-final L4 checksum
+  if (tp_status & TP_STATUS_CSUMNOTREADY) {
+    logmsg(ANDROID_LOG_WARN, "read_packet checksum not ready");
+  }
+
   translate_packet(tunnel->fd4, 0 /* to_ipv6 */, buf, readlen);
 }