ovs-test: A new tool that allows to diagnose connectivity and performance issues
[sliver-openvswitch.git] / python / ovstest / util.py
diff --git a/python/ovstest/util.py b/python/ovstest/util.py
new file mode 100644 (file)
index 0000000..3321e69
--- /dev/null
@@ -0,0 +1,74 @@
+# Copyright (c) 2011 Nicira Networks
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+util module contains some helper function
+"""
+import socket, struct, fcntl, array, os, subprocess, exceptions
+
+def str_ip(ip):
+    (x1, x2, x3, x4) = struct.unpack("BBBB", ip)
+    return ("%u.%u.%u.%u") % (x1, x2, x3, x4)
+
+def get_interface_mtu(iface):
+    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    indata = iface + ('\0' * (32 - len(iface)))
+    try:
+        outdata = fcntl.ioctl(s.fileno(), 0x8921, indata) #  socket.SIOCGIFMTU
+        mtu = struct.unpack("16si12x", outdata)[1]
+    except:
+        return 0
+
+    return mtu
+
+def get_interface(address):
+    """
+    Finds first interface that has given address
+    """
+    bytes = 256 * 32
+    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    names = array.array('B', '\0' * bytes)
+    outbytes = struct.unpack('iL', fcntl.ioctl(
+        s.fileno(),
+        0x8912, # SIOCGIFCONF
+        struct.pack('iL', bytes, names.buffer_info()[0])
+    ))[0]
+    namestr = names.tostring()
+
+    for i in range(0, outbytes, 40):
+        name = namestr[i:i + 16].split('\0', 1)[0]
+        if address == str_ip(namestr[i + 20:i + 24]):
+            return name
+    return "" #  did not find interface we were looking for
+
+def uname():
+    os_info = os.uname()
+    return os_info[2] #return only the kernel version number
+
+def get_driver(iface):
+    try:
+        p = subprocess.Popen(
+            ["ethtool", "-i", iface],
+            stdin = subprocess.PIPE,
+            stdout = subprocess.PIPE,
+            stderr = subprocess.PIPE)
+        out, err = p.communicate()
+        if p.returncode == 0:
+            lines = out.split("\n")
+            driver = "%s(%s)" % (lines[0], lines[1]) #driver name + version
+        else:
+            driver = "no support for ethtool"
+    except exceptions.OSError:
+        driver = ""
+    return driver