diff options
author | Or Gerlitz <ogerlitz@mellanox.com> | 2012-03-01 05:17:51 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-05-08 14:18:09 -0400 |
commit | c938a616aadb621b8e26b0ac09ac13d053c7ed1c (patch) | |
tree | 85144d93d117f9d31a589385d65f36f061648b8f | |
parent | d48b97b403d23f6df0b990cee652bdf9a52337a3 (diff) |
IB/core: Add raw packet QP type
IB_QPT_RAW_PACKET allows applications to build a complete packet,
including L2 headers, when sending; on the receive side, the HW will
not strip any headers.
This QP type is designed for userspace direct access to Ethernet; for
example by applications that do TCP/IP themselves. Only processes
with the NET_RAW capability are allowed to create raw packet QPs (the
name "raw packet QP" is supposed to suggest an analogy to AF_PACKET /
SOL_RAW sockets).
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r-- | drivers/infiniband/core/uverbs_cmd.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/core/verbs.c | 1 | ||||
-rw-r--r-- | 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 4d27e4c3fe34..7d801e6252f1 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, | |||
1399 | if (copy_from_user(&cmd, buf, sizeof cmd)) | 1399 | if (copy_from_user(&cmd, buf, sizeof cmd)) |
1400 | return -EFAULT; | 1400 | return -EFAULT; |
1401 | 1401 | ||
1402 | if (cmd.qp_type == IB_QPT_RAW_PACKET && !capable(CAP_NET_RAW)) | ||
1403 | return -EPERM; | ||
1404 | |||
1402 | INIT_UDATA(&udata, buf + sizeof cmd, | 1405 | INIT_UDATA(&udata, buf + sizeof cmd, |
1403 | (unsigned long) cmd.response + sizeof resp, | 1406 | (unsigned long) cmd.response + sizeof resp, |
1404 | in_len - sizeof cmd, out_len - sizeof resp); | 1407 | in_len - sizeof cmd, out_len - sizeof resp); |
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 575b78045aaf..140f9a5d492f 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
@@ -479,6 +479,7 @@ static const struct { | |||
479 | [IB_QPT_UD] = (IB_QP_PKEY_INDEX | | 479 | [IB_QPT_UD] = (IB_QP_PKEY_INDEX | |
480 | IB_QP_PORT | | 480 | IB_QP_PORT | |
481 | IB_QP_QKEY), | 481 | IB_QP_QKEY), |
482 | [IB_QPT_RAW_PACKET] = IB_QP_PORT, | ||
482 | [IB_QPT_UC] = (IB_QP_PKEY_INDEX | | 483 | [IB_QPT_UC] = (IB_QP_PKEY_INDEX | |
483 | IB_QP_PORT | | 484 | IB_QP_PORT | |
484 | IB_QP_ACCESS_FLAGS), | 485 | IB_QP_ACCESS_FLAGS), |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index c3cca5a4dacd..a3fa3232b8a0 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
@@ -605,7 +605,7 @@ enum ib_qp_type { | |||
605 | IB_QPT_UD, | 605 | IB_QPT_UD, |
606 | IB_QPT_RAW_IPV6, | 606 | IB_QPT_RAW_IPV6, |
607 | IB_QPT_RAW_ETHERTYPE, | 607 | IB_QPT_RAW_ETHERTYPE, |
608 | /* Save 8 for RAW_PACKET */ | 608 | IB_QPT_RAW_PACKET = 8, |
609 | IB_QPT_XRC_INI = 9, | 609 | IB_QPT_XRC_INI = 9, |
610 | IB_QPT_XRC_TGT, | 610 | IB_QPT_XRC_TGT, |
611 | IB_QPT_MAX | 611 | IB_QPT_MAX |