Esempio n. 1
0
//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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}