IB/ipath: be more strict about testing the modify QP verb
Signed-off-by: Bryan O'Sullivan <bryan.osullivan@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
ff0b8597ec
commit
fc8cf8cdfc
2 changed files with 32 additions and 2 deletions
|
@ -455,11 +455,16 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
attr_mask))
|
attr_mask))
|
||||||
goto inval;
|
goto inval;
|
||||||
|
|
||||||
if (attr_mask & IB_QP_AV)
|
if (attr_mask & IB_QP_AV) {
|
||||||
if (attr->ah_attr.dlid == 0 ||
|
if (attr->ah_attr.dlid == 0 ||
|
||||||
attr->ah_attr.dlid >= IPATH_MULTICAST_LID_BASE)
|
attr->ah_attr.dlid >= IPATH_MULTICAST_LID_BASE)
|
||||||
goto inval;
|
goto inval;
|
||||||
|
|
||||||
|
if ((attr->ah_attr.ah_flags & IB_AH_GRH) &&
|
||||||
|
(attr->ah_attr.grh.sgid_index > 1))
|
||||||
|
goto inval;
|
||||||
|
}
|
||||||
|
|
||||||
if (attr_mask & IB_QP_PKEY_INDEX)
|
if (attr_mask & IB_QP_PKEY_INDEX)
|
||||||
if (attr->pkey_index >= ipath_get_npkeys(dev->dd))
|
if (attr->pkey_index >= ipath_get_npkeys(dev->dd))
|
||||||
goto inval;
|
goto inval;
|
||||||
|
@ -468,6 +473,27 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
if (attr->min_rnr_timer > 31)
|
if (attr->min_rnr_timer > 31)
|
||||||
goto inval;
|
goto inval;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_PORT)
|
||||||
|
if (attr->port_num == 0 ||
|
||||||
|
attr->port_num > ibqp->device->phys_port_cnt)
|
||||||
|
goto inval;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_PATH_MTU)
|
||||||
|
if (attr->path_mtu > IB_MTU_4096)
|
||||||
|
goto inval;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC)
|
||||||
|
if (attr->max_dest_rd_atomic > 1)
|
||||||
|
goto inval;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC)
|
||||||
|
if (attr->max_rd_atomic > 1)
|
||||||
|
goto inval;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_PATH_MIG_STATE)
|
||||||
|
if (attr->path_mig_state != IB_MIG_MIGRATED)
|
||||||
|
goto inval;
|
||||||
|
|
||||||
switch (new_state) {
|
switch (new_state) {
|
||||||
case IB_QPS_RESET:
|
case IB_QPS_RESET:
|
||||||
ipath_reset_qp(qp);
|
ipath_reset_qp(qp);
|
||||||
|
@ -518,6 +544,9 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
if (attr_mask & IB_QP_MIN_RNR_TIMER)
|
if (attr_mask & IB_QP_MIN_RNR_TIMER)
|
||||||
qp->r_min_rnr_timer = attr->min_rnr_timer;
|
qp->r_min_rnr_timer = attr->min_rnr_timer;
|
||||||
|
|
||||||
|
if (attr_mask & IB_QP_TIMEOUT)
|
||||||
|
qp->timeout = attr->timeout;
|
||||||
|
|
||||||
if (attr_mask & IB_QP_QKEY)
|
if (attr_mask & IB_QP_QKEY)
|
||||||
qp->qkey = attr->qkey;
|
qp->qkey = attr->qkey;
|
||||||
|
|
||||||
|
@ -564,7 +593,7 @@ int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
attr->max_dest_rd_atomic = 1;
|
attr->max_dest_rd_atomic = 1;
|
||||||
attr->min_rnr_timer = qp->r_min_rnr_timer;
|
attr->min_rnr_timer = qp->r_min_rnr_timer;
|
||||||
attr->port_num = 1;
|
attr->port_num = 1;
|
||||||
attr->timeout = 0;
|
attr->timeout = qp->timeout;
|
||||||
attr->retry_cnt = qp->s_retry_cnt;
|
attr->retry_cnt = qp->s_retry_cnt;
|
||||||
attr->rnr_retry = qp->s_rnr_retry;
|
attr->rnr_retry = qp->s_rnr_retry;
|
||||||
attr->alt_port_num = 0;
|
attr->alt_port_num = 0;
|
||||||
|
|
|
@ -371,6 +371,7 @@ struct ipath_qp {
|
||||||
u8 s_retry; /* requester retry counter */
|
u8 s_retry; /* requester retry counter */
|
||||||
u8 s_rnr_retry; /* requester RNR retry counter */
|
u8 s_rnr_retry; /* requester RNR retry counter */
|
||||||
u8 s_pkey_index; /* PKEY index to use */
|
u8 s_pkey_index; /* PKEY index to use */
|
||||||
|
u8 timeout; /* Timeout for this QP */
|
||||||
enum ib_mtu path_mtu;
|
enum ib_mtu path_mtu;
|
||||||
u32 remote_qpn;
|
u32 remote_qpn;
|
||||||
u32 qkey; /* QKEY for this QP (for UD or RD) */
|
u32 qkey; /* QKEY for this QP (for UD or RD) */
|
||||||
|
|
Reference in a new issue