DO NOT MERGE - Merge pi-dev@5234907 into stage-aosp-master

Bug: 120848293
Change-Id: Icc60878209e3b89a944cc4a7b228025d49e31ada
diff --git a/net/test/run_net_test.sh b/net/test/run_net_test.sh
index 17b44d9..a81ad33 100755
--- a/net/test/run_net_test.sh
+++ b/net/test/run_net_test.sh
@@ -306,9 +306,32 @@
     blockdevice=ubdar
   fi
 
+  exitcode=0
   $KERNEL_BINARY >&2 umid=net_test mem=512M \
-    $blockdevice=$SCRIPT_DIR/$ROOTFS $netconfig $consolemode $cmdline
-  exitcode=$?
+    $blockdevice=$SCRIPT_DIR/$ROOTFS $netconfig $consolemode $cmdline \
+  || exitcode=$?
+
+  # UML is kind of crazy in how guest syscalls work.  It requires host kernel
+  # to not be in vsyscall=none mode.
+  if [[ "${exitcode}" != '0' ]]; then
+    {
+      # Hopefully one of these exists
+      cat /proc/config || :
+      zcat /proc/config.gz || :
+      cat "/boot/config-$(uname -r)" || :
+      zcat "/boot/config-$(uname -r).gz" || :
+    } 2>/dev/null \
+    | egrep -q '^CONFIG_LEGACY_VSYSCALL_NONE=y' \
+    && ! egrep -q '(^| )vsyscall=(native|emulate)( |$)' /proc/cmdline \
+    && {
+      echo '-----=====-----'
+      echo 'If above you saw a "net_test.sh[1]: segfault at ..." followed by'
+      echo '"Kernel panic - not syncing: Attempted to kill init!" then please'
+      echo 'set "vsyscall=emulate" on *host* kernel command line.'
+      echo '(for example via GRUB_CMDLINE_LINUX in /etc/default/grub)'
+      echo '-----=====-----'
+    }
+  fi
 else
   # We boot into the filesystem image directly in all cases
   cmdline="$cmdline root=/dev/vda"
diff --git a/net/test/xfrm_tunnel_test.py b/net/test/xfrm_tunnel_test.py
index bf32ffc..eb1a46e 100755
--- a/net/test/xfrm_tunnel_test.py
+++ b/net/test/xfrm_tunnel_test.py
@@ -172,7 +172,8 @@
     self.assertEquals(net_test.UDP_PAYLOAD, data)
     self.assertEquals((remote_inner, _TEST_REMOTE_PORT), src[:2])
 
-  def _TestTunnel(self, inner_version, outer_version, func, direction):
+  def _TestTunnel(self, inner_version, outer_version, func, direction,
+                  test_output_mark_unset):
     """Test a unidirectional XFRM Tunnel with explicit selectors"""
     # Select the underlying netid, which represents the external
     # interface from/to which to route ESP packets.
@@ -186,33 +187,46 @@
     local_outer = self.MyAddress(outer_version, u_netid)
     remote_outer = _GetRemoteOuterAddress(outer_version)
 
-    # Create input/ouput SPs, SAs and sockets to simulate a more realistic
-    # environment.
-    self.xfrm.CreateTunnel(
-        xfrm.XFRM_POLICY_IN, xfrm.SrcDstSelector(remote_inner, local_inner),
-        remote_outer, local_outer, _TEST_IN_SPI, xfrm_base._ALGO_CRYPT_NULL,
-        xfrm_base._ALGO_AUTH_NULL, None, None, None, xfrm.MATCH_METHOD_ALL)
+    output_mark = u_netid
+    if test_output_mark_unset:
+      output_mark = None
+      self.SetDefaultNetwork(u_netid)
 
-    self.xfrm.CreateTunnel(
-        xfrm.XFRM_POLICY_OUT, xfrm.SrcDstSelector(local_inner, remote_inner),
-        local_outer, remote_outer, _TEST_OUT_SPI, xfrm_base._ALGO_CBC_AES_256,
-        xfrm_base._ALGO_HMAC_SHA1, None, u_netid, None, xfrm.MATCH_METHOD_ALL)
+    try:
+      # Create input/ouput SPs, SAs and sockets to simulate a more realistic
+      # environment.
+      self.xfrm.CreateTunnel(
+          xfrm.XFRM_POLICY_IN, xfrm.SrcDstSelector(remote_inner, local_inner),
+          remote_outer, local_outer, _TEST_IN_SPI, xfrm_base._ALGO_CRYPT_NULL,
+          xfrm_base._ALGO_AUTH_NULL, None, None, None, xfrm.MATCH_METHOD_ALL)
 
-    write_sock = socket(net_test.GetAddressFamily(inner_version), SOCK_DGRAM, 0)
-    self.SelectInterface(write_sock, netid, "mark")
-    read_sock, _ = _CreateReceiveSock(inner_version)
+      self.xfrm.CreateTunnel(
+          xfrm.XFRM_POLICY_OUT, xfrm.SrcDstSelector(local_inner, remote_inner),
+          local_outer, remote_outer, _TEST_OUT_SPI, xfrm_base._ALGO_CBC_AES_256,
+          xfrm_base._ALGO_HMAC_SHA1, None, output_mark, None, xfrm.MATCH_METHOD_ALL)
 
-    sock = write_sock if direction == xfrm.XFRM_POLICY_OUT else read_sock
-    func(inner_version, outer_version, u_netid, netid, local_inner,
-         remote_inner, local_outer, remote_outer, sock)
+      write_sock = socket(net_test.GetAddressFamily(inner_version), SOCK_DGRAM, 0)
+      self.SelectInterface(write_sock, netid, "mark")
+      read_sock, _ = _CreateReceiveSock(inner_version)
+
+      sock = write_sock if direction == xfrm.XFRM_POLICY_OUT else read_sock
+      func(inner_version, outer_version, u_netid, netid, local_inner,
+          remote_inner, local_outer, remote_outer, sock)
+    finally:
+      if test_output_mark_unset:
+        self.ClearDefaultNetwork()
 
   def ParamTestTunnelInput(self, inner_version, outer_version):
     self._TestTunnel(inner_version, outer_version, self._CheckTunnelInput,
-                     xfrm.XFRM_POLICY_IN)
+                     xfrm.XFRM_POLICY_IN, False)
 
   def ParamTestTunnelOutput(self, inner_version, outer_version):
     self._TestTunnel(inner_version, outer_version, self._CheckTunnelOutput,
-                     xfrm.XFRM_POLICY_OUT)
+                     xfrm.XFRM_POLICY_OUT, False)
+
+  def ParamTestTunnelOutputNoSetMark(self, inner_version, outer_version):
+    self._TestTunnel(inner_version, outer_version, self._CheckTunnelOutput,
+                     xfrm.XFRM_POLICY_OUT, True)
 
 
 @unittest.skipUnless(net_test.LINUX_VERSION >= (3, 18, 0), "VTI Unsupported")