diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2015-01-28 17:41:19 +0900 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2015-02-04 14:48:28 +0900 |
commit | b59db890cbeef305dca3508f059dbb499b18d33b (patch) | |
tree | 8ef2ae7790300fccfd9dc09d8e799c5ff3bdad2f /tests | |
parent | 6ecfaa16ea4d0785769a8fa625f162e5d4443ece (diff) | |
download | extras-b59db890cbeef305dca3508f059dbb499b18d33b.tar.gz |
Improvements to iproute.
1. Teach it about links.
2. Use decoded attribute names instead of raw attribute numbers
in debug output.
3. Add a function to decode netlink messages.
Change-Id: I3cb7581bac750e4784e7fbf5567d373ecc0cefdf
Diffstat (limited to 'tests')
-rw-r--r-- | tests/net_test/iproute.py | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/tests/net_test/iproute.py b/tests/net_test/iproute.py index 0ac7222c..1060fb7c 100644 --- a/tests/net_test/iproute.py +++ b/tests/net_test/iproute.py @@ -53,6 +53,9 @@ NLA_ALIGNTO = 4 ### rtnetlink constants. See include/uapi/linux/rtnetlink.h. # Message types. +RTM_NEWLINK = 16 +RTM_DELLINK = 17 +RTM_GETLINK = 18 RTM_NEWADDR = 20 RTM_DELADDR = 21 RTM_GETADDR = 22 @@ -98,6 +101,8 @@ RTA_UID = 18 RTAX_MTU = 2 # Data structure formats. +IfinfoMsg = cstruct.Struct( + "IfinfoMsg", "=BBHiII", "family pad type index flags change") RTMsg = cstruct.Struct( "RTMsg", "=BBBBBBBBI", "family dst_len src_len tos table protocol scope type flags") @@ -147,12 +152,33 @@ NdMsg = cstruct.Struct( ### FIB rule constants. See include/uapi/linux/fib_rules.h. FRA_PRIORITY = 6 FRA_FWMARK = 10 +FRA_SUPPRESS_PREFIXLEN = 14 FRA_TABLE = 15 FRA_OIFNAME = 17 FRA_UID_START = 18 FRA_UID_END = 19 +# Link constants. See include/uapi/linux/if_link.h. +IFLA_ADDRESS = 1 +IFLA_BROADCAST = 2 +IFLA_IFNAME = 3 +IFLA_MTU = 4 +IFLA_QDISC = 6 +IFLA_STATS = 7 +IFLA_TXQLEN = 13 +IFLA_MAP = 14 +IFLA_OPERSTATE = 16 +IFLA_LINKMODE = 17 +IFLA_STATS64 = 23 +IFLA_AF_SPEC = 26 +IFLA_GROUP = 27 +IFLA_EXT_MASK = 29 +IFLA_PROMISCUITY = 30 +IFLA_NUM_TX_QUEUES = 31 +IFLA_NUM_RX_QUEUES = 32 +IFLA_CARRIER = 33 + def CommandVerb(command): return ["NEW", "DEL", "GET", "SET"][command % 4] @@ -246,6 +272,8 @@ class IPRoute(object): name = self._GetConstantName(nla_type, "RTAX_") elif CommandSubject(command) == "ADDR": name = self._GetConstantName(nla_type, "IFA_") + elif CommandSubject(command) == "LINK": + name = self._GetConstantName(nla_type, "IFLA_") elif CommandSubject(command) == "RULE": name = self._GetConstantName(nla_type, "FRA_") elif CommandSubject(command) == "ROUTE": @@ -258,13 +286,20 @@ class IPRoute(object): if name in ["FRA_PRIORITY", "FRA_FWMARK", "FRA_TABLE", "FRA_UID_START", "FRA_UID_END", - "RTA_OIF", "RTA_PRIORITY", "RTA_TABLE", "RTA_MARK"]: + "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"]: 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"]: + data = ord(nla_data) 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) - elif name in ["FRA_IIFNAME", "FRA_OIFNAME"]: + 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, nla_data) @@ -272,7 +307,7 @@ class IPRoute(object): data = RTACacheinfo(nla_data) elif name == "IFA_CACHEINFO": data = IFACacheinfo(nla_data) - elif name == "NDA_LLADDR": + elif name in ["NDA_LLADDR", "IFLA_ADDRESS"]: data = ":".join(x.encode("hex") for x in nla_data) else: data = nla_data @@ -314,7 +349,7 @@ class IPRoute(object): raise ValueError("Duplicate attribute %d" % nla_name) attributes[nla_name] = nla_data - self._Debug(" %s" % str((nla, nla_data))) + self._Debug(" %s" % str((nla_name, nla_data))) return attributes @@ -479,6 +514,7 @@ class IPRoute(object): try: struct_type = { "ADDR": IfAddrMsg, + "LINK": IfinfoMsg, "NEIGH": NdMsg, "ROUTE": RTMsg, "RULE": RTMsg, @@ -488,6 +524,10 @@ class IPRoute(object): except KeyError: raise ValueError("Don't know how to print command type %s" % name) + def MaybeDebugMessage(self, message): + hdr = NLMsgHdr(message) + self.MaybeDebugCommand(hdr.type, message) + def _Dump(self, command, msg, msgtype): """Sends a dump request and returns a list of decoded messages.""" # Create a netlink dump request containing the msg. @@ -516,6 +556,10 @@ class IPRoute(object): rtmsg = RTMsg((family, 0, 0, 0, 0, 0, 0, 0, 0)) return self._Dump(RTM_GETRULE, rtmsg, RTMsg) + def DumpLinks(self): + ifinfomsg = IfinfoMsg((0, 0, 0, 0, 0, 0)) + return self._Dump(RTM_GETLINK, ifinfomsg, IfinfoMsg) + def _Address(self, version, command, addr, prefixlen, flags, scope, ifindex): """Adds or deletes an IP address.""" family = self._AddressFamily(version) @@ -620,4 +664,5 @@ if __name__ == "__main__": iproute = IPRoute() iproute.DEBUG = True iproute.DumpRules(6) + iproute.DumpLinks() print iproute.GetRoutes("2001:4860:4860::8888", 0, 0, None) |