diff options
author | Naresh Gottumukkala <bgottumukkala@emulex.com> | 2013-08-07 09:22:34 +0200 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-08-12 19:58:38 +0200 |
commit | 9c58726ba96ad5f767ce2d8c42159c3075a98d6f (patch) | |
tree | 4019527cac657e61b245441ec340b00ea9a6e40d /drivers/infiniband | |
parent | RDMA/ocrdma: Remove redundant dev reference (diff) | |
download | linux-9c58726ba96ad5f767ce2d8c42159c3075a98d6f.tar.xz linux-9c58726ba96ad5f767ce2d8c42159c3075a98d6f.zip |
RDMA/ocrdma: Don't allow zero/invalid sgid usage
Signed-off-by: Naresh Gottumukkala <bgottumukkala@emulex.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c index 6bbcc786ef6d..af01ba202d40 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c @@ -2124,9 +2124,10 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, { int status; struct ib_ah_attr *ah_attr = &attrs->ah_attr; - union ib_gid sgid; + union ib_gid sgid, zgid; u32 vlan_id; u8 mac_addr[6]; + if ((ah_attr->ah_flags & IB_AH_GRH) == 0) return -EINVAL; cmd->params.tclass_sq_psn |= @@ -2142,6 +2143,11 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, ah_attr->grh.sgid_index, &sgid); if (status) return status; + + memset(&zgid, 0, sizeof(zgid)); + if (!memcmp(&sgid, &zgid, sizeof(zgid))) + return -EINVAL; + qp->sgid_idx = ah_attr->grh.sgid_index; memcpy(&cmd->params.sgid[0], &sgid.raw[0], sizeof(cmd->params.sgid)); ocrdma_resolve_dgid(qp->dev, &ah_attr->grh.dgid, &mac_addr[0]); |