//The following function supposed to be called under m_lock bool dst_entry_udp_mc::resolve_net_dev() { bool ret_val = false; cache_entry_subject<ip_address, net_device_val*>* p_ces = NULL; if (m_mc_tx_if_ip.get_in_addr() != INADDR_ANY && !m_mc_tx_if_ip.is_mc()) { if(m_p_net_dev_entry == NULL && g_p_net_device_table_mgr->register_observer(m_mc_tx_if_ip.get_in_addr(), this, &p_ces)) { m_p_net_dev_entry = dynamic_cast<net_device_entry*>(p_ces); } if (m_p_net_dev_entry) { m_p_net_dev_entry->get_val(m_p_net_dev_val); if (m_p_net_dev_val && m_p_net_dev_val->is_valid()) { ret_val = alloc_transport_dep_res(); } else { dst_udp_mc_logdbg("Valid netdev value not found"); } } else { m_b_is_offloaded = false; dst_udp_mc_logdbg("Netdev is not offloaded fallback to OS"); } } else { ret_val = dst_entry::resolve_net_dev(); } return ret_val; }
bool dst_entry::update_net_dev_val() { bool ret_val = false; if (m_p_rt_entry && (m_p_net_dev_val != m_p_rt_entry->get_net_dev_val())) { dst_logdbg("updating net_device"); // Change the net_device, clean old resources... release_ring(); // Save the new net_device m_p_net_dev_val = m_p_rt_entry->get_net_dev_val(); if (m_p_net_dev_val) { // more resource clean and alloc... ret_val = alloc_transport_dep_res(); } else { dst_logdbg("Netdev is not offloaded fallback to OS"); } } else { if (m_p_net_dev_val) { // Only if we already had a valid net_device_val which did not change dst_logdbg("no change in net_device"); ret_val = true; } else { dst_logdbg("Netdev is not offloaded fallback to OS"); } } return ret_val; }
bool dst_entry::update_net_dev_val() { bool ret_val = false; net_device_val* new_nd_val = m_p_net_dev_val; if (m_so_bindtodevice_ip && g_p_net_device_table_mgr) { new_nd_val = g_p_net_device_table_mgr->get_net_device_val(m_so_bindtodevice_ip); // TODO should we register to g_p_net_device_table_mgr with m_p_net_dev_entry? // what should we do with an old one? dst_logdbg("getting net_dev_val by bindtodevice ip"); } else if (m_p_rt_entry) { new_nd_val = m_p_rt_entry->get_net_dev_val(); } if (m_p_net_dev_val != new_nd_val) { dst_logdbg("updating net_device"); if (m_p_neigh_entry) { g_p_neigh_table_mgr->unregister_observer(neigh_key(m_dst_ip, m_p_net_dev_val),this); m_p_neigh_entry = NULL; } // Change the net_device, clean old resources... release_ring(); // Save the new net_device m_p_net_dev_val = new_nd_val; if (m_p_net_dev_val) { // more resource clean and alloc... ret_val = alloc_transport_dep_res(); } else { dst_logdbg("Netdev is not offloaded fallback to OS"); } } else { if (m_p_net_dev_val) { // Only if we already had a valid net_device_val which did not change dst_logdbg("no change in net_device"); ret_val = true; } else { dst_logdbg("Netdev is not offloaded fallback to OS"); } } return ret_val; }