bool neigh_table_mgr::register_observer(neigh_key key, const cache_observer *new_observer, cache_entry_subject<neigh_key, class neigh_val*> **cache_entry) { //Register to netlink event handler only if this is the first entry if (get_cache_tbl_size() == 0) { g_p_netlink_handler->register_event(nlgrpNEIGH, this); neigh_mgr_logdbg("Registered to g_p_netlink_handler"); } return cache_table_mgr<neigh_key, class neigh_val*>::register_observer(key, new_observer, cache_entry); }
neigh_entry* neigh_table_mgr::create_new_entry(neigh_key neigh_key, const observer* new_observer) { observer * tmp = const_cast<observer *>(new_observer); const neigh_observer * dst = dynamic_cast<const neigh_observer *>(tmp) ; BULLSEYE_EXCLUDE_BLOCK_START if (dst == NULL) { //TODO: Need to add handling of this case neigh_mgr_logpanic("dynamic_casr failed, new_observer type is not neigh_observer"); } BULLSEYE_EXCLUDE_BLOCK_END transport_type_t transport = dst->get_obs_transport_type(); //Register to netlink event handler only if this is the first entry if (get_cache_tbl_size() == 0) { g_p_netlink_handler->register_event(nlgrpNEIGH, this); neigh_mgr_logdbg("Registered to g_p_netlink_handler"); } if (transport == VMA_TRANSPORT_IB) { if(IS_BROADCAST_N(neigh_key.get_in_addr())){ neigh_mgr_logdbg("Creating new neigh_ib_broadcast"); return (new neigh_ib_broadcast(neigh_key)); } neigh_mgr_logdbg("Creating new neigh_ib"); return (new neigh_ib(neigh_key)); } else if (transport == VMA_TRANSPORT_ETH) { neigh_mgr_logdbg("Creating new neigh_eth"); return (new neigh_eth(neigh_key)); } else { neigh_mgr_logdbg("Cannot create new entry, transport type is UNKNOWN"); return NULL; } }