int exchange_done(struct thread * thread) { struct ospf6_neighbor *on; on = (struct ospf6_neighbor *) THREAD_ARG (thread); assert (on); if (on->state != OSPF6_NEIGHBOR_EXCHANGE) return 0; if (IS_OSPF6_SIBLING_DEBUG_NEIGHBOR) zlog_debug ("Neighbor Event %s: *ExchangeDone*", on->name); THREAD_OFF (on->thread_send_dbdesc); ospf6_lsdb_remove_all (on->dbdesc_list); /* XXX thread_add_timer (master, ospf6_neighbor_last_dbdesc_release, on, on->ospf6_if->dead_interval); */ if (on->request_list->count == 0) ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on); else ospf6_neighbor_state_change (OSPF6_NEIGHBOR_LOADING, on); return 0; }
int twoway_received (struct thread *thread) { struct ospf6_neighbor *on; on = (struct ospf6_neighbor *) THREAD_ARG (thread); assert (on); if (on->state > OSPF6_NEIGHBOR_INIT) return 0; if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) zlog_info ("Neighbor Event %s: *2Way-Received*", on->name); thread_add_event (master, neighbor_change, on->ospf6_if, 0); if (! need_adjacency (on)) { ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on); return 0; } ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); THREAD_OFF (on->thread_send_dbdesc); on->thread_send_dbdesc = thread_add_event (master, ospf6_dbdesc_send, on, 0); return 0; }
int bad_lsreq(struct thread * thread) { struct ospf6_neighbor * on; struct ospf6_lsa * lsa; on = (struct ospf6_neighbor *) THREAD_ARG(thread); assert(on); if(on->state < OSPF6_NEIGHBOR_EXCHANGE) return 0; if(IS_OSPF6_SIBLING_DEBUG_NEIGHBOR) zlog_debug("Neighbor Event %s: *BadLSReq*", on->name); ospf6_neighbor_state_change(OSPF6_NEIGHBOR_EXSTART, on); SET_FLAG(on->dbdesc_bits, OSPF6_DBDESC_MSBIT); SET_FLAG(on->dbdesc_bits, OSPF6_DBDESC_MBIT); SET_FLAG(on->dbdesc_bits, OSPF6_DBDESC_IBIT); ospf6_lsdb_remove_all(on->summary_list); ospf6_lsdb_remove_all(on->request_list); for(lsa = ospf6_lsdb_head(on->retrans_list); lsa; lsa = ospf6_lsdb_next(lsa)) { ospf6_decrement_retrans_count(lsa); ospf6_lsdb_remove(lsa, on->retrans_list); } THREAD_OFF(on->thread_send_dbdesc); on->thread_send_dbdesc = thread_add_event(master, ospf6_dbdesc_send, on, 0); return 0; }
int adj_ok(struct thread * thread) { struct ospf6_neighbor * on; on = (struct ospf6_neighbor *)THREAD_ARG(thread); assert(on); if(IS_OSPF6_SIBLING_DEBUG_NEIGHBOR) { zlog_debug("Neighbor Event %s: *AdjOK?*", on->name); } if(on->state == OSPF6_NEIGHBOR_TWOWAY && need_adjacency(on)) { ospf6_neighbor_state_change(OSPF6_NEIGHBOR_EXSTART, on); // send dbdesc here } else if(on->state >= OSPF6_NEIGHBOR_EXSTART && !need_adjacency(on)) { // remove all lsas } return 0; }
int oneway_received (struct thread *thread) { struct ospf6_neighbor *on; struct ospf6_lsa *lsa; on = (struct ospf6_neighbor *) THREAD_ARG (thread); assert (on); if (on->state < OSPF6_NEIGHBOR_TWOWAY) return 0; if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) zlog_info ("Neighbor Event %s: *1Way-Received*", on->name); ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on); thread_add_event (master, neighbor_change, on->ospf6_if, 0); ospf6_lsdb_remove_all (on->summary_list); ospf6_lsdb_remove_all (on->request_list); for (lsa = ospf6_lsdb_head (on->retrans_list); lsa; lsa = ospf6_lsdb_next (lsa)) { ospf6_decrement_retrans_count (lsa); ospf6_lsdb_remove (lsa, on->retrans_list); } THREAD_OFF (on->thread_send_dbdesc); THREAD_OFF (on->thread_send_lsreq); THREAD_OFF (on->thread_send_lsupdate); THREAD_OFF (on->thread_send_lsack); return 0; }
int adj_ok (struct thread *thread) { struct ospf6_neighbor *on; struct ospf6_lsa *lsa; on = (struct ospf6_neighbor *) THREAD_ARG (thread); assert (on); if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) zlog_info ("Neighbor Event %s: *AdjOK?*", on->name); if (on->state == OSPF6_NEIGHBOR_TWOWAY && need_adjacency (on)) { ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); THREAD_OFF (on->thread_send_dbdesc); on->thread_send_dbdesc = thread_add_event (master, ospf6_dbdesc_send, on, 0); } else if (on->state >= OSPF6_NEIGHBOR_EXSTART && ! need_adjacency (on)) { ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on); ospf6_lsdb_remove_all (on->summary_list); ospf6_lsdb_remove_all (on->request_list); for (lsa = ospf6_lsdb_head (on->retrans_list); lsa; lsa = ospf6_lsdb_next (lsa)) { ospf6_decrement_retrans_count (lsa); ospf6_lsdb_remove (lsa, on->retrans_list); } } return 0; }
int oneway_received(struct thread * thread) { struct ospf6_neighbor * on; on = (struct ospf6_neighbor *)THREAD_ARG(thread); if(on->state < OSPF6_NEIGHBOR_TWOWAY) return 0; if(IS_OSPF6_SIBLING_DEBUG_NEIGHBOR) zlog_debug("Neighbor Event %s: *1Way-Received*", on->name); ospf6_neighbor_state_change(OSPF6_NEIGHBOR_INIT, on); thread_add_event(master, neighbor_change, on->ospf6_if, 0); return 0; }
int hello_received(struct thread * thread) { struct ospf6_neighbor * on; on = THREAD_ARG(thread); assert(on); printf("Hello Received\n"); /* reset Inactivity Timer */ THREAD_OFF (on->inactivity_timer); on->inactivity_timer = thread_add_timer (master, inactivity_timer, on, on->ospf6_if->dead_interval); if(on->state <= OSPF6_NEIGHBOR_DOWN) ospf6_neighbor_state_change(OSPF6_NEIGHBOR_INIT, on); return 0; }
int ospf6_bfd_down (struct thread *thread) { struct ospf6_neighbor *on; on = (struct ospf6_neighbor *) THREAD_ARG (thread); assert (on); if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) zlog_info ("Neighbor Event %s: *BFD Down*", on->name); on->drouter = on->prev_drouter = 0; on->bdrouter = on->prev_bdrouter = 0; ospf6_neighbor_state_change (OSPF6_NEIGHBOR_DOWN, on); thread_add_event (master, neighbor_change, on->ospf6_if, 0); return 0; }
int loading_done (struct thread *thread) { struct ospf6_neighbor *on; on = (struct ospf6_neighbor *) THREAD_ARG (thread); assert (on); if (on->state != OSPF6_NEIGHBOR_LOADING) return 0; if (IS_OSPF6_SIBLING_DEBUG_NEIGHBOR) zlog_debug ("Neighbor Event %s: *LoadingDone*", on->name); assert (on->request_list->count == 0); ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on); return 0; }
int hello_received (struct thread *thread) { struct ospf6_neighbor *on; on = (struct ospf6_neighbor *) THREAD_ARG (thread); assert (on); if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) zlog_info ("Neighbor Event %s: *HelloReceived*", on->name); /* reset Inactivity Timer */ THREAD_OFF (on->inactivity_timer); on->inactivity_timer = thread_add_timer (master, inactivity_timer, on, on->ospf6_if->dead_interval); if (on->state <= OSPF6_NEIGHBOR_DOWN) ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on); return 0; }
int inactivity_timer(struct thread * thread) { struct ospf6_neighbor * on; on = (struct ospf6_neighbor *) THREAD_ARG(thread); assert(on); if(IS_OSPF6_SIBLING_DEBUG_NEIGHBOR) zlog_debug ("Neighbor Event %s: *InactivityTimer*", on->name); on->inactivity_timer = NULL; on->drouter = on->prev_drouter = 0; on->bdrouter = on->prev_bdrouter = 0; ospf6_neighbor_state_change (OSPF6_NEIGHBOR_DOWN, on); thread_add_event (master, neighbor_change, on->ospf6_if, 0); // remove myself from neighbor list list_remove(&on->node); ospf6_neighbor_delete (on); return 0; }
int inactivity_timer (struct thread *thread) { struct ospf6_neighbor *on; on = (struct ospf6_neighbor *) THREAD_ARG (thread); assert (on); if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) zlog_info ("Neighbor Event %s: *InactivityTimer*", on->name); on->inactivity_timer = NULL; on->drouter = on->prev_drouter = 0; on->bdrouter = on->prev_bdrouter = 0; ospf6_neighbor_state_change (OSPF6_NEIGHBOR_DOWN, on); thread_add_event (master, neighbor_change, on->ospf6_if, 0); listnode_delete (on->ospf6_if->neighbor_list, on); ospf6_neighbor_delete (on); return 0; }
int negotiation_done(struct thread * thread) { struct ospf6_neighbor * on; struct ospf6_lsa * lsa; on = (struct ospf6_neighbor *) THREAD_ARG(thread); assert(on); if(on->state != OSPF6_NEIGHBOR_EXSTART) return 0; if(IS_OSPF6_SIBLING_DEBUG_NEIGHBOR) zlog_debug("Neighbor Event %s: *NegotiationDone*", on->name); /* clear ls-list */ ospf6_lsdb_remove_all(on->summary_list); ospf6_lsdb_remove_all(on->request_list); for(lsa = ospf6_lsdb_head(on->retrans_list); lsa; lsa = ospf6_lsdb_next(lsa)) { ospf6_decrement_retrans_count(lsa); ospf6_lsdb_remove(lsa, on->retrans_list); } /* Interface scoped LSAs */ for(lsa = ospf6_lsdb_head(on->ospf6_if->lsdb); lsa; lsa = ospf6_lsdb_next(lsa)) { if (OSPF6_LSA_IS_MAXAGE (lsa)) { ospf6_increment_retrans_count(lsa); ospf6_lsdb_add(ospf6_lsa_copy(lsa), on->retrans_list); } else ospf6_lsdb_add(ospf6_lsa_copy(lsa), on->summary_list); } /* Area scoped LSAs - no area implemented yet */ // LIST_FOR_EACH(lsa, struct ospf6_lsa, node, on-> ) // { // } /* AS scoped LSAs */ for(lsa = ospf6_lsdb_head(ospf6->lsdb); lsa; lsa = ospf6_lsdb_next(lsa)) { if(OSPF6_LSA_IS_MAXAGE(lsa)) { ospf6_increment_retrans_count(lsa); ospf6_lsdb_add(ospf6_lsa_copy(lsa), on->retrans_list); } else ospf6_lsdb_add(ospf6_lsa_copy(lsa), on->summary_list); } UNSET_FLAG(on->dbdesc_bits, OSPF6_DBDESC_IBIT); ospf6_neighbor_state_change(OSPF6_NEIGHBOR_EXCHANGE, on); return 0; }