Add tests for unset output marks on floating policies

This change adds tests to ensure backwards compatibility of floating
policies with no output mark set, ensuring that they are still routed
correctly (over the default network) in mark-based routing schemes.

Bug: 122236988
Test: Ran on common-4.9, passing
Change-Id: I49d291ad5b6a51bc4556643c96e37885c49dce5d
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")