summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2016-01-14 16:15:24 +0900
committerLorenzo Colitti <lorenzo@google.com>2016-01-14 20:20:10 +0900
commitae33e4e34ae1863e9ab7e3416299c06dc526b902 (patch)
tree000e0c7ca163c9fe98a0881ee4b2be888d4b8363
parent701a67bfa2a36dee90383ac23484bf2a762081fe (diff)
downloadextras-ae33e4e34ae1863e9ab7e3416299c06dc526b902.tar.gz
Make RTA_METRICS parsing work properly.
Currently, parsing RTA_METRICS attributes only works if the attributes only contain a single RTAX_MTU attribute, but not other attributes. This is because _ParseAttributes usually operates on netlink data structures, and thus takes a data structure (such as a RTMsg instance) as input. In the special case of the RTA_METRICS attribute, _Decode calls _ParseAttributes on a blob of nested attributes and not a data structure (which is correct), but incorrectly passes in a msg of "RTMsg", which is a data structure class, not an instance. The result is that _Decode throws an exception when reading msg.family. This was not never spotted before because _Decode had a special hack to parse RTAX_MTU and we never happened to parse a RTA_METRICS that contained anything else. Fix this by passing None into _ParseAttributes when we know that there is no message, and fetching msg.family in _ParseAttributes only when we know that the message is in fact a rtmsg. This allows us to merge the hack that parses RTAX_MTU with the code that parses the other arguments. Also, support RTAX_HOPLIMIT, which is the attribute which caused us to discover this problem. Change-Id: I1c396ab29850e6cff95d2e7327ef6d702a8046f7
-rw-r--r--tests/net_test/iproute.py14
1 files changed, 5 insertions, 9 deletions
diff --git a/tests/net_test/iproute.py b/tests/net_test/iproute.py
index 4f775281..2c639932 100644
--- a/tests/net_test/iproute.py
+++ b/tests/net_test/iproute.py
@@ -102,6 +102,7 @@ RTA_UID = 18
# Route metric attributes.
RTAX_MTU = 2
+RTAX_HOPLIMIT = 10
# Data structure formats.
IfinfoMsg = cstruct.Struct(
@@ -248,10 +249,6 @@ class IPRoute(netlink.NetlinkSocket):
will be the raw byte string.
"""
if command == -RTA_METRICS:
- if nla_type == RTAX_MTU:
- return ("RTAX_MTU", struct.unpack("=I", nla_data)[0])
-
- if command == -RTA_METRICS:
name = self._GetConstantName(nla_type, "RTAX_")
elif CommandSubject(command) == "ADDR":
name = self._GetConstantName(nla_type, "IFA_")
@@ -267,14 +264,13 @@ class IPRoute(netlink.NetlinkSocket):
# Don't know what this is. Leave it as an integer.
name = nla_type
- family = msg.family
-
if name in ["FRA_PRIORITY", "FRA_FWMARK", "FRA_TABLE", "FRA_FWMASK",
"FRA_UID_START", "FRA_UID_END",
"RTA_OIF", "RTA_PRIORITY", "RTA_TABLE", "RTA_MARK",
"IFLA_MTU", "IFLA_TXQLEN", "IFLA_GROUP", "IFLA_EXT_MASK",
"IFLA_PROMISCUITY", "IFLA_NUM_RX_QUEUES",
- "IFLA_NUM_TX_QUEUES", "NDA_PROBES"]:
+ "IFLA_NUM_TX_QUEUES", "NDA_PROBES", "RTAX_MTU",
+ "RTAX_HOPLIMIT"]:
data = struct.unpack("=I", nla_data)[0]
elif name == "FRA_SUPPRESS_PREFIXLEN":
data = struct.unpack("=i", nla_data)[0]
@@ -283,11 +279,11 @@ class IPRoute(netlink.NetlinkSocket):
elif name in ["IFA_ADDRESS", "IFA_LOCAL", "RTA_DST", "RTA_SRC",
"RTA_GATEWAY", "RTA_PREFSRC", "RTA_UID",
"NDA_DST"]:
- data = socket.inet_ntop(family, nla_data)
+ data = socket.inet_ntop(msg.family, nla_data)
elif name in ["FRA_IIFNAME", "FRA_OIFNAME", "IFLA_IFNAME", "IFLA_QDISC"]:
data = nla_data.strip("\x00")
elif name == "RTA_METRICS":
- data = self._ParseAttributes(-RTA_METRICS, family, RTMsg, nla_data)
+ data = self._ParseAttributes(-RTA_METRICS, msg.family, None, nla_data)
elif name == "RTA_CACHEINFO":
data = RTACacheinfo(nla_data)
elif name == "IFA_CACHEINFO":