Esempio n. 1
0
 def _waiting(self):
     self.change_ism_state('ISM_Waiting')
     self._begin_hello()
     self._hello_timer = Timer(self.hello_interval, self._begin_hello)
     self._hello_timer.start()
     self._elect_timer = Timer(self.dead_interval,
                               self._elect_dr,
                               once=True)
     self._elect_timer.start()
Esempio n. 2
0
 def _point_to_point(self):
     """
     send hello in p2p or virtual link
     """
     self.change_ism_state('ISM_PointToPoint')
     self._begin_hello()
     self._hello_timer = Timer(self.hello_interval, self._begin_hello)
     self._hello_timer.start()
     #start a timer to check all lsa age per lsaAgeStep second
     #TODO: this implementation should be checked.
     if self._lsa_age_timer is None:
         self._lsa_age_timer = Timer(self.lsa_age_step, self._lsa_age)
         self._lsa_age_timer.start()
         LOG.debug('[ISM] Start LSA age timer.')
Esempio n. 3
0
    def send_dd(self, pkt):
        if self.nsm.ism.link_type == 'Broadcast' and self.dst != self.nsm.ism.drip and self.dst != self.nsm.ism.bdrip:
            if self.nsm.ism.drip == self.nsm.src:
                self.dst = util.int2ip(self.nsm.ism.drip)
            if self.nsm.ism.bdrip == self.nsm.src:
                self.dst = util.int2ip(self.nsm.ism.bdrip)
        self._sock.conn(self.dst)

        LOG.info('[Exchange] Send DD to %s.' % self.dst)
        self._sock.sendp(pkt)

        self.nsm.ism.ai.oi.stat.send_dd_count += 1
        self.nsm.ism.ai.oi.stat.total_send_packet_count += 1

        if self.nsm.state == NSM_STATE[
                'NSM_Loading'] or self.nsm.state == NSM_STATE['NSM_Full']:
            self.nsm.last_send = pkt  # save the last sent packet

            #start a timer to wait dead interval to release the last recv packet
            if self._rls_last_dd_timer is None or self._rls_last_dd_timer.is_stop(
            ):
                self._rls_last_dd_timer = Timer(self.nsm.ism.dead_interval,
                                                self._rls_last_dd,
                                                once=True)
                self._rls_last_dd_timer.start()
            else:
                self._rls_last_dd_timer.reset()
    def _two_way_or_exstart(self):
        #whether become adjacent in broadcast, rfc 10.4
        if self.state == NSM_STATE['NSM_Init'] or self.state == NSM_STATE['NSM_TwoWay']:
            #need to make adjacency
            if self.ism.bdrip == self.src or self.ism.drip == self.src or self.ism.link_type == 'Point-to-Point':
                self.change_nsm_state('NSM_ExStart')

                #Generate dd_sum from each lsa list, and exception for virtual link and stub area.
                #But as a probe, we need not to send dd_sum.

                #start dd sync procedure
                self.dd_seqnum = int(time.time())
                self.dd_flags = 7    # set init bit, more bit, master bit
                self._send_dd()
                if self._dd_exstart_timer is None:
                    pass
                elif self._dd_exstart_timer.is_stop():
                    del self._dd_exstart_timer
                else:
                    self._dd_exstart_timer.stop()
                    del self._dd_exstart_timer
                self._dd_exstart_timer = Timer(self.ism.rxmt_interval, self._send_dd)
                self._dd_exstart_timer.start()

            #do not need to make adjacency
            else:
                if self.state == NSM_STATE['NSM_Init']:
                    #change to 2-way state
                    self.change_nsm_state('NSM_TwoWay')
                else:
                    #stay in 2-way state
                    pass
 def _loading(self):
     self.change_nsm_state('NSM_Loading')
     #start to send first lsr
     if len(self.ls_req) != 0:
         self._send_lsr(self.ls_req)
         self.lsr_resend_timer = Timer(self.ism.rxmt_interval, self._send_lsr, self.ls_req)
         self.lsr_resend_timer.start()
     else:
         self._full()
 def _hello_received(self):
     if self.state == NSM_STATE['NSM_Down']:
         self.change_nsm_state('NSM_Init')
         #start inactive timer
         if self._inactive_timer is None or self._inactive_timer.is_stop():
             self._inactive_timer = Timer(self.inactive_timer_interval, self.dead)
             self._inactive_timer.start()
             LOG.debug('[NSM] %s starts inactive timer.' % util.int2ip(self.rtid))
         else:
             self._inactive_timer.reset()
     else:
         self._inactive_timer.reset()
Esempio n. 7
0
 def _dr_other(self):
     """
     send hello in broadcast or nbma, not be dr
     """
     self.change_ism_state('ISM_DROther')
     if not self._elect_timer.is_stop():
         self._elect_timer.stop()
     #start a timer to check all lsa age per lsaAgeStep second
     #TODO: this implementation should be checked.
     if self._lsa_age_timer is None:
         self._lsa_age_timer = Timer(self.lsa_age_step, self._lsa_age)
         self._lsa_age_timer.start()
         LOG.debug('[ISM] Start LSA age timer.')
    def _seq_mismatch_or_bad_lsr(self):
        LOG.warn('[NSM] %s sequence mismatch or bad LSR.' % util.int2ip(self.rtid))
        #make sure that all these are clear
        self.ls_req = list()
        self.ls_rxmt = list()
        self.db_sum = list()
        self.last_recv = tuple()
        self.last_send = None
        self.last_send_ts = 0

        self.change_nsm_state('NSM_ExStart')
        self.dd_flags = 7    # set init bit, more bit, master bit
        self.dd_seqnum = int(time.time())
        self._send_dd()
        if self._dd_exstart_timer is None:
            self._dd_exstart_timer = Timer(self.ism.rxmt_interval, self._send_dd)
            self._dd_exstart_timer.start()
        elif self._dd_exstart_timer.is_stop():
            del self._dd_exstart_timer
            self._dd_exstart_timer = Timer(self.ism.rxmt_interval, self._send_dd)
            self._dd_exstart_timer.start()
        else:
            self._dd_exstart_timer.reset()