func (qp *queuePair) Init() error { attr := C.struct_ibv_qp_attr{} attr.qp_state = C.IBV_QPS_INIT attr.pkey_index = 0 attr.port_num = C.uint8_t(qp.port) // allow RDMA write attr.qp_access_flags = IBV_ACCESS_REMOTE_WRITE mask := C.IBV_QP_STATE | C.IBV_QP_PKEY_INDEX | C.IBV_QP_PORT | C.IBV_QP_ACCESS_FLAGS return qp.modify(&attr, mask) }
func (qp *queuePair) ReadyToSend() error { attr := C.struct_ibv_qp_attr{} attr.qp_state = C.IBV_QPS_RTS // Local ack timeout for primary path. // Timeout is calculated as 4.096e-6*(2**attr.timeout) seconds. attr.timeout = 14 // Retry count (7 means forever) attr.retry_cnt = 6 // RNR retry (7 means forever) attr.rnr_retry = 6 attr.sq_psn = C.uint32_t(qp.psn) // this must be > 0 to avoid IBV_WC_REM_INV_REQ_ERR attr.max_rd_atomic = 1 mask := C.IBV_QP_STATE | C.IBV_QP_TIMEOUT | C.IBV_QP_RETRY_CNT | C.IBV_QP_RNR_RETRY | C.IBV_QP_SQ_PSN | C.IBV_QP_MAX_QP_RD_ATOMIC return qp.modify(&attr, mask) }
func (qp *queuePair) ReadyToReceive(destLid uint16, destQpn, destPsn uint32) error { attr := C.struct_ibv_qp_attr{} attr.qp_state = C.IBV_QPS_RTR attr.path_mtu = C.IBV_MTU_2048 attr.dest_qp_num = C.uint32_t(destQpn) attr.rq_psn = C.uint32_t(destPsn) // this must be > 0 to avoid IBV_WC_REM_INV_REQ_ERR attr.max_dest_rd_atomic = 1 // Minimum RNR NAK timer (range 0..31) attr.min_rnr_timer = 26 attr.ah_attr.is_global = 0 attr.ah_attr.dlid = C.uint16_t(destLid) attr.ah_attr.sl = 0 attr.ah_attr.src_path_bits = 0 attr.ah_attr.port_num = C.uint8_t(qp.port) mask := C.IBV_QP_STATE | C.IBV_QP_AV | C.IBV_QP_PATH_MTU | C.IBV_QP_DEST_QPN | C.IBV_QP_RQ_PSN | C.IBV_QP_MAX_DEST_RD_ATOMIC | C.IBV_QP_MIN_RNR_TIMER return qp.modify(&attr, mask) }
func (qp *queuePair) Error() error { attr := C.struct_ibv_qp_attr{} attr.qp_state = C.IBV_QPS_ERR mask := C.IBV_QP_STATE return qp.modify(&attr, mask) }