Snap for 8701348 from 37c2a2caaa15d0fe529ad633bfb99e4730ee949b to mainline-uwb-release

Change-Id: Iebcd592722ea322c1c246688d8487b70ea32cb32
diff --git a/net/test/namespace.py b/net/test/namespace.py
index c8f8f46..3c0a0c1 100644
--- a/net/test/namespace.py
+++ b/net/test/namespace.py
@@ -18,6 +18,7 @@
 
 import ctypes
 import ctypes.util
+import errno
 import os
 import socket
 import sys
@@ -128,6 +129,12 @@
 
   sys.stdout.write('Creating clean namespace... ')
 
+  # sysctl only present on 4.14 and earlier Android kernels
+  if net_test.LINUX_VERSION < (4, 15, 0):
+    TCP_DEFAULT_INIT_RWND = "/proc/sys/net/ipv4/tcp_default_init_rwnd"
+    # In root netns this will succeed
+    init_rwnd_sysctl = open(TCP_DEFAULT_INIT_RWND, "w")
+
   try:
     UnShare(CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWNET)
   except OSError as err:
@@ -148,6 +155,26 @@
     # We've already transitioned into the new netns -- it's too late to recover.
     raise
 
+  if net_test.LINUX_VERSION < (4, 15, 0):
+    # In non-root netns this open might fail due to non-namespace-ified sysctl
+    # ie. lack of kernel commit:
+    #    https://android-review.googlesource.com/c/kernel/common/+/1312623
+    #    ANDROID: namespace'ify tcp_default_init_rwnd implementation
+    try:
+      init_rwnd_sysctl = open(TCP_DEFAULT_INIT_RWND, "w")
+    except IOError as e:
+      if e.errno != errno.ENOENT:
+        raise
+      # Note! if the netns open above succeeded (and thus we don't reach here)
+      # then we don't need to actually update the sysctl, since we'll be able to do
+      # that in the sock_diag_test.py TcpRcvWindowTest test case setUp() call instead.
+      #
+      # As such this write here is *still* to the root netns sysctl
+      # (because we obtained a file descriptor *prior* to unshare/etc...)
+      # and handles the case where the sysctl is not namespace aware and thus
+      # affects the entire system.
+      init_rwnd_sysctl.write("60");
+
   print('succeeded.')
   return True
 
diff --git a/net/test/run_net_test.sh b/net/test/run_net_test.sh
index 9dca4fe..1bf876d 100755
--- a/net/test/run_net_test.sh
+++ b/net/test/run_net_test.sh
@@ -2,7 +2,7 @@
 
 # Builds mysteriously fail if stdout is non-blocking.
 fixup_ptys() {
-  python << 'EOF'
+  python3 << 'EOF'
 import fcntl, os, sys
 fd = sys.stdout.fileno()
 flags = fcntl.fcntl(fd, fcntl.F_GETFL)
diff --git a/net/test/sock_diag_test.py b/net/test/sock_diag_test.py
index 39ace4c..beda5e4 100755
--- a/net/test/sock_diag_test.py
+++ b/net/test/sock_diag_test.py
@@ -562,7 +562,23 @@
       self.assertRaisesErrno(ENOENT, open, self.TCP_DEFAULT_INIT_RWND, "w")
       return
 
-    f = open(self.TCP_DEFAULT_INIT_RWND, "w")
+    try:
+      f = open(self.TCP_DEFAULT_INIT_RWND, "w")
+    except IOError as e:
+      # sysctl was namespace-ified on May 25, 2020 in android-4.14-stable [R]
+      # just after 4.14.181 by:
+      #   https://android-review.googlesource.com/c/kernel/common/+/1312623
+      #   ANDROID: namespace'ify tcp_default_init_rwnd implementation
+      # But that commit might be missing in Q era kernels even when > 4.14.181
+      # when running T vts.
+      if net_test.LINUX_VERSION >= (4, 15, 0):
+        raise
+      if e.errno != ENOENT:
+        raise
+      # we rely on the network namespace creation code
+      # modifying the root netns sysctl before the namespace is even created
+      return
+
     f.write("60")
 
   def checkInitRwndSize(self, version, netid):