Blame src/vma/proto/neighbour.h

Packit Service aa3af4
/*
Packit Service aa3af4
 * Copyright (c) 2001-2020 Mellanox Technologies, Ltd. All rights reserved.
Packit Service aa3af4
 *
Packit Service aa3af4
 * This software is available to you under a choice of one of two
Packit Service aa3af4
 * licenses.  You may choose to be licensed under the terms of the GNU
Packit Service aa3af4
 * General Public License (GPL) Version 2, available from the file
Packit Service aa3af4
 * COPYING in the main directory of this source tree, or the
Packit Service aa3af4
 * BSD license below:
Packit Service aa3af4
 *
Packit Service aa3af4
 *     Redistribution and use in source and binary forms, with or
Packit Service aa3af4
 *     without modification, are permitted provided that the following
Packit Service aa3af4
 *     conditions are met:
Packit Service aa3af4
 *
Packit Service aa3af4
 *      - Redistributions of source code must retain the above
Packit Service aa3af4
 *        copyright notice, this list of conditions and the following
Packit Service aa3af4
 *        disclaimer.
Packit Service aa3af4
 *
Packit Service aa3af4
 *      - Redistributions in binary form must reproduce the above
Packit Service aa3af4
 *        copyright notice, this list of conditions and the following
Packit Service aa3af4
 *        disclaimer in the documentation and/or other materials
Packit Service aa3af4
 *        provided with the distribution.
Packit Service aa3af4
 *
Packit Service aa3af4
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit Service aa3af4
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit Service aa3af4
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Packit Service aa3af4
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Packit Service aa3af4
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Packit Service aa3af4
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit Service aa3af4
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit Service aa3af4
 * SOFTWARE.
Packit Service aa3af4
 */
Packit Service aa3af4
Packit Service aa3af4
Packit Service aa3af4
#ifndef NEIGHBOUR_H
Packit Service aa3af4
#define NEIGHBOUR_H
Packit Service aa3af4
Packit Service aa3af4
#include <rdma/rdma_cma.h>
Packit Service aa3af4
#include <tr1/unordered_map>
Packit Service aa3af4
Packit Service aa3af4
#include "state_machine/sm.h"
Packit Service aa3af4
#include "vma/util/sys_vars.h"
Packit Service aa3af4
#include "vma/util/to_str.h"
Packit Service aa3af4
#include "vma/infra/cache_subject_observer.h"
Packit Service aa3af4
#include "vma/infra/sender.h"
Packit Service aa3af4
#include "vma/event/event_handler_ibverbs.h"
Packit Service aa3af4
#include "vma/event/event_handler_rdma_cm.h"
Packit Service aa3af4
#include "vma/event/event_handler_manager.h"
Packit Service aa3af4
#include "vma/event/timer_handler.h"
Packit Service aa3af4
#include "vma/event/netlink_event.h"
Packit Service aa3af4
#include "vma/proto/ip_address.h"
Packit Service aa3af4
#include "vma/proto/L2_address.h"
Packit Service aa3af4
Packit Service aa3af4
#include "vma/proto/header.h"
Packit Service aa3af4
#include "vma/dev/ring_allocation_logic.h"
Packit Service aa3af4
#include "vma/dev/net_device_val.h"
Packit Service aa3af4
#include "vma/dev/ring.h"
Packit Service aa3af4
#include "vma/proto/arp.h"
Packit Service aa3af4
Packit Service aa3af4
class neigh_key : public tostr
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
	neigh_key(ip_address addr, net_device_val* p_ndvl): m_ip_addrs(addr), m_p_net_dev_val(p_ndvl) {};
Packit Service aa3af4
	virtual ~neigh_key() {};
Packit Service aa3af4
Packit Service aa3af4
	const std::string to_str() const
Packit Service aa3af4
	{
Packit Service aa3af4
		return(m_ip_addrs.to_str() + " " + m_p_net_dev_val->to_str());
Packit Service aa3af4
	}
Packit Service aa3af4
	in_addr_t 	get_in_addr() const { return m_ip_addrs.get_in_addr(); };
Packit Service aa3af4
	net_device_val*	get_net_device_val() const { return m_p_net_dev_val; };
Packit Service aa3af4
Packit Service aa3af4
	virtual size_t 	hash(void)
Packit Service aa3af4
	{
Packit Service aa3af4
		uint8_t csum = 0;
Packit Service aa3af4
		uint8_t* pval = (uint8_t*)this;
Packit Service aa3af4
		for (size_t i = 0; i < sizeof(ip_address); ++i, ++pval) { csum ^= *pval; }
Packit Service aa3af4
		return csum;
Packit Service aa3af4
	}
Packit Service aa3af4
Packit Service aa3af4
	virtual bool operator==(neigh_key const& other) const
Packit Service aa3af4
	{
Packit Service aa3af4
		return ((m_ip_addrs == other.m_ip_addrs) && (m_p_net_dev_val == other.m_p_net_dev_val));
Packit Service aa3af4
	}
Packit Service aa3af4
Packit Service aa3af4
private:
Packit Service aa3af4
	ip_address m_ip_addrs;
Packit Service aa3af4
	net_device_val* m_p_net_dev_val;
Packit Service aa3af4
};
Packit Service aa3af4
Packit Service aa3af4
namespace std { namespace tr1 {
Packit Service aa3af4
template<>
Packit Service aa3af4
class hash<neigh_key>
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
	size_t operator()(const neigh_key &key) const
Packit Service aa3af4
	{
Packit Service aa3af4
		neigh_key* tmp_key = (neigh_key*)&ke;;
Packit Service aa3af4
		return tmp_key->hash();
Packit Service aa3af4
	}
Packit Service aa3af4
};
Packit Service aa3af4
}}
Packit Service aa3af4
Packit Service aa3af4
class neigh_val : public tostr
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
				neigh_val(): m_trans_type(VMA_TRANSPORT_UNKNOWN), m_l2_address(NULL){};
Packit Service aa3af4
	virtual 		~neigh_val(){};
Packit Service aa3af4
Packit Service aa3af4
	virtual void    	zero_all_members()
Packit Service aa3af4
	{ 				if(m_l2_address)
Packit Service aa3af4
						delete m_l2_address;
Packit Service aa3af4
					m_l2_address = NULL;
Packit Service aa3af4
	};
Packit Service aa3af4
	const L2_address*	get_l2_address() const { return m_l2_address; };
Packit Service aa3af4
Packit Service aa3af4
	virtual neigh_val & operator=(const neigh_val & val)
Packit Service aa3af4
	{
Packit Service aa3af4
		if (this != &val) {
Packit Service aa3af4
			m_l2_address = val.m_l2_address;
Packit Service aa3af4
			m_trans_type = val.m_trans_type;
Packit Service aa3af4
		}
Packit Service aa3af4
		return *this;
Packit Service aa3af4
	}
Packit Service aa3af4
Packit Service aa3af4
protected:
Packit Service aa3af4
	friend	class		neigh_entry;
Packit Service aa3af4
	friend  class		neigh_ib;
Packit Service aa3af4
	friend  class		neigh_eth;
Packit Service aa3af4
	friend 	class		neigh_ib_broadcast;
Packit Service aa3af4
	transport_type_t	m_trans_type;
Packit Service aa3af4
	L2_address*		m_l2_address;
Packit Service aa3af4
};
Packit Service aa3af4
Packit Service aa3af4
class neigh_eth_val : public neigh_val
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
	neigh_eth_val()
Packit Service aa3af4
	{
Packit Service aa3af4
		m_trans_type = VMA_TRANSPORT_ETH;
Packit Service aa3af4
		zero_all_members();
Packit Service aa3af4
	}
Packit Service aa3af4
Packit Service aa3af4
	neigh_val & operator=(const neigh_val & val)
Packit Service aa3af4
	{
Packit Service aa3af4
		return neigh_val::operator=(val);
Packit Service aa3af4
	}
Packit Service aa3af4
Packit Service aa3af4
private:
Packit Service aa3af4
	friend	class 		neigh_eth;
Packit Service aa3af4
};
Packit Service aa3af4
Packit Service aa3af4
class neigh_ib_val : public neigh_val
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
				neigh_ib_val() : m_ah(NULL) { zero_all_members(); };
Packit Service aa3af4
Packit Service aa3af4
	ibv_ah* 		get_ah()const		{ return m_ah; };
Packit Service aa3af4
	ibv_ah_attr 		get_ah_attr() const	{ return m_ah_attr; };
Packit Service aa3af4
	uint32_t 		get_qkey() const	{ return m_qkey; };
Packit Service aa3af4
	uint32_t		get_qpn() const
Packit Service aa3af4
	{
Packit Service aa3af4
				if (m_l2_address)
Packit Service aa3af4
					return(((IPoIB_addr *) m_l2_address)->get_qpn());
Packit Service aa3af4
				else
Packit Service aa3af4
					return 0;
Packit Service aa3af4
	}
Packit Service aa3af4
Packit Service aa3af4
	neigh_val & operator=(const neigh_val & val);
Packit Service aa3af4
Packit Service aa3af4
private:
Packit Service aa3af4
	friend			class neigh_ib;
Packit Service aa3af4
	friend 			class neigh_ib_broadcast;
Packit Service aa3af4
Packit Service aa3af4
	ibv_ah_attr		m_ah_attr;
Packit Service aa3af4
	ibv_ah*			m_ah;
Packit Service aa3af4
	uint32_t		m_qkey;
Packit Service aa3af4
Packit Service aa3af4
	void 			zero_all_members()
Packit Service aa3af4
	{
Packit Service aa3af4
				memset(&m_ah_attr, 0, sizeof(m_ah_attr));
Packit Service aa3af4
				//m_ah 	= NULL;
Packit Service aa3af4
				m_qkey 	= 0;
Packit Service aa3af4
				neigh_val::zero_all_members();
Packit Service aa3af4
	}
Packit Service aa3af4
};
Packit Service aa3af4
Packit Service aa3af4
/* neigh_entry inherits from cache_entry_subject where
Packit Service aa3af4
 * Key = address (peer IP)
Packit Service aa3af4
 * Val = class neigh_val
Packit Service aa3af4
 */
Packit Service aa3af4
typedef std::deque<neigh_send_data *> unsent_queue_t;
Packit Service aa3af4
Packit Service aa3af4
class neigh_entry : public cache_entry_subject<neigh_key, neigh_val *>, public event_handler_rdma_cm, public timer_handler
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
	enum type
Packit Service aa3af4
	{
Packit Service aa3af4
		UNKNOWN,
Packit Service aa3af4
		MC,
Packit Service aa3af4
		UC
Packit Service aa3af4
	};
Packit Service aa3af4
Packit Service aa3af4
	enum state_t
Packit Service aa3af4
	{
Packit Service aa3af4
		ST_NOT_ACTIVE = 0,
Packit Service aa3af4
		ST_INIT = 1,
Packit Service aa3af4
		ST_INIT_RESOLUTION,
Packit Service aa3af4
		ST_ADDR_RESOLVED,
Packit Service aa3af4
		ST_ARP_RESOLVED,
Packit Service aa3af4
		ST_PATH_RESOLVED,
Packit Service aa3af4
		ST_READY,
Packit Service aa3af4
		ST_ERROR,
Packit Service aa3af4
		ST_LAST
Packit Service aa3af4
	};
Packit Service aa3af4
Packit Service aa3af4
	enum event_t
Packit Service aa3af4
	{
Packit Service aa3af4
		EV_KICK_START = 0,
Packit Service aa3af4
		EV_START_RESOLUTION,
Packit Service aa3af4
		EV_ARP_RESOLVED,
Packit Service aa3af4
		EV_ADDR_RESOLVED,
Packit Service aa3af4
		EV_PATH_RESOLVED,
Packit Service aa3af4
		EV_ERROR,
Packit Service aa3af4
		EV_TIMEOUT_EXPIRED, // For IB MC join
Packit Service aa3af4
		EV_UNHANDLED,
Packit Service aa3af4
		EV_LAST
Packit Service aa3af4
	};
Packit Service aa3af4
Packit Service aa3af4
	friend 	class		neighbour_table_mgr;
Packit Service aa3af4
Packit Service aa3af4
	neigh_entry (neigh_key key, transport_type_t type, bool is_init_resources = true);
Packit Service aa3af4
	virtual 		~neigh_entry();
Packit Service aa3af4
Packit Service aa3af4
	//Overwrite cach_entry virtual function
Packit Service aa3af4
	virtual bool 		is_deletable();
Packit Service aa3af4
	virtual void 		clean_obj();
Packit Service aa3af4
Packit Service aa3af4
	//Implementation of pure virtual function: Don't use get_val function, instead use get_peer_info
Packit Service aa3af4
	virtual bool 		get_val(INOUT neigh_val * & val){ NOT_IN_USE(val); return false;};
Packit Service aa3af4
Packit Service aa3af4
	virtual bool 		get_peer_info(neigh_val * val);
Packit Service aa3af4
	// Overriding subject's register_observer
Packit Service aa3af4
	virtual bool 		register_observer(const observer* const new_observer);
Packit Service aa3af4
	//Overriding tostr to_str()
Packit Service aa3af4
	virtual const std::string to_str() const;
Packit Service aa3af4
Packit Service aa3af4
	const char* 		event_to_str(event_t event) const;
Packit Service aa3af4
	const char* 		state_to_str(state_t state) const;
Packit Service aa3af4
Packit Service aa3af4
	void    		handle_event_rdma_cm_cb(struct rdma_cm_event* p_event);
Packit Service aa3af4
	void			handle_neigh_event(neigh_nl_event* nl_ev);
Packit Service aa3af4
Packit Service aa3af4
	static void		general_st_entry(const sm_info_t& func_info);
Packit Service aa3af4
	static void		general_st_leave(const sm_info_t& func_info);
Packit Service aa3af4
	static void 		print_event_info(int state, int event, void* app_data);
Packit Service aa3af4
	static void 		dofunc_enter_init(const sm_info_t& func_info);
Packit Service aa3af4
	static void 		dofunc_enter_init_resolution(const sm_info_t& func_info);
Packit Service aa3af4
	static void 		dofunc_enter_addr_resolved(const sm_info_t& func_info);
Packit Service aa3af4
	static void 		dofunc_enter_error(const sm_info_t& func_info);
Packit Service aa3af4
	static void		dofunc_enter_not_active(const sm_info_t& func_info);
Packit Service aa3af4
	static void		dofunc_enter_ready(const sm_info_t& func_info);
Packit Service aa3af4
Packit Service aa3af4
	//Implementing pure virtual function of sender
Packit Service aa3af4
	virtual int		send(neigh_send_info &s_info);
Packit Service aa3af4
Packit Service aa3af4
protected:
Packit Service aa3af4
	rdma_cm_id*		m_cma_id;
Packit Service aa3af4
	sockaddr_in  		m_dst_addr;
Packit Service aa3af4
	sockaddr_in  		m_src_addr;
Packit Service aa3af4
	enum rdma_port_space 	m_rdma_port_space;
Packit Service aa3af4
	state_machine*		m_state_machine;
Packit Service aa3af4
	type			m_type; // UC  / MC
Packit Service aa3af4
	transport_type_t	m_trans_type;
Packit Service aa3af4
	bool			m_state;
Packit Service aa3af4
	unsent_queue_t 		m_unsent_queue;
Packit Service aa3af4
	//Counter to sign that KickStart was already generated in ERROR_ST
Packit Service aa3af4
	uint32_t 		m_err_counter;
Packit Service aa3af4
Packit Service aa3af4
	void*			m_timer_handle;
Packit Service aa3af4
	// members for sending arp
Packit Service aa3af4
	uint32_t		m_arp_counter;
Packit Service aa3af4
	net_device_val*		m_p_dev;
Packit Service aa3af4
	ring* 			m_p_ring;
Packit Service aa3af4
	vma_ibv_send_wr 	m_send_wqe;
Packit Service aa3af4
	ibv_sge 		m_sge;
Packit Service aa3af4
	bool 			m_is_loopback;
Packit Service aa3af4
Packit Service aa3af4
	const std::string	m_to_str;
Packit Service aa3af4
	ring_user_id_t		m_id;
Packit Service aa3af4
Packit Service aa3af4
	virtual void 		priv_general_st_entry(const sm_info_t& func_info);
Packit Service aa3af4
	virtual void 		priv_general_st_leave(const sm_info_t& func_info);
Packit Service aa3af4
	virtual void		priv_print_event_info(state_t state, event_t event);
Packit Service aa3af4
	virtual void		priv_kick_start_sm();
Packit Service aa3af4
	virtual void		priv_enter_not_active();
Packit Service aa3af4
	virtual void		priv_enter_error();
Packit Service aa3af4
	virtual int 		priv_enter_init();
Packit Service aa3af4
	virtual int 		priv_enter_init_resolution();
Packit Service aa3af4
	virtual int 		priv_enter_addr_resolved();
Packit Service aa3af4
	virtual int 		priv_enter_ready();
Packit Service aa3af4
Packit Service aa3af4
	bool 			priv_get_neigh_state(int & state);
Packit Service aa3af4
	bool 			priv_get_neigh_l2(address_t & l2_addr);
Packit Service aa3af4
	bool 			priv_is_reachable(int state) { return state & (NUD_REACHABLE | NUD_PERMANENT); }
Packit Service aa3af4
	bool 			priv_is_failed(int state) { return state & (NUD_FAILED | NUD_INCOMPLETE); }
Packit Service aa3af4
Packit Service aa3af4
	void			event_handler(event_t event, void* p_event_info = NULL);
Packit Service aa3af4
	void			priv_event_handler_no_locks(event_t event, void* p_event_info = NULL);
Packit Service aa3af4
Packit Service aa3af4
	virtual bool 		priv_handle_neigh_is_l2_changed(address_t) { return false; };
Packit Service aa3af4
	void 			priv_handle_neigh_reachable_event();
Packit Service aa3af4
	void 			priv_destroy_cma_id();
Packit Service aa3af4
	virtual void* 		priv_register_timer_event(int timeout_msec, timer_handler* handler, timer_req_type_t req_type, void* user_data);
Packit Service aa3af4
	void			priv_unregister_timer();
Packit Service aa3af4
Packit Service aa3af4
	virtual void 		send_arp();
Packit Service aa3af4
	virtual bool 		post_send_arp(bool) { return true;};
Packit Service aa3af4
	virtual bool 		prepare_to_send_packet(header *) {return true;};
Packit Service aa3af4
	void			handle_timer_expired(void* user_data);
Packit Service aa3af4
Packit Service aa3af4
	virtual ring_user_id_t	generate_ring_user_id(header *h = NULL) { NOT_IN_USE(h); return m_p_ring->generate_id(); };
Packit Service aa3af4
Packit Service aa3af4
	lock_mutex_recursive    m_sm_lock;
Packit Service aa3af4
Packit Service aa3af4
private:
Packit Service aa3af4
	bool 			m_is_first_send_arp;
Packit Service aa3af4
	const uint32_t		m_n_sysvar_neigh_wait_till_send_arp_msec;
Packit Service aa3af4
	const uint32_t		m_n_sysvar_neigh_uc_arp_quata;
Packit Service aa3af4
	const uint32_t		m_n_sysvar_neigh_num_err_retries;
Packit Service aa3af4
	ring_allocation_logic_tx m_ring_allocation_logic;
Packit Service aa3af4
	event_t 		rdma_event_mapping(struct rdma_cm_event* p_event);
Packit Service aa3af4
	void 			empty_unsent_queue();
Packit Service aa3af4
	bool 			post_send_packet(neigh_send_data *n_send_data);
Packit Service aa3af4
	bool			post_send_udp(neigh_send_data *n_send_data);
Packit Service aa3af4
	bool			post_send_tcp(neigh_send_data *n_send_data);
Packit Service aa3af4
};
Packit Service aa3af4
Packit Service aa3af4
class neigh_ib : public neigh_entry, public event_handler_ibverbs
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
	friend 	class		neighbour_table_mgr;
Packit Service aa3af4
				neigh_ib(neigh_key key, bool is_init_resources = true);
Packit Service aa3af4
				~neigh_ib();
Packit Service aa3af4
Packit Service aa3af4
	static void		dofunc_enter_arp_resolved(const sm_info_t& func_info);
Packit Service aa3af4
	static void		dofunc_enter_path_resolved(const sm_info_t& func_info);
Packit Service aa3af4
Packit Service aa3af4
protected:
Packit Service aa3af4
	ibv_pd* 		m_pd;
Packit Service aa3af4
Packit Service aa3af4
	int			find_pd();
Packit Service aa3af4
	int			create_ah();
Packit Service aa3af4
	int			destroy_ah();
Packit Service aa3af4
	virtual int 		build_mc_neigh_val(struct rdma_cm_event* event_data, uint32_t & wait_after_join_msec);
Packit Service aa3af4
Packit Service aa3af4
private:
Packit Service aa3af4
Packit Service aa3af4
	//Implementation of pure virtual functions
Packit Service aa3af4
	void			handle_event_ibverbs_cb(void* ev_data, void* ctx);
Packit Service aa3af4
	void			handle_timer_expired(void* user_data);
Packit Service aa3af4
Packit Service aa3af4
	// Overriding neigh_entry priv_enter_not_active
Packit Service aa3af4
	void			priv_enter_not_active();
Packit Service aa3af4
	void 			priv_enter_error();
Packit Service aa3af4
	int			priv_enter_arp_resolved();
Packit Service aa3af4
	int 			priv_enter_path_resolved(struct rdma_cm_event* event_data, uint32_t & wait_after_join_msec);
Packit Service aa3af4
	virtual bool		priv_handle_neigh_is_l2_changed(address_t);
Packit Service aa3af4
	// Overriding neigh_entry priv_enter_ready
Packit Service aa3af4
	int			priv_enter_ready();
Packit Service aa3af4
Packit Service aa3af4
	int			handle_enter_arp_resolved_uc();
Packit Service aa3af4
	int			handle_enter_arp_resolved_mc();
Packit Service aa3af4
	int 			build_uc_neigh_val(struct rdma_cm_event* event_data, uint32_t & wait_after_join_msec);
Packit Service aa3af4
Packit Service aa3af4
	event_t 		ibverbs_event_mapping(void* p_event_info);
Packit Service aa3af4
	virtual bool 		post_send_arp(bool);
Packit Service aa3af4
	virtual bool 		prepare_to_send_packet(header *);
Packit Service aa3af4
Packit Service aa3af4
	const uint32_t		m_n_sysvar_wait_after_join_msec;
Packit Service aa3af4
};
Packit Service aa3af4
Packit Service aa3af4
class neigh_ib_broadcast : public neigh_ib
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
				neigh_ib_broadcast(neigh_key key);
Packit Service aa3af4
	virtual int		send(neigh_send_info & s_info);
Packit Service aa3af4
	virtual bool 		get_peer_info(neigh_val * p_val);
Packit Service aa3af4
	virtual bool 		is_deletable() { return false; };
Packit Service aa3af4
Packit Service aa3af4
private:
Packit Service aa3af4
	void 			build_mc_neigh_val();
Packit Service aa3af4
	virtual void 		send_arp();
Packit Service aa3af4
};
Packit Service aa3af4
Packit Service aa3af4
class neigh_eth : public neigh_entry
Packit Service aa3af4
{
Packit Service aa3af4
public:
Packit Service aa3af4
	friend 	class		neighbour_table_mgr;
Packit Service aa3af4
				neigh_eth(neigh_key key);
Packit Service aa3af4
				~neigh_eth();
Packit Service aa3af4
	virtual bool 		get_peer_info(neigh_val * val);
Packit Service aa3af4
	//Overriding neigh_entry register_observer
Packit Service aa3af4
	bool 			register_observer(const observer* const new_observer);
Packit Service aa3af4
	//Overriding neigh_entry is_deletable
Packit Service aa3af4
	virtual bool 		is_deletable();
Packit Service aa3af4
Packit Service aa3af4
protected:
Packit Service aa3af4
	virtual ring_user_id_t	generate_ring_user_id(header * h = NULL);
Packit Service aa3af4
Packit Service aa3af4
private:
Packit Service aa3af4
Packit Service aa3af4
	int 			build_mc_neigh_val();
Packit Service aa3af4
	int			build_uc_neigh_val();
Packit Service aa3af4
	//Overriding neigh_entry priv_enter_ready
Packit Service aa3af4
	virtual int 		priv_enter_ready();
Packit Service aa3af4
	virtual int 		priv_enter_init();
Packit Service aa3af4
	virtual int 		priv_enter_init_resolution();
Packit Service aa3af4
	virtual bool 		priv_handle_neigh_is_l2_changed(address_t);
Packit Service aa3af4
	virtual bool 		post_send_arp(bool is_broadcast);
Packit Service aa3af4
	virtual bool 		prepare_to_send_packet(header *);
Packit Service aa3af4
};
Packit Service aa3af4
Packit Service aa3af4
#endif /* NEIGHBOUR_H */