// Copyright (c) Vitaliy Filippov, 2019+ // License: VNPL-1.1 or GNU GPL-2.0+ (see README.md for details) #pragma once #include #include #include #include "allocator.h" #include "freelist.h" #include "osd_ops.h" struct osd_op_t; struct msgr_rdma_address_t { ibv_gid gid; uint16_t lid; uint32_t qpn; uint32_t psn; std::string to_string(); static bool from_string(const char *str, msgr_rdma_address_t *dest); }; struct msgr_rdma_context_t { ibv_context *context = NULL; ibv_device *dev = NULL; ibv_device_attr_ex attrx; ibv_pd *pd = NULL; ibv_mr *mr = NULL; ibv_comp_channel *channel = NULL; ibv_cq *cq = NULL; ibv_port_attr portinfo; uint8_t ib_port; uint8_t gid_index; uint16_t my_lid; ibv_gid my_gid; uint32_t mtu; int max_cqe = 0; int used_max_cqe = 0; static msgr_rdma_context_t *create(const char *ib_devname, uint8_t ib_port, uint8_t gid_index, uint32_t mtu, int log_level); ~msgr_rdma_context_t(); }; struct msgr_rdma_out_pos_t { uint64_t data_pos, data_size; }; struct msgr_rdma_cmd_t { uint8_t header[OSD_PACKET_SIZE]; msgr_rdma_out_pos_t pos; }; struct msgr_rdma_connection_t { msgr_rdma_context_t *ctx = NULL; ibv_qp *qp = NULL; msgr_rdma_address_t addr; int max_send = 0, max_recv = 0, max_sge = 0; int cur_send = 0, cur_recv = 0; uint64_t op_slots = 0, op_memory = 0; ibv_mr *in_data_mr = NULL, *in_op_mr = NULL; msgr_rdma_cmd_t *in_ops = NULL; int in_op_cap = 0; void *in_data_buf = NULL; std::vector in_slots_freed; uint32_t out_data_rkey = 0, out_op_rkey = 0; uint64_t out_op_slots = 0, out_op_memory = 0; allocator *out_op_alloc = NULL; freelist_allocator_t out_data_alloc; msgr_rdma_out_pos_t *out_slot_data = NULL; osd_op_t **out_slot_ops = NULL; ~msgr_rdma_connection_t(); static msgr_rdma_connection_t *create(msgr_rdma_context_t *ctx, uint32_t max_send, uint32_t max_recv, uint32_t max_sge, uint64_t op_slots, uint64_t op_memory); int connect(msgr_rdma_address_t *dest); void set_out_capacity(uint32_t out_data_rkey, uint32_t out_op_rkey, uint64_t out_op_slots, uint64_t out_op_memory); };