+# system provided modules
+import os, string, time, socket
+
+# PlanetLab system modules
+import sioc, plnet
+
+# local modules
+import bwlimit, logger, iptables, tools
+
+dev_default = tools.get_default_if()
+
+def start(options, conf):
+ logger.log("net plugin starting up...")
+
+def GetSlivers(data, config, plc):
+ logger.verbose("net:GetSlivers called.")
+ InitInterfaces(plc, data) # writes sysconfig files.
+ if 'OVERRIDES' in dir(config):
+ if config.OVERRIDES.get('net_max_rate') == '-1':
+ logger.log("net: Slice and node BW Limits disabled.")
+ if len(bwlimit.tc("class show dev %s" % dev_default)):
+ logger.verbose("*** DISABLING NODE BW LIMITS ***")
+ bwlimit.stop()
+ else:
+ InitNodeLimit(data)
+ InitI2(plc, data)
+ else:
+ InitNodeLimit(data)
+ InitI2(plc, data)
+ InitNAT(plc, data)
+
+
+def InitNodeLimit(data):
+ if not 'networks' in data: return
+
+ # query running network interfaces
+ devs = sioc.gifconf()
+ ips = dict(zip(devs.values(), devs.keys()))
+ macs = {}
+ for dev in devs:
+ macs[sioc.gifhwaddr(dev).lower()] = dev
+
+ for network in data['networks']:
+ # Get interface name preferably from MAC address, falling
+ # back on IP address.
+ hwaddr=network['mac']
+ if hwaddr <> None: hwaddr=hwaddr.lower()
+ if hwaddr in macs:
+ dev = macs[network['mac']]
+ elif network['ip'] in ips:
+ dev = ips[network['ip']]
+ else:
+ logger.log('%s: no such interface with address %s/%s' % (network['hostname'], network['ip'], network['mac']))
+ continue
+
+ # Get current node cap
+ try:
+ old_bwlimit = bwlimit.get_bwcap(dev)
+ except:
+ old_bwlimit = None
+
+ # Get desired node cap
+ if network['bwlimit'] is None or network['bwlimit'] < 0:
+ new_bwlimit = bwlimit.bwmax
+ else:
+ new_bwlimit = network['bwlimit']