#include <infiniband/verbs.h> int ibv_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, int attr_mask, struct ibv_qp_init_attr *init_attr);
struct ibv_qp_attr {
enum ibv_qp_state       qp_state;            /* Current QP state */
enum ibv_qp_state       cur_qp_state;        /* Current QP state - irrelevant for ibv_query_qp */
enum ibv_mtu            path_mtu;            /* Path MTU (valid only for RC/UC QPs) */
enum ibv_mig_state      path_mig_state;      /* Path migration state (valid if HCA supports APM) */
uint32_t                qkey;                /* Q_Key of the QP (valid only for UD QPs) */
uint32_t                rq_psn;              /* PSN for receive queue (valid only for RC/UC QPs) */
uint32_t                sq_psn;              /* PSN for send queue */
uint32_t                dest_qp_num;         /* Destination QP number (valid only for RC/UC QPs) */
unsigned int            qp_access_flags;     /* Mask of enabled remote access operations (valid only for RC/UC QPs) */
struct ibv_qp_cap       cap;                 /* QP capabilities */
struct ibv_ah_attr      ah_attr;             /* Primary path address vector (valid only for RC/UC QPs) */
struct ibv_ah_attr      alt_ah_attr;         /* Alternate path address vector (valid only for RC/UC QPs) */
uint16_t                pkey_index;          /* Primary P_Key index */
uint16_t                alt_pkey_index;      /* Alternate P_Key index */
uint8_t                 en_sqd_async_notify; /* Enable SQD.drained async notification - irrelevant for ibv_query_qp */
uint8_t                 sq_draining;         /* Is the QP draining? (Valid only if qp_state is SQD) */
uint8_t                 max_rd_atomic;       /* Number of outstanding RDMA reads & atomic operations on the destination QP (valid only for RC QPs) */
uint8_t                 max_dest_rd_atomic;  /* Number of responder resources for handling incoming RDMA reads & atomic operations (valid only for RC QPs) */
uint8_t                 min_rnr_timer;       /* Minimum RNR NAK timer (valid only for RC QPs) */
uint8_t                 port_num;            /* Primary port number */
uint8_t                 timeout;             /* Local ack timeout for primary path (valid only for RC QPs) */
uint8_t                 retry_cnt;           /* Retry count (valid only for RC QPs) */
uint8_t                 rnr_retry;           /* RNR retry (valid only for RC QPs) */
uint8_t                 alt_port_num;        /* Alternate port number */
uint8_t                 alt_timeout;         /* Local ack timeout for alternate path (valid only for RC QPs) */
};
For details on struct ibv_qp_cap see the description of ibv_create_qp(). For details on struct ibv_ah_attr see the description of ibv_create_ah().
Attribute values are valid if they have been set using ibv_modify_qp(). The exact list of valid attributes depends on the QP state.
Multiple calls to ibv_query_qp() may yield some differences in the values returned for the following attributes: qp_state, path_mig_state, sq_draining, ah_attr (if APM is enabled).