Beispiel #1
0
    def __init__(self, handler_):
        assert callable(handler_)

        super(Timer, self).__init__()
        self._handler = handler_
        self._event = hub.Event()
        self._thread = None
Beispiel #2
0
    def _wait_bpdu_timer(self):
        time_exceed = False

        while True:
            self.wait_timer_event = hub.Event()
            message_age = (self.designated_times.message_age
                           if self.designated_times else 0)
            timer = self.port_times.max_age - message_age
            timeout = hub.Timeout(timer)
            try:
                self.wait_timer_event.wait()
            except hub.Timeout as t:
                if t is not timeout:
                    err_msg = 'Internal error. Not my timeout.'
                    raise OSKenException(msg=err_msg)
                self.logger.info('[port=%d] Wait BPDU timer is exceeded.',
                                 self.ofport.port_no,
                                 extra=self.dpid_str)
                time_exceed = True
            finally:
                timeout.cancel()
                self.wait_timer_event = None

            if time_exceed:
                break

        if time_exceed:  # Bridge.recalculate_spanning_tree
            hub.spawn(self.wait_bpdu_timeout)
Beispiel #3
0
    def _recv_timeout_loop(self):
        """
        A loop to check timeout of receiving remote BFD packet.
        """
        while self._detect_time:
            last_wait = time.time()
            self._lock = hub.Event()

            self._lock.wait(timeout=self._detect_time)

            if self._lock.is_set():
                # Authentication variable check (RFC5880 Section 6.8.1.)
                if getattr(self, "_auth_seq_known", 0):
                    if last_wait > time.time() + 2 * self._detect_time:
                        self._auth_seq_known = 0

            else:
                # Check Detection Time expiration (RFC5880 section 6.8.4.)
                LOG.info("[BFD][%s][RECV] BFD Session timed out.",
                         hex(self._local_discr))
                if self._session_state not in [
                        bfd.BFD_STATE_DOWN, bfd.BFD_STATE_ADMIN_DOWN
                ]:
                    self._set_state(bfd.BFD_STATE_DOWN,
                                    bfd.BFD_DIAG_CTRL_DETECT_TIME_EXPIRED)

                # Authentication variable check (RFC5880 Section 6.8.1.)
                if getattr(self, "_auth_seq_known", 0):
                    self._auth_seq_known = 0
Beispiel #4
0
 def _core_start(self, as_number=64512, router_id='10.0.0.1'):
     common_settings = {}
     common_settings[LOCAL_AS] = as_number
     common_settings[ROUTER_ID] = str(router_id)
     waiter = hub.Event()
     call('core.start', waiter=waiter, **common_settings)
     waiter.wait()
     return {}
Beispiel #5
0
    def __init__(self, *args, **kwargs):
        super(Switches, self).__init__(*args, **kwargs)

        self.name = 'switches'
        self.dps = {}  # datapath_id => Datapath class
        self.port_state = {}  # datapath_id => ports
        self.ports = PortDataState()  # Port class -> PortData class
        self.links = LinkState()  # Link class -> timestamp
        self.hosts = HostState()  # mac address -> Host class list
        self.is_active = True

        self.link_discovery = self.CONF.observe_links
        if self.link_discovery:
            self.install_flow = self.CONF.install_lldp_flow
            self.explicit_drop = self.CONF.explicit_drop
            self.lldp_event = hub.Event()
            self.link_event = hub.Event()
            self.threads.append(hub.spawn(self.lldp_loop))
            self.threads.append(hub.spawn(self.link_loop))
Beispiel #6
0
    def _state_machine(self):
        """ Port state machine.
             Change next status when timer is exceeded
             or _change_status() method is called."""
        role_str = {
            ROOT_PORT: 'ROOT_PORT          ',
            DESIGNATED_PORT: 'DESIGNATED_PORT    ',
            NON_DESIGNATED_PORT: 'NON_DESIGNATED_PORT'
        }
        state_str = {
            PORT_STATE_DISABLE: 'DISABLE',
            PORT_STATE_BLOCK: 'BLOCK',
            PORT_STATE_LISTEN: 'LISTEN',
            PORT_STATE_LEARN: 'LEARN',
            PORT_STATE_FORWARD: 'FORWARD'
        }

        if self.state is PORT_STATE_DISABLE:
            self.ofctl.set_port_status(self.ofport, self.state)

        while True:
            self.logger.info('[port=%d] %s / %s',
                             self.ofport.port_no,
                             role_str[self.role],
                             state_str[self.state],
                             extra=self.dpid_str)

            self.state_event = hub.Event()
            timer = self._get_timer()
            if timer:
                timeout = hub.Timeout(timer)
                try:
                    self.state_event.wait()
                except hub.Timeout as t:
                    if t is not timeout:
                        err_msg = 'Internal error. Not my timeout.'
                        raise OSKenException(msg=err_msg)
                    new_state = self._get_next_state()
                    self._change_status(new_state, thread_switch=False)
                finally:
                    timeout.cancel()
            else:
                self.state_event.wait()

            self.state_event = None
Beispiel #7
0
def send_stats_request(dp, stats, waiters, msgs, logger=None):
    dp.set_xid(stats)
    waiters_per_dp = waiters.setdefault(dp.id, {})
    lock = hub.Event()
    previous_msg_len = len(msgs)
    waiters_per_dp[stats.xid] = (lock, msgs)
    send_msg(dp, stats, logger)

    lock.wait(timeout=DEFAULT_TIMEOUT)
    current_msg_len = len(msgs)

    while current_msg_len > previous_msg_len:
        previous_msg_len = current_msg_len
        lock.wait(timeout=DEFAULT_TIMEOUT)
        current_msg_len = len(msgs)

    if not lock.is_set():
        del waiters_per_dp[stats.xid]
Beispiel #8
0
 def __init__(self, core_service, host, port):
     super(BMPClient, self).__init__(name='BMPClient(%s:%s)' % (host, port))
     self._core_service = core_service
     self._core_service.signal_bus.register_listener(
         BgpSignalBus.BGP_ADJ_RIB_IN_CHANGED,
         lambda _, data: self.on_adj_rib_in_changed(data)
     )
     self._core_service.signal_bus.register_listener(
         BgpSignalBus.BGP_ADJ_UP,
         lambda _, data: self.on_adj_up(data)
     )
     self._core_service.signal_bus.register_listener(
         BgpSignalBus.BGP_ADJ_DOWN,
         lambda _, data: self.on_adj_down(data)
     )
     self._socket = None
     self.server_address = (host, port)
     self._connect_retry_event = hub.Event()
     self._connect_retry_time = 5
Beispiel #9
0
def start(**kwargs):
    """Starts new context using provided configuration.

    Raises RuntimeConfigError if a context is already active.
    """
    if CORE_MANAGER.started:
        raise RuntimeConfigError('Current context has to be stopped to start '
                                 'a new context.')

    try:
        waiter = kwargs.pop('waiter')
    except KeyError:
        waiter = hub.Event()
    common_config = CommonConf(**kwargs)
    hub.spawn(CORE_MANAGER.start, *[], **{
        'common_conf': common_config,
        'waiter': waiter
    })
    return True
Beispiel #10
0
 def create_custom_event():
     LOG.debug('Create CustomEvent called')
     return hub.Event()