summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2022-11-24 14:09:30 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-11-24 14:09:30 +0000
commitede6f88553bb58a54618332aebcc361c82b00416 (patch)
tree737b0f312a7e0989d96e899164ac0376ac82f635
parent637b5cc495c7977ab01fdc3975f12859a87e8f79 (diff)
parentad7a79fd6a78760e95e01336a6ab870d20bbcf4d (diff)
downloadtests-main-16k.tar.gz
Better/more explicit support for nested attributes. am: ad7a79fd6amain-16k
Original change: https://android-review.googlesource.com/c/kernel/tests/+/2316958 Change-Id: Ie759f9744f878a4b5d18f4a1cd286756cf8e0c44 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rwxr-xr-xnet/test/genetlink.py3
-rw-r--r--net/test/iproute.py27
-rw-r--r--net/test/netlink.py11
-rwxr-xr-xnet/test/sock_diag.py2
-rwxr-xr-xnet/test/tcp_metrics.py2
-rwxr-xr-xnet/test/xfrm.py2
6 files changed, 22 insertions, 25 deletions
diff --git a/net/test/genetlink.py b/net/test/genetlink.py
index 6234677..aa46726 100755
--- a/net/test/genetlink.py
+++ b/net/test/genetlink.py
@@ -75,6 +75,7 @@ class GenericNetlinkControl(GenericNetlink):
def _DecodeOps(self, data):
ops = []
Op = collections.namedtuple("Op", ["id", "flags"])
+ # TODO: call _ParseAttributes on the nested data instead of manual parsing.
while data:
# Skip the nest marker.
datalen, index, data = data[:2], data[2:4], data[4:]
@@ -92,7 +93,7 @@ class GenericNetlinkControl(GenericNetlink):
ops.append(Op(op_id, op_flags))
return ops
- def _Decode(self, command, msg, nla_type, nla_data):
+ def _Decode(self, command, msg, nla_type, nla_data, nested):
"""Decodes generic netlink control attributes to human-readable format."""
name = self._GetConstantName(__name__, nla_type, "CTRL_ATTR_")
diff --git a/net/test/iproute.py b/net/test/iproute.py
index 313efc9..4483d93 100644
--- a/net/test/iproute.py
+++ b/net/test/iproute.py
@@ -264,7 +264,7 @@ class IPRoute(netlink.NetlinkSocket):
def _GetConstantName(self, value, prefix):
return super(IPRoute, self)._GetConstantName(__name__, value, prefix)
- def _Decode(self, command, msg, nla_type, nla_data, nested=0):
+ def _Decode(self, command, msg, nla_type, nla_data, nested):
"""Decodes netlink attributes to Python types.
Values for which the code knows the type (e.g., the fwmark ID in a
@@ -278,13 +278,11 @@ class IPRoute(netlink.NetlinkSocket):
RTM_NEWROUTE command, attribute type 3 is the incoming interface and
is an integer, but for a RTM_NEWRULE command, attribute type 3 is the
incoming interface name and is a string.
- - If negative, one of the following (negative) values:
- - RTA_METRICS: Interpret as nested route metrics.
- - IFLA_LINKINFO: Nested interface information.
family: The address family. Used to convert IP addresses into strings.
nla_type: An integer, then netlink attribute type.
nla_data: A byte string, the netlink attribute data.
- nested: An integer, how deep we're currently nested.
+ nested: A list, outermost first, of each of the attributes the NLAttrs are
+ nested inside. Empty for non-nested attributes.
Returns:
A tuple (name, data):
@@ -295,11 +293,12 @@ class IPRoute(netlink.NetlinkSocket):
(e.g., RTACacheinfo), etc. If we didn't understand the attribute, it
will be the raw byte string.
"""
- if command == -RTA_METRICS:
+ lastnested = nested[-1] if nested else None
+ if lastnested == "RTA_METRICS":
name = self._GetConstantName(nla_type, "RTAX_")
- elif command == -IFLA_LINKINFO:
+ elif lastnested == "IFLA_LINKINFO":
name = self._GetConstantName(nla_type, "IFLA_INFO_")
- elif command == -IFLA_INFO_DATA:
+ elif lastnested == "IFLA_INFO_DATA":
name = self._GetConstantName(nla_type, "IFLA_VTI_")
elif CommandSubject(command) == "ADDR":
name = self._GetConstantName(nla_type, "IFA_")
@@ -335,12 +334,8 @@ class IPRoute(netlink.NetlinkSocket):
elif name in ["FRA_IIFNAME", "FRA_OIFNAME", "IFLA_IFNAME", "IFLA_QDISC",
"IFA_LABEL", "IFLA_INFO_KIND"]:
data = nla_data.strip(b"\x00")
- elif name == "RTA_METRICS":
- 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 in ["RTA_METRICS", "IFLA_LINKINFO", "IFLA_INFO_DATA"]:
+ data = self._ParseAttributes(command, None, nla_data, nested + [name])
elif name == "RTA_CACHEINFO":
data = RTACacheinfo(nla_data)
elif name == "IFA_CACHEINFO":
@@ -694,13 +689,13 @@ class IPRoute(netlink.NetlinkSocket):
def GetIfaceStats(self, dev_name):
"""Returns an RtnlLinkStats64 stats object for the specified interface."""
_, attrs = self.GetIfinfo(dev_name)
- attrs = self._ParseAttributes(RTM_NEWLINK, IfinfoMsg, attrs)
+ attrs = self._ParseAttributes(RTM_NEWLINK, IfinfoMsg, attrs, [])
return attrs["IFLA_STATS64"]
def GetIfinfoData(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)
+ attrs = self._ParseAttributes(RTM_NEWLINK, IfinfoMsg, attrs, [])
return attrs["IFLA_LINKINFO"]["IFLA_INFO_DATA"]
def GetRxTxPackets(self, dev_name):
diff --git a/net/test/netlink.py b/net/test/netlink.py
index 9821091..ae3b885 100644
--- a/net/test/netlink.py
+++ b/net/test/netlink.py
@@ -118,7 +118,7 @@ class NetlinkSocket(object):
return name
return value
- def _Decode(self, command, msg, nla_type, nla_data):
+ def _Decode(self, command, msg, nla_type, nla_data, nested):
"""No-op, nonspecific version of decode."""
return nla_type, nla_data
@@ -133,7 +133,7 @@ class NetlinkSocket(object):
return nla, nla_data, data
- def _ParseAttributes(self, command, msg, data, nested=0):
+ def _ParseAttributes(self, command, msg, data, nested):
"""Parses and decodes netlink attributes.
Takes a block of NLAttr data structures, decodes them using Decode, and
@@ -143,7 +143,8 @@ class NetlinkSocket(object):
command: An integer, the rtnetlink command being carried out.
msg: A Struct, the type of the data after the netlink header.
data: A byte string containing a sequence of NLAttr data structures.
- nested: An integer, how deep we're currently nested.
+ nested: A list, outermost first, of each of the attributes the NLAttrs are
+ nested inside. Empty for non-nested attributes.
Returns:
A dictionary mapping attribute types (integers) to decoded values.
@@ -156,7 +157,7 @@ class NetlinkSocket(object):
nla, nla_data, data = self._ReadNlAttr(data)
# If it's an attribute we know about, try to decode it.
- nla_name, nla_data = self._Decode(command, msg, nla.nla_type, nla_data)
+ nla_name, nla_data = self._Decode(command, msg, nla.nla_type, nla_data, nested)
if nla_name in attributes and nla_name not in DUP_ATTRS_OK:
raise ValueError("Duplicate attribute %s" % nla_name)
@@ -241,7 +242,7 @@ class NetlinkSocket(object):
# Parse the attributes in the nlmsg.
attrlen = nlmsghdr.length - len(nlmsghdr) - len(nlmsg)
- attributes = self._ParseAttributes(nlmsghdr.type, nlmsg, data[:attrlen])
+ attributes = self._ParseAttributes(nlmsghdr.type, nlmsg, data[:attrlen], [])
data = data[attrlen:]
return (nlmsg, attributes), data
diff --git a/net/test/sock_diag.py b/net/test/sock_diag.py
index 30752ba..924d652 100755
--- a/net/test/sock_diag.py
+++ b/net/test/sock_diag.py
@@ -117,7 +117,7 @@ class SockDiag(netlink.NetlinkSocket):
def __init__(self):
super(SockDiag, self).__init__(netlink.NETLINK_SOCK_DIAG)
- def _Decode(self, command, msg, nla_type, nla_data):
+ def _Decode(self, command, msg, nla_type, nla_data, nested):
"""Decodes netlink attributes to Python types."""
if msg.family == AF_INET or msg.family == AF_INET6:
if isinstance(msg, InetDiagReqV2):
diff --git a/net/test/tcp_metrics.py b/net/test/tcp_metrics.py
index c4e3d69..1076a55 100755
--- a/net/test/tcp_metrics.py
+++ b/net/test/tcp_metrics.py
@@ -62,7 +62,7 @@ class TcpMetrics(genetlink.GenericNetlink):
ctrl = genetlink.GenericNetlinkControl()
self.family = ctrl.GetFamily(TCP_METRICS_GENL_NAME)
- def _Decode(self, command, msg, nla_type, nla_data):
+ def _Decode(self, command, msg, nla_type, nla_data, nested):
"""Decodes TCP metrics netlink attributes to human-readable format."""
name = self._GetConstantName(__name__, nla_type, "TCP_METRICS_ATTR_")
diff --git a/net/test/xfrm.py b/net/test/xfrm.py
index 3cd1af9..d1e1871 100755
--- a/net/test/xfrm.py
+++ b/net/test/xfrm.py
@@ -368,7 +368,7 @@ class Xfrm(netlink.NetlinkSocket):
else:
print("%s" % cmdname)
- def _Decode(self, command, unused_msg, nla_type, nla_data):
+ def _Decode(self, command, unused_msg, nla_type, nla_data, nested):
"""Decodes netlink attributes to Python types."""
name = self._GetConstantName(nla_type, "XFRMA_")