struct verbs_qp *qp, struct ibv_qp_init_attr_ex *attr_ex,
struct ibv_create_qp *cmd, size_t cmd_size,
struct ibv_create_qp_resp *resp, size_t resp_size);
-int ibv_cmd_open_qp(struct verbs_xrcd *xrcd,
+int ibv_cmd_open_qp(struct verbs_context *context,
struct verbs_qp *qp, struct ibv_qp_open_attr *attr,
struct ibv_open_qp *cmd, size_t cmd_size,
struct ibv_create_qp_resp *resp, size_t resp_size);
};
enum ibv_qp_open_attr_mask {
- IBV_QP_OPEN_ATTR_CONTEXT = 1 << 0,
- IBV_QP_OPEN_ATTR_NUM = 1 << 1,
- IBV_QP_OPEN_ATTR_TYPE = 1 << 2,
- IBV_QP_OPEN_ATTR_RESERVED = 1 << 3
+ IBV_QP_OPEN_ATTR_NUM = 1 << 0,
+ IBV_QP_OPEN_ATTR_CONTEXT = 1 << 1,
+ IBV_QP_OPEN_ATTR_XRCD = 1 << 2,
+ IBV_QP_OPEN_ATTR_TYPE = 1 << 3,
+ IBV_QP_OPEN_ATTR_RESERVED = 1 << 4
};
struct ibv_qp_open_attr {
uint32_t comp_mask;
uint32_t qp_num;
+ struct ibv_xrcd *xrcd;
void *qp_context;
enum ibv_qp_type qp_type;
};
int (*drv_new_func1) (); new corresponding provider call of func1
int (*lib_new_func1) (); New library call func1
*/
- struct ibv_qp * (*open_qp)(struct ibv_xrcd *xrcd,
+ struct ibv_qp * (*open_qp)(struct ibv_context *context,
struct ibv_qp_open_attr *attr);
struct ibv_qp * (*create_qp_ex)(struct ibv_context *context,
struct ibv_qp_init_attr_ex *qp_init_attr_ex);
return 0;
}
-int ibv_cmd_open_qp(struct verbs_xrcd *xrcd, struct verbs_qp *qp,
+int ibv_cmd_open_qp(struct verbs_context *context, struct verbs_qp *qp,
struct ibv_qp_open_attr *attr,
struct ibv_open_qp *cmd, size_t cmd_size,
struct ibv_create_qp_resp *resp, size_t resp_size)
{
IBV_INIT_CMD_RESP(cmd, cmd_size, OPEN_QP, resp, resp_size);
+ if (attr->comp_mask >= IBV_QP_OPEN_ATTR_RESERVED)
+ return ENOSYS;
+
+ if (!(attr->comp_mask & IBV_QP_OPEN_ATTR_XRCD) ||
+ !(attr->comp_mask & IBV_QP_OPEN_ATTR_NUM) ||
+ !(attr->comp_mask & IBV_QP_OPEN_ATTR_TYPE))
+ return EINAL;
+
cmd->user_handle = (uintptr_t) qp;
- cmd->pd_handle = xrcd->handle;
+ cmd->pd_handle = attr->xrcd->handle;
cmd->qpn = attr->qp_num;
cmd->qp_type = attr->qp_type;
- if (write(xrcd->xrcd.context->cmd_fd, cmd, cmd_size) != cmd_size)
+ if (write(context->context.cmd_fd, cmd, cmd_size) != cmd_size)
return errno;
VALGRIND_MAKE_MEM_DEFINED(resp, resp_size);
qp->qp.handle = resp->qp_handle;
- qp->qp.context = xrcd->xrcd.context;
+ qp->qp.context = &context->context;
qp->qp.qp_context = attr->qp_context;
qp->qp.pd = NULL;
qp->qp.send_cq = qp->qp.recv_cq = NULL;
pthread_mutex_init(&qp->qp.mutex, NULL);
pthread_cond_init(&qp->qp.cond, NULL);
qp->comp_mask = VERBS_QP_XRCD;
- qp->xrcd = xrcd;
+ qp->xrcd = attr->xrcd;
return 0;
}