Beispiel #1
0
    def __init__(self, router_adapter, router_id, area, max_routers, config_override={}):
        """
        Initialize an instance of a router for a domain.
        """
        ##
        ## Record important information about this router instance
        ##
        self.domain         = "domain"
        self.router_adapter = router_adapter
        self._config        = None # Not yet loaded
        self._log_hello     = LogAdapter("ROUTER_HELLO")
        self._log_ls        = LogAdapter("ROUTER_LS")
        self._log_ma        = LogAdapter("ROUTER_MA")
        self._log_general   = LogAdapter("ROUTER")
        self.io_adapter     = [IoAdapter(self.receive, "qdrouter",    'L', '0', TREATMENT_MULTICAST_FLOOD),
                               IoAdapter(self.receive, "qdrouter.ma", 'L', '0', TREATMENT_MULTICAST_ONCE),
                               IoAdapter(self.receive, "qdrouter",    'T', '0', TREATMENT_MULTICAST_FLOOD),
                               IoAdapter(self.receive, "qdrouter.ma", 'T', '0', TREATMENT_MULTICAST_ONCE),
                               IoAdapter(self.receive, "qdhello",     'L', '0', TREATMENT_MULTICAST_FLOOD)]
        self.max_routers    = max_routers
        self.id             = router_id
        self.instance       = long(time.time())
        self.area           = area
        self.log(LOG_INFO, "Router Engine Instantiated: id=%s instance=%d max_routers=%d" %
                 (self.id, self.instance, self.max_routers))

        ##
        ## Launch the sub-module engines
        ##
        self.node_tracker          = NodeTracker(self, self.max_routers)
        self.hello_protocol        = HelloProtocol(self, self.node_tracker)
        self.link_state_engine     = LinkStateEngine(self)
        self.path_engine           = PathEngine(self)
        self.mobile_address_engine = MobileAddressEngine(self, self.node_tracker)
Beispiel #2
0
    def __init__(self, router_adapter, router_id, area, max_routers, config_override={}):
        """
        Initialize an instance of a router for a domain.
        """
        ##
        ## Record important information about this router instance
        ##
        self.domain         = "domain"
        self.router_adapter = router_adapter
        self._config        = None # Not yet loaded
        self._log_hello     = LogAdapter("ROUTER_HELLO")
        self._log_ls        = LogAdapter("ROUTER_LS")
        self._log_ma        = LogAdapter("ROUTER_MA")
        self._log_general   = LogAdapter("ROUTER")
        self.io_adapter     = [IoAdapter(self.receive, "qdrouter",    'L', '0', TREATMENT_MULTICAST_FLOOD),
                               IoAdapter(self.receive, "qdrouter.ma", 'L', '0', TREATMENT_MULTICAST_ONCE),
                               IoAdapter(self.receive, "qdrouter",    'T', '0', TREATMENT_MULTICAST_FLOOD),
                               IoAdapter(self.receive, "qdrouter.ma", 'T', '0', TREATMENT_MULTICAST_ONCE),
                               IoAdapter(self.receive, "qdhello",     'L', '0', TREATMENT_MULTICAST_FLOOD)]
        self.max_routers    = max_routers
        self.id             = router_id
        self.instance       = long(time.time())
        self.area           = area
        self.log(LOG_INFO, "Router Engine Instantiated: id=%s instance=%d max_routers=%d" %
                 (self.id, self.instance, self.max_routers))

        ##
        ## Launch the sub-module engines
        ##
        self.node_tracker          = NodeTracker(self, self.max_routers)
        self.hello_protocol        = HelloProtocol(self, self.node_tracker)
        self.link_state_engine     = LinkStateEngine(self)
        self.path_engine           = PathEngine(self)
        self.mobile_address_engine = MobileAddressEngine(self, self.node_tracker)
Beispiel #3
0
  def __init__(self, adapter, domain, router_id=None, area='area', config_override={}):
    """
    Initialize an instance of a router for a domain.
    """
    ##
    ## Record important information about this router instance
    ##
    self.adapter = adapter
    self.domain = domain
    if router_id:
      self.id = router_id
    else:
      self.id = str(uuid4())
    self.area = area
    self.log(NOTICE, "Router Engine Instantiated: area=%s id=%s" % (self.area, self.id))

    ##
    ## Setup configuration
    ##
    self.config = Configuration(config_override)
    self.log(INFO, "Config: %r" % self.config)

    ##
    ## Launch the sub-module engines
    ##
    self.neighbor_engine       = NeighborEngine(self)
    self.link_state_engine     = LinkStateEngine(self)
    self.path_engine           = PathEngine(self)
    self.mobile_address_engine = MobileAddressEngine(self)
    self.routing_table_engine  = RoutingTableEngine(self)
    self.binding_engine        = BindingEngine(self)
    self.adapter_engine        = AdapterEngine(self)

    ##
    ## Establish the local bindings so that this router instance can receive
    ## traffic addressed to it
    ##
    self.adapter.local_bind('_peer')
    self.adapter.local_bind('_topo.%s.%s' % (self.area, self.id))
    self.adapter.local_bind('_topo.%s.all' % self.area)
Beispiel #4
0
class RouterEngine:
    """
    """
    def __init__(self,
                 router_adapter,
                 router_id,
                 area,
                 max_routers,
                 config_override={}):
        """
        Initialize an instance of a router for a domain.
        """
        ##
        ## Record important information about this router instance
        ##
        self.domain = "domain"
        self.router_adapter = router_adapter
        self._config = None  # Not yet loaded
        self._log_hello = LogAdapter("ROUTER_HELLO")
        self._log_ls = LogAdapter("ROUTER_LS")
        self._log_ma = LogAdapter("ROUTER_MA")
        self._log_general = LogAdapter("ROUTER")
        self.io_adapter = [
            IoAdapter(self.receive, "qdrouter"),
            IoAdapter(self.receive, "qdrouter.ma"),
            IoAdapter(self.receive, "qdhello")
        ]
        self.max_routers = max_routers
        self.id = router_id
        self.instance = long(time.time())
        self.area = area
        self.log(
            LOG_INFO,
            "Router Engine Instantiated: id=%s instance=%d max_routers=%d" %
            (self.id, self.instance, self.max_routers))

        ##
        ## Launch the sub-module engines
        ##
        self.node_tracker = NodeTracker(self, self.max_routers)
        self.hello_protocol = HelloProtocol(self, self.node_tracker)
        self.link_state_engine = LinkStateEngine(self)
        self.path_engine = PathEngine(self)
        self.mobile_address_engine = MobileAddressEngine(
            self, self.node_tracker)

    ##========================================================================================
    ## Adapter Entry Points - invoked from the adapter
    ##========================================================================================
    def getId(self):
        """
        Return the router's ID
        """
        return self.id

    @property
    def config(self):
        if not self._config:
            try:
                self._config = self.router_adapter.get_agent(
                ).find_entity_by_type('router')[0]
            except IndexError:
                raise ValueError("No router configuration found")
        return self._config

    def addressAdded(self, addr):
        """
        """
        try:
            if addr[0] in 'MCD':
                self.mobile_address_engine.add_local_address(addr)
        except Exception:
            self.log_ma(
                LOG_ERROR, "Exception in new-address processing\n%s" %
                format_exc(LOG_STACK_LIMIT))

    def addressRemoved(self, addr):
        """
        """
        try:
            if addr[0] in 'MCD':
                self.mobile_address_engine.del_local_address(addr)
        except Exception:
            self.log_ma(
                LOG_ERROR, "Exception in del-address processing\n%s" %
                format_exc(LOG_STACK_LIMIT))

    def linkLost(self, link_id):
        """
        """
        self.node_tracker.link_lost(link_id)

    def handleTimerTick(self):
        """
        """
        try:
            now = time.time()
            self.hello_protocol.tick(now)
            self.link_state_engine.tick(now)
            self.node_tracker.tick(now)
        except Exception:
            self.log(
                LOG_ERROR, "Exception in timer processing\n%s" %
                format_exc(LOG_STACK_LIMIT))

    def handleControlMessage(self, opcode, body, link_id):
        """
        """
        try:
            now = time.time()
            if opcode == 'HELLO':
                msg = MessageHELLO(body)
                self.log_hello(LOG_TRACE, "RCVD: %r" % msg)
                self.hello_protocol.handle_hello(msg, now, link_id)

            elif opcode == 'RA':
                msg = MessageRA(body)
                self.log_ls(LOG_TRACE, "RCVD: %r" % msg)
                self.link_state_engine.handle_ra(msg, now)

            elif opcode == 'LSU':
                msg = MessageLSU(body)
                self.log_ls(LOG_TRACE, "RCVD: %r" % msg)
                self.link_state_engine.handle_lsu(msg, now)

            elif opcode == 'LSR':
                msg = MessageLSR(body)
                self.log_ls(LOG_TRACE, "RCVD: %r" % msg)
                self.link_state_engine.handle_lsr(msg, now)

            elif opcode == 'MAU':
                msg = MessageMAU(body)
                self.log_ma(LOG_TRACE, "RCVD: %r" % msg)
                self.mobile_address_engine.handle_mau(msg, now)

            elif opcode == 'MAR':
                msg = MessageMAR(body)
                self.log_ma(LOG_TRACE, "RCVD: %r" % msg)
                self.mobile_address_engine.handle_mar(msg, now)

        except Exception:
            self.log(
                LOG_ERROR, "Control message error: opcode=%s body=%r\n%s" %
                (opcode, body, format_exc(LOG_STACK_LIMIT)))

    def receive(self, message, link_id):
        """
        This is the IoAdapter message-receive handler
        """
        try:
            self.handleControlMessage(message.properties['opcode'],
                                      message.body, link_id)
        except Exception:
            self.log(
                LOG_ERROR,
                "Exception in raw message processing: properties=%r body=%r\n%s"
                % (message.properties, message.body,
                   format_exc(LOG_STACK_LIMIT)))

    def getRouterData(self, kind):
        """
        """
        if kind == 'help':
            return {
                'help': "Get list of supported values for kind",
                'link-state': "This router's link state",
                'link-state-set': "The set of link states from known routers",
                'next-hops': "Next hops to each known router"
            }
        if kind == 'link-state':
            return self.neighbor_engine.link_state.to_dict()
        if kind == 'link-state-set':
            copy = {}
            for _id, _ls in self.link_state_engine.collection.items():
                copy[_id] = _ls.to_dict()
            return copy

        return {'notice': 'Use kind="help" to get a list of possibilities'}

    ##========================================================================================
    ## Adapter Calls - outbound calls to Dispatch
    ##========================================================================================
    def log(self, level, text):
        """
        Emit a log message to the host's event log
        """
        info = extract_stack(limit=2)[0]  # Caller frame info
        self._log_general.log(level, text, info[0], info[1])

    def log_hello(self, level, text):
        """
        Emit a log message to the host's event log
        """
        info = extract_stack(limit=2)[0]  # Caller frame info
        self._log_hello.log(level, text, info[0], info[1])

    def log_ls(self, level, text):
        """
        Emit a log message to the host's event log
        """
        info = extract_stack(limit=2)[0]  # Caller frame info
        self._log_ls.log(level, text, info[0], info[1])

    def log_ma(self, level, text):
        """
        Emit a log message to the host's event log
        """
        info = extract_stack(limit=2)[0]  # Caller frame info
        self._log_ma.log(level, text, info[0], info[1])

    def send(self, dest, msg):
        """
        Send a control message to another router.
        """
        app_props = {'opcode': msg.get_opcode()}
        self.io_adapter[0].send(
            Message(address=dest, properties=app_props, body=msg.to_dict()))

    def node_updated(self, addr, reachable, neighbor):
        """
        """
        self.router_adapter(addr, reachable, neighbor)
Beispiel #5
0
class RouterEngine:
  """
  """

  def __init__(self, adapter, domain, router_id=None, area='area', config_override={}):
    """
    Initialize an instance of a router for a domain.
    """
    ##
    ## Record important information about this router instance
    ##
    self.adapter = adapter
    self.domain = domain
    if router_id:
      self.id = router_id
    else:
      self.id = str(uuid4())
    self.area = area
    self.log(NOTICE, "Router Engine Instantiated: area=%s id=%s" % (self.area, self.id))

    ##
    ## Setup configuration
    ##
    self.config = Configuration(config_override)
    self.log(INFO, "Config: %r" % self.config)

    ##
    ## Launch the sub-module engines
    ##
    self.neighbor_engine       = NeighborEngine(self)
    self.link_state_engine     = LinkStateEngine(self)
    self.path_engine           = PathEngine(self)
    self.mobile_address_engine = MobileAddressEngine(self)
    self.routing_table_engine  = RoutingTableEngine(self)
    self.binding_engine        = BindingEngine(self)
    self.adapter_engine        = AdapterEngine(self)

    ##
    ## Establish the local bindings so that this router instance can receive
    ## traffic addressed to it
    ##
    self.adapter.local_bind('_peer')
    self.adapter.local_bind('_topo.%s.%s' % (self.area, self.id))
    self.adapter.local_bind('_topo.%s.all' % self.area)


  ##========================================================================================
  ## Adapter Entry Points - invoked from the adapter
  ##========================================================================================
  def getId(self):
    """
    Return the router's ID
    """
    return self.id


  def validateTopicKey(self, key):
    """
    """
    return True


  def addLocalAddress(self, key):
    """
    """
    try:
      if key.find('_topo') == 0 or key.find('_peer') == 0:
        return
      self.mobile_address_engine.add_local_address(key)
    except Exception, e:
      self.log(ERROR, "Exception in new-address processing: exception=%r" % e)
Beispiel #6
0
class RouterEngine:
    """
    """

    def __init__(self, router_adapter, router_id, area, max_routers, config_override={}):
        """
        Initialize an instance of a router for a domain.
        """
        ##
        ## Record important information about this router instance
        ##
        self.domain         = "domain"
        self.router_adapter = router_adapter
        self._config        = None # Not yet loaded
        self._log_hello     = LogAdapter("ROUTER_HELLO")
        self._log_ls        = LogAdapter("ROUTER_LS")
        self._log_ma        = LogAdapter("ROUTER_MA")
        self._log_general   = LogAdapter("ROUTER")
        self.io_adapter     = [IoAdapter(self.receive, "qdrouter",    'L', '0', TREATMENT_MULTICAST_FLOOD),
                               IoAdapter(self.receive, "qdrouter.ma", 'L', '0', TREATMENT_MULTICAST_ONCE),
                               IoAdapter(self.receive, "qdrouter",    'T', '0', TREATMENT_MULTICAST_FLOOD),
                               IoAdapter(self.receive, "qdrouter.ma", 'T', '0', TREATMENT_MULTICAST_ONCE),
                               IoAdapter(self.receive, "qdhello",     'L', '0', TREATMENT_MULTICAST_FLOOD)]
        self.max_routers    = max_routers
        self.id             = router_id
        self.instance       = long(time.time())
        self.area           = area
        self.log(LOG_INFO, "Router Engine Instantiated: id=%s instance=%d max_routers=%d" %
                 (self.id, self.instance, self.max_routers))

        ##
        ## Launch the sub-module engines
        ##
        self.node_tracker          = NodeTracker(self, self.max_routers)
        self.hello_protocol        = HelloProtocol(self, self.node_tracker)
        self.link_state_engine     = LinkStateEngine(self)
        self.path_engine           = PathEngine(self)
        self.mobile_address_engine = MobileAddressEngine(self, self.node_tracker)


    ##========================================================================================
    ## Adapter Entry Points - invoked from the adapter
    ##========================================================================================
    def getId(self):
        """
        Return the router's ID
        """
        return self.id

    @property
    def config(self):
        if not self._config:
            try: self._config = self.router_adapter.get_agent().find_entity_by_type('router')[0]
            except IndexError: raise ValueError("No router configuration found")
        return self._config

    def addressAdded(self, addr):
        """
        """
        try:
            if addr[0] in 'MCD':
                self.mobile_address_engine.add_local_address(addr)
        except Exception:
            self.log_ma(LOG_ERROR, "Exception in new-address processing\n%s" % format_exc(LOG_STACK_LIMIT))

    def addressRemoved(self, addr):
        """
        """
        try:
            if addr[0] in 'MCD':
                self.mobile_address_engine.del_local_address(addr)
        except Exception:
            self.log_ma(LOG_ERROR, "Exception in del-address processing\n%s" % format_exc(LOG_STACK_LIMIT))

    def linkLost(self, link_id):
        """
        """
        self.node_tracker.link_lost(link_id)


    def handleTimerTick(self):
        """
        """
        try:
            now = time.time()
            self.hello_protocol.tick(now)
            self.link_state_engine.tick(now)
            self.node_tracker.tick(now)
        except Exception:
            self.log(LOG_ERROR, "Exception in timer processing\n%s" % format_exc(LOG_STACK_LIMIT))

    def handleControlMessage(self, opcode, body, link_id):
        """
        """
        try:
            now = time.time()
            if   opcode == 'HELLO':
                msg = MessageHELLO(body)
                self.log_hello(LOG_TRACE, "RCVD: %r" % msg)
                self.hello_protocol.handle_hello(msg, now, link_id)

            elif opcode == 'RA':
                msg = MessageRA(body)
                self.log_ls(LOG_TRACE, "RCVD: %r" % msg)
                self.link_state_engine.handle_ra(msg, now)

            elif opcode == 'LSU':
                msg = MessageLSU(body)
                self.log_ls(LOG_TRACE, "RCVD: %r" % msg)
                self.link_state_engine.handle_lsu(msg, now)

            elif opcode == 'LSR':
                msg = MessageLSR(body)
                self.log_ls(LOG_TRACE, "RCVD: %r" % msg)
                self.link_state_engine.handle_lsr(msg, now)

            elif opcode == 'MAU':
                msg = MessageMAU(body)
                self.log_ma(LOG_TRACE, "RCVD: %r" % msg)
                self.mobile_address_engine.handle_mau(msg, now)

            elif opcode == 'MAR':
                msg = MessageMAR(body)
                self.log_ma(LOG_TRACE, "RCVD: %r" % msg)
                self.mobile_address_engine.handle_mar(msg, now)

        except Exception:
            self.log(LOG_ERROR, "Control message error: opcode=%s body=%r\n%s" % (opcode, body, format_exc(LOG_STACK_LIMIT)))

    def receive(self, message, link_id):
        """
        This is the IoAdapter message-receive handler
        """
        try:
            self.handleControlMessage(message.properties['opcode'], message.body, link_id)
        except Exception:
            self.log(LOG_ERROR, "Exception in raw message processing: properties=%r body=%r\n%s" %
                     (message.properties, message.body, format_exc(LOG_STACK_LIMIT)))

    def getRouterData(self, kind):
        """
        """
        if kind == 'help':
            return { 'help'           : "Get list of supported values for kind",
                     'link-state'     : "This router's link state",
                     'link-state-set' : "The set of link states from known routers",
                     'next-hops'      : "Next hops to each known router"
                     }
        if kind == 'link-state'     : return self.neighbor_engine.link_state.to_dict()
        if kind == 'link-state-set' :
            copy = {}
            for _id,_ls in self.link_state_engine.collection.items():
                copy[_id] = _ls.to_dict()
            return copy

        return {'notice':'Use kind="help" to get a list of possibilities'}


    ##========================================================================================
    ## Adapter Calls - outbound calls to Dispatch
    ##========================================================================================
    def log(self, level, text):
        """
        Emit a log message to the host's event log
        """
        info = extract_stack(limit=2)[0] # Caller frame info
        self._log_general.log(level, text, info[0], info[1])


    def log_hello(self, level, text):
        """
        Emit a log message to the host's event log
        """
        info = extract_stack(limit=2)[0] # Caller frame info
        self._log_hello.log(level, text, info[0], info[1])


    def log_ls(self, level, text):
        """
        Emit a log message to the host's event log
        """
        info = extract_stack(limit=2)[0] # Caller frame info
        self._log_ls.log(level, text, info[0], info[1])


    def log_ma(self, level, text):
        """
        Emit a log message to the host's event log
        """
        info = extract_stack(limit=2)[0] # Caller frame info
        self._log_ma.log(level, text, info[0], info[1])


    def send(self, dest, msg):
        """
        Send a control message to another router.
        """
        app_props = {'opcode' : msg.get_opcode() }
        self.io_adapter[0].send(Message(address=dest, properties=app_props, body=msg.to_dict()), True, True)


    def node_updated(self, addr, reachable, neighbor):
        """
        """
        self.router_adapter(addr, reachable, neighbor)