|
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 */
|