//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; }
dst_entry_udp_mc::dst_entry_udp_mc(in_addr_t dst_ip, uint16_t dst_port, uint16_t src_port, in_addr_t tx_if_ip, bool mc_b_loopback, uint8_t mc_ttl, int owner_fd) : dst_entry_udp(dst_ip, dst_port, src_port, owner_fd), m_mc_tx_if_ip(tx_if_ip), m_b_mc_loopback_enabled(mc_b_loopback) { m_ttl = mc_ttl; dst_udp_mc_logdbg("%s", to_str().c_str()); }
dst_entry_udp_mc::dst_entry_udp_mc(in_addr_t dst_ip, uint16_t dst_port, uint16_t src_port, in_addr_t tx_if_ip, bool mc_b_loopback ,socket_data &sock_data, resource_allocation_key &ring_alloc_logic): dst_entry_udp(dst_ip, dst_port, src_port, sock_data, ring_alloc_logic), m_mc_tx_if_ip(tx_if_ip), m_b_mc_loopback_enabled(mc_b_loopback) { dst_udp_mc_logdbg("%s", to_str().c_str()); }
//The following function supposed to be called under m_lock bool dst_entry_udp_mc::get_net_dev_val() { bool ret_val = false; if (m_p_rt_entry) { dst_udp_mc_logfunc("%s Using rt table to get netdev", to_str().c_str()); ret_val = m_p_rt_entry->get_val(m_p_rt_val); } else { if (m_p_net_dev_entry) { ret_val = m_p_net_dev_entry->get_val(m_p_net_dev_val); dst_udp_mc_logfunc("%s Using directly netdev entry to get net_dev", to_str().c_str()); ret_val = true; } else { dst_udp_mc_logdbg("%s netdev is not offloaded", to_str().c_str()); } } return ret_val; }
dst_entry_udp_mc::~dst_entry_udp_mc() { dst_udp_mc_logdbg("%s", to_str().c_str()); }