summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2018-04-06 19:17:31 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-04-06 19:17:31 +0000
commitb412bdb6d2d181cf6151d30c14b7c78c7ee64307 (patch)
treea95b753bad1732e511cffce4960ee8c684c3eb59
parent5d59332e11fa451f22bb3d07f5d5a372b8679195 (diff)
parentfc05022fdd63fde5648c2d03147f3a7fa48ac9db (diff)
downloadtests-b412bdb6d2d181cf6151d30c14b7c78c7ee64307.tar.gz
Merge "Verify VTI Modification using RTM_NEWLINK" into pi-dev
-rw-r--r--net/test/iproute.py30
-rwxr-xr-xnet/test/xfrm_tunnel_test.py26
2 files changed, 49 insertions, 7 deletions
diff --git a/net/test/iproute.py b/net/test/iproute.py
index 19b1e26..9cfafc6 100644
--- a/net/test/iproute.py
+++ b/net/test/iproute.py
@@ -282,6 +282,8 @@ class IPRoute(netlink.NetlinkSocket):
name = self._GetConstantName(nla_type, "RTAX_")
elif command == -IFLA_LINKINFO:
name = self._GetConstantName(nla_type, "IFLA_INFO_")
+ elif command == -IFLA_INFO_DATA:
+ name = self._GetConstantName(nla_type, "IFLA_VTI_")
elif CommandSubject(command) == "ADDR":
name = self._GetConstantName(nla_type, "IFA_")
elif CommandSubject(command) == "LINK":
@@ -304,6 +306,8 @@ class IPRoute(netlink.NetlinkSocket):
"RTAX_HOPLIMIT", "IFLA_CARRIER_CHANGES", "IFLA_GSO_MAX_SEGS",
"IFLA_GSO_MAX_SIZE", "RTA_UID"]:
data = struct.unpack("=I", nla_data)[0]
+ elif name in ["IFLA_VTI_OKEY", "IFLA_VTI_IKEY"]:
+ data = struct.unpack("!I", nla_data)[0]
elif name == "FRA_SUPPRESS_PREFIXLEN":
data = struct.unpack("=i", nla_data)[0]
elif name in ["IFLA_LINKMODE", "IFLA_OPERSTATE", "IFLA_CARRIER"]:
@@ -318,6 +322,8 @@ class IPRoute(netlink.NetlinkSocket):
data = self._ParseAttributes(-RTA_METRICS, None, nla_data, nested + 1)
elif name == "IFLA_LINKINFO":
data = self._ParseAttributes(-IFLA_LINKINFO, None, nla_data, nested + 1)
+ elif name == "IFLA_INFO_DATA":
+ data = self._ParseAttributes(-IFLA_INFO_DATA, None, nla_data)
elif name == "RTA_CACHEINFO":
data = RTACacheinfo(nla_data)
elif name == "IFA_CACHEINFO":
@@ -350,8 +356,8 @@ class IPRoute(netlink.NetlinkSocket):
if CommandVerb(command) != "GET":
flags |= netlink.NLM_F_ACK
if CommandVerb(command) == "NEW":
- if not flags & netlink.NLM_F_REPLACE:
- flags |= (netlink.NLM_F_EXCL | netlink.NLM_F_CREATE)
+ if flags & (netlink.NLM_F_REPLACE | netlink.NLM_F_CREATE) == 0:
+ flags |= netlink.NLM_F_CREATE | netlink.NLM_F_EXCL
super(IPRoute, self)._SendNlRequest(command, data, flags)
@@ -640,8 +646,7 @@ class IPRoute(netlink.NetlinkSocket):
def DeleteLink(self, dev_name):
ifinfo = IfinfoMsg().Pack()
ifinfo += self._NlAttrStr(IFLA_IFNAME, dev_name)
- flags = netlink.NLM_F_REQUEST | netlink.NLM_F_ACK
- return self._SendNlRequest(RTM_DELLINK, ifinfo, flags)
+ return self._SendNlRequest(RTM_DELLINK, ifinfo)
def GetIfinfo(self, dev_name):
"""Fetches information about the specified interface.
@@ -654,7 +659,7 @@ class IPRoute(netlink.NetlinkSocket):
"""
ifinfo = IfinfoMsg().Pack()
ifinfo += self._NlAttrStr(IFLA_IFNAME, dev_name)
- self._SendNlRequest(RTM_GETLINK, ifinfo, netlink.NLM_F_REQUEST)
+ self._SendNlRequest(RTM_GETLINK, ifinfo)
hdr, data = cstruct.Read(self._Recv(), netlink.NLMsgHdr)
if hdr.type == RTM_NEWLINK:
return cstruct.Read(data, IfinfoMsg)
@@ -675,12 +680,18 @@ class IPRoute(netlink.NetlinkSocket):
attrs = self._ParseAttributes(RTM_NEWLINK, IfinfoMsg, attrs)
return attrs["IFLA_STATS64"]
+ def GetVtiInfoData(self, dev_name):
+ """Returns an IFLA_INFO_DATA dict object for the specified interface."""
+ _, attrs = self.GetIfinfo(dev_name)
+ attrs = self._ParseAttributes(RTM_NEWLINK, IfinfoMsg, attrs)
+ return attrs["IFLA_LINKINFO"]["IFLA_INFO_DATA"]
+
def GetRxTxPackets(self, dev_name):
stats = self.GetIfaceStats(dev_name)
return stats.rx_packets, stats.tx_packets
def CreateVirtualTunnelInterface(self, dev_name, local_addr, remote_addr,
- i_key=None, o_key=None):
+ i_key=None, o_key=None, is_update=False):
"""
Create a Virtual Tunnel Interface that provides a proxy interface
for IPsec tunnels.
@@ -725,7 +736,12 @@ class IPRoute(netlink.NetlinkSocket):
ifinfo += self._NlAttr(IFLA_LINKINFO, linkinfo)
- return self._SendNlRequest(RTM_NEWLINK, ifinfo)
+ # Always pass CREATE to prevent _SendNlRequest() from incorrectly
+ # guessing the flags.
+ flags = netlink.NLM_F_CREATE
+ if not is_update:
+ flags |= netlink.NLM_F_EXCL
+ return self._SendNlRequest(RTM_NEWLINK, ifinfo, flags)
if __name__ == "__main__":
diff --git a/net/test/xfrm_tunnel_test.py b/net/test/xfrm_tunnel_test.py
index 94e846e..ac340d9 100755
--- a/net/test/xfrm_tunnel_test.py
+++ b/net/test/xfrm_tunnel_test.py
@@ -106,6 +106,13 @@ class XfrmTunnelTest(xfrm_base.XfrmLazyTest):
@unittest.skipUnless(net_test.LINUX_VERSION >= (3, 18, 0), "VTI Unsupported")
class XfrmAddDeleteVtiTest(xfrm_base.XfrmBaseTest):
+ def verifyVtiInfoData(self, vti_info_data, version, local_addr, remote_addr, ikey, okey):
+ self.assertEquals(vti_info_data["IFLA_VTI_IKEY"], ikey)
+ self.assertEquals(vti_info_data["IFLA_VTI_OKEY"], okey)
+
+ family = AF_INET if version == 4 else AF_INET6
+ self.assertEquals(inet_ntop(family, vti_info_data["IFLA_VTI_LOCAL"]), local_addr)
+ self.assertEquals(inet_ntop(family, vti_info_data["IFLA_VTI_REMOTE"]), remote_addr)
def testAddVti(self):
"""Test the creation of a Virtual Tunnel Interface."""
@@ -118,6 +125,25 @@ class XfrmAddDeleteVtiTest(xfrm_base.XfrmBaseTest):
remote_addr=_GetRemoteOuterAddress(version),
o_key=_TEST_OKEY,
i_key=_TEST_IKEY)
+ self.verifyVtiInfoData(self.iproute.GetVtiInfoData(_VTI_IFNAME),
+ version, local_addr, _GetRemoteOuterAddress(version),
+ _TEST_IKEY, _TEST_OKEY)
+
+ new_remote_addr = {4: net_test.IPV4_ADDR2, 6: net_test.IPV6_ADDR2}
+ new_okey = _TEST_OKEY + _VTI_NETID
+ new_ikey = _TEST_IKEY + _VTI_NETID
+ self.iproute.CreateVirtualTunnelInterface(
+ dev_name=_VTI_IFNAME,
+ local_addr=local_addr,
+ remote_addr=new_remote_addr[version],
+ o_key=new_okey,
+ i_key=new_ikey,
+ is_update=True)
+
+ self.verifyVtiInfoData(self.iproute.GetVtiInfoData(_VTI_IFNAME),
+ version, local_addr, new_remote_addr[version],
+ new_ikey, new_okey)
+
if_index = self.iproute.GetIfIndex(_VTI_IFNAME)
# Validate that the netlink interface matches the ioctl interface.