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()
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.')
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()
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()