-#!/usr/bin/env python
# -*- coding: utf-8 -*-
from constants import TESTBED_ID
if self.node is None or self.node._node_id is None:
raise RuntimeError, "Cannot pick interface without an assigned node"
-
+
+ # HACK: SFA doesnt give the node_id!!
+ if not isinstance(self.node._node_id, int):
+ node_data = self._api.GetNodes(filters={'hostname':self.node.hostname}, fields=('node_id',))[0]
+ node_id = node_data['node_id']
+ else:
+ node_id = self.node._node_id
+
avail = self._api.GetInterfaces(
- node_id=self.node._node_id,
+ node_id=node_id,
is_primary=self.primary,
fields=('interface_id','mac','netmask','ip') )
self.tun_addr = addr
self.tun_port = port
self.tun_cipher = cipher
-
+
+ # Attributes
+ self.address = None
+ self.netprefix = None
+ self.netmask = None
+
# Cannot access cross peers
self.peer_proto_impl = None
self.up = None
self.mtu = None
self.snat = False
- self.txqueuelen = None
+ self.txqueuelen = 1000
self.pointopoint = None
self.multicast = False
self.bwlimit = None
# These get initialized when the iface is connected to any filter
self.filter_module = None
+ self.multicast_forwarder = None
# These get initialized when the iface is configured
self.external_iface = None
if self.peer_proto_impl:
return self.peer_proto_impl.if_name
+ def if_up(self):
+ if self.peer_proto_impl:
+ return self.peer_proto_impl.if_up()
+
+ def if_down(self):
+ if self.peer_proto_impl:
+ return self.peer_proto_impl.if_down()
+
def routes_here(self, route):
"""
Returns True if the route should be attached to this interface
if self.address and self.netprefix:
addr, prefix = self.address, self.netprefix
pointopoint = self.pointopoint
- if not pointopoint:
+ if not pointopoint and self.peer_iface:
pointopoint = self.peer_iface.address
if pointopoint:
prefix = 32
- dest, destprefix, nexthop, metric = route
+ dest, destprefix, nexthop, metric, device = route
- myNet = ipaddr.IPNetwork("%s/%d" % (addr, prefix))
- gwIp = ipaddr.IPNetwork(nexthop)
+ myNet = ipaddr.IPv4Network("%s/%d" % (addr, prefix))
+ gwIp = ipaddr.IPv4Network(nexthop)
if pointopoint:
- peerIp = ipaddr.IPNetwork(pointopoint)
+ peerIp = ipaddr.IPv4Network(pointopoint)
if gwIp == peerIp:
return True
impl = self._PROTO_MAP[self.peer_proto](
self, self.peer_iface, home_path, self.tun_key)
impl.port = self.tun_port
+ impl.cross_slice = not self.peer_iface or isinstance(self.peer_iface, _CrossIface)
return impl
def recover(self):
if self.peer_proto:
self.peer_proto_impl = self._impl_instance(
- self._home_path,
- False) # no way to know, no need to know
+ self._home_path)
self.peer_proto_impl.recover()
else:
self._delay_recover = True
def prepare(self, home_path):
- if not self.peer_iface and (self.peer_proto and self.peer_addr and self.peer_port):
+ if not self.peer_iface and (self.peer_proto and self.peer_addr):
# Ad-hoc peer_iface
self.peer_iface = _CrossIface(
self.peer_proto,
# Attributes
self.module = "classqueue.py"
+class LoggingClassQueueFilter(ClassQueueFilter):
+ _TRACEMAP = ClassQueueFilter._TRACEMAP.copy()
+ _TRACEMAP.update({
+ # tracename : (remotename, localname)
+ 'queue_stats_f' : ('queue_stats_f', 'queue_stats_f'),
+ 'queue_stats_b' : ('queue_stats_b', 'queue_stats_b'),
+ })
+
+ def __init__(self, api=None):
+ super(LoggingClassQueueFilter, self).__init__(api)
+ # Attributes
+ self.module = "loggingclassqueue.py classqueue.py"
+
+ def _args_get(self):
+ # Inject outpath
+ args = dict(filter(lambda x:len(x)>1, map(lambda x:x.split('=',1),(self._args or "").split(','))))
+ args["outpath"] = "queue_stats"
+ return ",".join(map("=".join, args.iteritems()))
+ def _args_set(self, value):
+ self._args = value
+ args = property(_args_get, _args_set)
+
class ToSQueueFilter(TunFilter):
def __init__(self, api=None):
super(ToSQueueFilter, self).__init__(api)