+# 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