1. start an ospf process a. data structure ospf_master{} |--ospf--ospf{} b. main routines router_ospf |--ospf_get |--ospf_new |--ospf_lsa_maxage_walker |--ospf_lsa_refresh_walker |--ospf_sock_init |--ospf_read c.notes -there is only one router ospf process, but cisco can have many ospf process. 2. set a network area a. data structure ospf{} <--| <--| |--networks--ospf_network{} | | |--areas--ospf_area{} ---| | |--oiflist--ospf_interface{} ---| |--nbrs--ospf_neighbor{} |--nbr_self--ospf_neighbor{} b. main routines ospf_network_area |--ospf_network_set |--ospf_if_new |--ospf_nbr_add_self |--ospf_network_run |--ospf_if_up |--OSPF_ISM_EVENT_SCHEDULE (ISM_InterfaceUp) |--ospf_ism_event(ISM_Down-->ISM_Waiting) ospf_if_new: construct an ospf_interface and a pseudo self ospf_neighbor (its state is always NSM_TwoWay) ospf_nbr_add_self: add self ospf_neighbor to ospf_interface{}--nbrs ospf_ism_event (ISM_Down-->ISM_Waiting) |--ism_interface_up |--ism_change_state |--ospf_check_abr_status |--ospf_router_lsa_timer_add |--ism_timer_set (ISM_Waiting) |--OSPF_ISM_TIMER_ON (ospf_hello_timer) |--OSPF_ISM_TIMER_ON (ospf_wait_timer) ospf_wait_timer |--OSPF_ISM_EVENT_SCHEDULE (ISM_WaitTimer) |--ospf_ism_event (ISM_Waiting-->ISM_DR) |--ism_wait_timer |--ospf_dr_election |--ism_change_state |--ospf_network_lsa_timer_add |--ism_timer_set (ISM_DR) |--OSPF_ISM_TIMER_ON (ospf_hello_timer) |--OSPF_ISM_TIMER_ON (ospf_ls_ack_timer); 3. interact with a neighbor situation: after the router become DR, start the other router a. data structure b. main routines ospf_hello |--ospf_nbr_get |--ospf_nbr_add |--ospf_nbr_new |--nbr->state = NSM_Down |--OSPF_NSM_EVENT_EXECUTE (NSM_HelloReceived) |--ospf_nsm_event (NSM_Down-->NSM_Init) |--nsm_hello_received |--nsm_change_state |--OSPF_ISM_TIMER_ON (oi->t_hello, ospf_hello_timer, 1) if the router can see itself in the neighbor hello packet then |--OSPF_NSM_EVENT_EXECUTE (NSM_TwoWayReceived) |--ospf_nsm_event |--nsm_twoway_received (NSM_Init-->NSM_ExStart) |--nsm_change_state |--ospf_db_desc_send () |--OSPF_ISM_EVENT_EXECUTE (ISM_NeighborChange) |--ospf_ism_event (ISM_DR) |--ospf_dr_election if the router can not see itself in the neighbor hello packet then |--OSPF_NSM_EVENT_EXECUTE (NSM_OneWayReceived) |--ospf_nsm_event (NSM_Init-->NSM_Init) after the router receive db desc packet from the neighbor. ospf_db_desc |--OSPF_NSM_EVENT_EXECUTE (NSM_TwoWayReceived) 
|