Applications that use this qp type should build the whole packet,
including link level headers when sending. On the receive side, the
HW isn't expected to strip any headers. The new qp type designated
usage is from user-space in Ethernet environments, e.g by applications
that do TCP/IP offloading. Only processes with the NET_RAW capability
may open such qp. The name raw packet was selected to resemble the
similarity to AF_PACKET / SOL_RAW sockets.

Signed-off-by: Or Gerlitz <[email protected]>
---
 drivers/infiniband/core/uverbs_cmd.c |    3 +++
 drivers/infiniband/core/verbs.c      |    1 +
 include/rdma/ib_verbs.h              |    2 +-
 3 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/drivers/infiniband/core/uverbs_cmd.c 
b/drivers/infiniband/core/uverbs_cmd.c
index b930da4..8722e96 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -1399,6 +1399,9 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
        if (copy_from_user(&cmd, buf, sizeof cmd))
                return -EFAULT;

+       if (cmd.qp_type == IB_QPT_RAW_PACKET && !capable(CAP_NET_RAW))
+               return -EPERM;
+
        INIT_UDATA(&udata, buf + sizeof cmd,
                   (unsigned long) cmd.response + sizeof resp,
                   in_len - sizeof cmd, out_len - sizeof resp);
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index 602b1bd..f73e15b 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -479,6 +479,7 @@ static const struct {
                                [IB_QPT_UD]  = (IB_QP_PKEY_INDEX                
|
                                                IB_QP_PORT                      
|
                                                IB_QP_QKEY),
+                               [IB_QPT_RAW_PACKET] = IB_QP_PORT,
                                [IB_QPT_UC]  = (IB_QP_PKEY_INDEX                
|
                                                IB_QP_PORT                      
|
                                                IB_QP_ACCESS_FLAGS),
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index c3cca5a..6220b8b 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -605,7 +605,7 @@ enum ib_qp_type {
        IB_QPT_UD,
        IB_QPT_RAW_IPV6,
        IB_QPT_RAW_ETHERTYPE,
-       /* Save 8 for RAW_PACKET */
+       IB_QPT_RAW_PACKET = 8,
        IB_QPT_XRC_INI = 9,
        IB_QPT_XRC_TGT,
        IB_QPT_MAX
-- 
1.7.1


--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to