#include <infiniband/verbs.h> int ibv_query_device(struct ibv_context *context, struct ibv_device_attr *device_attr);
struct ibv_device_attr { char fw_ver[64]; /* FW version */ uint64_t node_guid; /* Node GUID (in network byte order) */ uint64_t sys_image_guid; /* System image GUID (in network byte order) */ uint64_t max_mr_size; /* Largest contiguous block that can be registered */ uint64_t page_size_cap; /* Supported memory shift sizes */ uint32_t vendor_id; /* Vendor ID, per IEEE */ uint32_t vendor_part_id; /* Vendor supplied part ID */ uint32_t hw_ver; /* Hardware version */ int max_qp; /* Maximum number of supported QPs */ int max_qp_wr; /* Maximum number of outstanding WR on any work queue */ unsigned int device_cap_flags; /* HCA capabilities mask */ int max_sge; /* Maximum number of s/g per WR for SQ & RQ of QP for non RDMA Read operations */ int max_sge_rd; /* Maximum number of s/g per WR for RDMA Read operations */ int max_cq; /* Maximum number of supported CQs */ int max_cqe; /* Maximum number of CQE capacity per CQ */ int max_mr; /* Maximum number of supported MRs */ int max_pd; /* Maximum number of supported PDs */ int max_qp_rd_atom; /* Maximum number of RDMA Read & Atomic operations that can be outstanding per QP */ int max_ee_rd_atom; /* Maximum number of RDMA Read & Atomic operations that can be outstanding per EEC */ int max_res_rd_atom; /* Maximum number of resources used for RDMA Read & Atomic operations by this HCA as the Target */ int max_qp_init_rd_atom; /* Maximum depth per QP for initiation of RDMA Read & Atomic operations */ int max_ee_init_rd_atom; /* Maximum depth per EEC for initiation of RDMA Read & Atomic operations */ enum ibv_atomic_cap atomic_cap; /* Atomic operations support level */ int max_ee; /* Maximum number of supported EE contexts */ int max_rdd; /* Maximum number of supported RD domains */ int max_mw; /* Maximum number of supported MWs */ int max_raw_ipv6_qp; /* Maximum number of supported raw IPv6 datagram QPs */ int max_raw_ethy_qp; /* Maximum number of supported Ethertype datagram QPs */ int max_mcast_grp; /* Maximum number of supported multicast groups */ int max_mcast_qp_attach; /* Maximum number of QPs per multicast group which can be attached */ int max_total_mcast_qp_attach;/* Maximum number of QPs which can be attached to multicast groups */ int max_ah; /* Maximum number of supported address handles */ int max_fmr; /* Maximum number of supported FMRs */ int max_map_per_fmr; /* Maximum number of (re)maps per FMR before an unmap operation in required */ int max_srq; /* Maximum number of supported SRQs */ int max_srq_wr; /* Maximum number of WRs per SRQ */ int max_srq_sge; /* Maximum number of s/g per SRQ */ uint16_t max_pkeys; /* Maximum number of partitions */ uint8_t local_ca_ack_delay; /* Local CA ack delay */ uint8_t phys_port_cnt; /* Number of physical ports */ };