Files
2026-08-24 17:31:24 -07:00

345 lines
10 KiB
Go

// Copyright 2026 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package ib contains constants and structs from the Linux InfiniBand
// userspace verbs ABI (include/uapi/rdma/).
package ib
import (
"structs"
"gvisor.dev/gvisor/pkg/abi/linux"
)
// IB_UVERBS_MAJOR is the fixed char-device major the Linux InfiniBand uverbs
// subsystem uses for /dev/infiniband/uverbs* (defined in
// drivers/infiniband/core/uverbs_main.c).
//
// The first 32 uverbs devices (minors 192-223) use this fixed major; a host
// with more than 32 RDMA devices would assign later ones a dynamic major.
const IB_UVERBS_MAJOR = 231
// RDMAVerbsIoctl is RDMA_VERBS_IOCTL, the single ioctl command of the modern
// uverbs interface (include/uapi/rdma/rdma_user_ioctl.h).
var RDMAVerbsIoctl = linux.IOWR(0x1b, 1, SizeofUverbsIoctlHdr)
// Struct sizes.
var (
SizeofUverbsIoctlHdr = uint32((*UverbsIoctlHdr)(nil).SizeBytes())
SizeofUverbsAttr = uint32((*UverbsAttr)(nil).SizeBytes())
)
// UverbsIoctlHdr is struct ib_uverbs_ioctl_hdr, the fixed header of a
// RDMA_VERBS_IOCTL request; NumAttrs UverbsAttr follow it
// (include/uapi/rdma/rdma_user_ioctl_cmds.h).
//
// +marshal
type UverbsIoctlHdr struct {
_ structs.HostLayout
Length uint16
ObjectID uint16
MethodID uint16
NumAttrs uint16
Reserved1 uint64
DriverID uint32
Reserved2 uint32
}
// UverbsAttr is struct ib_uverbs_attr, one attribute of a RDMA_VERBS_IOCTL
// request (include/uapi/rdma/rdma_user_ioctl_cmds.h). Data carries an inline
// value, a user pointer (Len > 8), an object handle, or an fd, depending on
// the attribute.
//
// +marshal slice:UverbsAttrSlice
type UverbsAttr struct {
_ structs.HostLayout
AttrID uint16
Len uint16
Flags uint16
AttrData uint16
Data uint64
}
// UVERBS ioctl object, method, and attribute IDs from
// include/uapi/rdma/ib_user_ioctl_cmds.h. Only the entries the rdma proxy
// models are listed; the enums are cherry-picked, so values are explicit.
// enum uverbs_default_objects.
const (
UVERBS_OBJECT_DEVICE = 0
UVERBS_OBJECT_PD = 1
UVERBS_OBJECT_CQ = 3
UVERBS_OBJECT_QP = 4
UVERBS_OBJECT_AH = 6
UVERBS_OBJECT_MR = 7
UVERBS_OBJECT_ASYNC_EVENT = 16
)
// Method IDs within each object namespace.
const (
// enum uverbs_methods_device.
UVERBS_METHOD_INVOKE_WRITE = 0
UVERBS_METHOD_QUERY_PORT = 2
UVERBS_METHOD_GET_CONTEXT = 3
UVERBS_METHOD_QUERY_CONTEXT = 4
UVERBS_METHOD_QUERY_GID_TABLE = 5
UVERBS_METHOD_QUERY_GID_ENTRY = 6
// enum uverbs_methods_pd.
UVERBS_METHOD_PD_DESTROY = 0
// enum uverbs_methods_cq.
UVERBS_METHOD_CQ_CREATE = 0
UVERBS_METHOD_CQ_DESTROY = 1
// enum uverbs_methods_qp.
UVERBS_METHOD_QP_CREATE = 0
UVERBS_METHOD_QP_DESTROY = 1
// enum uverbs_methods_ah. AH creation uses the legacy write path
// (IB_USER_VERBS_CMD_CREATE_AH via INVOKE_WRITE); only destroy has a
// modern object method.
UVERBS_METHOD_AH_DESTROY = 0
// enum uverbs_methods_mr.
UVERBS_METHOD_MR_DESTROY = 1
UVERBS_METHOD_REG_DMABUF_MR = 4
UVERBS_METHOD_REG_MR = 5
// enum uverbs_method_async_event.
UVERBS_METHOD_ASYNC_EVENT_ALLOC = 0
)
// enum uverbs_attrs_invoke_write_cmd_attr_ids.
const (
UVERBS_ATTR_CORE_IN = 0
UVERBS_ATTR_CORE_OUT = 1
UVERBS_ATTR_WRITE_CMD = 2
)
// enum uverbs_attrs_get_context_attr_ids.
const (
UVERBS_ATTR_GET_CONTEXT_NUM_COMP_VECTORS = 0
UVERBS_ATTR_GET_CONTEXT_CORE_SUPPORT = 1
UVERBS_ATTR_GET_CONTEXT_FD_ARR = 2
)
// enum uverbs_attrs_query_context_attr_ids.
const (
UVERBS_ATTR_QUERY_CONTEXT_NUM_COMP_VECTORS = 0
UVERBS_ATTR_QUERY_CONTEXT_CORE_SUPPORT = 1
)
// enum uverbs_attrs_query_port_cmd_attr_ids.
const (
UVERBS_ATTR_QUERY_PORT_PORT_NUM = 0
UVERBS_ATTR_QUERY_PORT_RESP = 1
)
// enum uverbs_attrs_query_gid_table_cmd_attr_ids.
const (
UVERBS_ATTR_QUERY_GID_TABLE_ENTRY_SIZE = 0
UVERBS_ATTR_QUERY_GID_TABLE_FLAGS = 1
UVERBS_ATTR_QUERY_GID_TABLE_RESP_ENTRIES = 2
UVERBS_ATTR_QUERY_GID_TABLE_RESP_NUM_ENTRIES = 3
)
// enum uverbs_attrs_query_gid_entry_cmd_attr_ids.
const (
UVERBS_ATTR_QUERY_GID_ENTRY_PORT = 0
UVERBS_ATTR_QUERY_GID_ENTRY_GID_INDEX = 1
UVERBS_ATTR_QUERY_GID_ENTRY_FLAGS = 2
UVERBS_ATTR_QUERY_GID_ENTRY_RESP_ENTRY = 3
)
// UVERBS_ATTR_DESTROY_PD_HANDLE is the handle attribute ID for uverbs_attrs_destroy_pd_cmd_attr_ids.
const UVERBS_ATTR_DESTROY_PD_HANDLE = 0
// UVERBS_ATTR_DESTROY_AH_HANDLE is the handle attribute ID for enum uverbs_attrs_ah_destroy_ids.
const UVERBS_ATTR_DESTROY_AH_HANDLE = 0
// enum uverbs_attrs_reg_mr_cmd_attr_ids.
const (
UVERBS_ATTR_REG_MR_HANDLE = 0
UVERBS_ATTR_REG_MR_PD_HANDLE = 1
UVERBS_ATTR_REG_MR_DMA_HANDLE = 2
UVERBS_ATTR_REG_MR_IOVA = 3
UVERBS_ATTR_REG_MR_ADDR = 4
UVERBS_ATTR_REG_MR_LENGTH = 5
UVERBS_ATTR_REG_MR_ACCESS_FLAGS = 6
UVERBS_ATTR_REG_MR_FD = 7
UVERBS_ATTR_REG_MR_FD_OFFSET = 8
UVERBS_ATTR_REG_MR_RESP_LKEY = 9
UVERBS_ATTR_REG_MR_RESP_RKEY = 10
)
// enum uverbs_attrs_reg_dmabuf_mr_cmd_attr_ids.
const (
UVERBS_ATTR_REG_DMABUF_MR_HANDLE = 0
UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE = 1
UVERBS_ATTR_REG_DMABUF_MR_OFFSET = 2
UVERBS_ATTR_REG_DMABUF_MR_LENGTH = 3
UVERBS_ATTR_REG_DMABUF_MR_IOVA = 4
UVERBS_ATTR_REG_DMABUF_MR_FD = 5
UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS = 6
UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY = 7
UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY = 8
)
// UVERBS_ATTR_DESTROY_MR_HANDLE is the handle attribute ID for uverbs_attrs_destroy_mr_cmd_attr_ids.
const UVERBS_ATTR_DESTROY_MR_HANDLE = 0
// enum uverbs_attrs_create_cq_cmd_attr_ids.
const (
UVERBS_ATTR_CREATE_CQ_HANDLE = 0
UVERBS_ATTR_CREATE_CQ_CQE = 1
UVERBS_ATTR_CREATE_CQ_USER_HANDLE = 2
UVERBS_ATTR_CREATE_CQ_COMP_CHANNEL = 3
UVERBS_ATTR_CREATE_CQ_COMP_VECTOR = 4
UVERBS_ATTR_CREATE_CQ_FLAGS = 5
UVERBS_ATTR_CREATE_CQ_RESP_CQE = 6
UVERBS_ATTR_CREATE_CQ_EVENT_FD = 7
UVERBS_ATTR_CREATE_CQ_BUFFER_VA = 8
UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH = 9
UVERBS_ATTR_CREATE_CQ_BUFFER_FD = 10
UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET = 11
UVERBS_ATTR_CREATE_CQ_BUF_UMEM = 12
)
// enum uverbs_attrs_destroy_cq_cmd_attr_ids.
const (
UVERBS_ATTR_DESTROY_CQ_HANDLE = 0
UVERBS_ATTR_DESTROY_CQ_RESP = 1
)
// enum uverbs_attrs_create_qp_cmd_attr_ids.
const (
UVERBS_ATTR_CREATE_QP_HANDLE = 0
UVERBS_ATTR_CREATE_QP_XRCD_HANDLE = 1
UVERBS_ATTR_CREATE_QP_PD_HANDLE = 2
UVERBS_ATTR_CREATE_QP_SRQ_HANDLE = 3
UVERBS_ATTR_CREATE_QP_SEND_CQ_HANDLE = 4
UVERBS_ATTR_CREATE_QP_RECV_CQ_HANDLE = 5
UVERBS_ATTR_CREATE_QP_IND_TABLE_HANDLE = 6
UVERBS_ATTR_CREATE_QP_USER_HANDLE = 7
UVERBS_ATTR_CREATE_QP_CAP = 8
UVERBS_ATTR_CREATE_QP_TYPE = 9
UVERBS_ATTR_CREATE_QP_FLAGS = 10
UVERBS_ATTR_CREATE_QP_SOURCE_QPN = 11
UVERBS_ATTR_CREATE_QP_EVENT_FD = 12
UVERBS_ATTR_CREATE_QP_RESP_CAP = 13
UVERBS_ATTR_CREATE_QP_RESP_QP_NUM = 14
UVERBS_ATTR_CREATE_QP_BUF_UMEM = 15
UVERBS_ATTR_CREATE_QP_RQ_BUF_UMEM = 16
UVERBS_ATTR_CREATE_QP_SQ_BUF_UMEM = 17
)
// enum uverbs_attrs_destroy_qp_cmd_attr_ids.
const (
UVERBS_ATTR_DESTROY_QP_HANDLE = 0
UVERBS_ATTR_DESTROY_QP_RESP = 1
)
// UVERBS_ATTR_ASYNC_EVENT_ALLOC_FD_HANDLE is the handle attribute ID for uverbs_attrs_async_event_create.
const UVERBS_ATTR_ASYNC_EVENT_ALLOC_FD_HANDLE = 0
// Driver-private attribute IDs (>= UVERBS_ID_DRIVER_NS) shared across
// methods. UHW_IN/UHW_OUT carry vendor driver data (e.g. mlx5's
// mlx5_ib_create_cq / mlx5_ib_create_qp with the CQ/QP DMA buffer pointers).
const (
UVERBS_ATTR_UHW_IN = 0x1000
UVERBS_ATTR_UHW_OUT = 0x1001
)
// mlx5 driver-namespace object/method/attr IDs from
// include/uapi/rdma/mlx5_user_ioctl_cmds.h. The UAR (User Access Region) is
// the CQ/QP doorbell page.
const (
MLX5_IB_OBJECT_UAR = 0x1008
// enum mlx5_ib_uar_obj_methods.
MLX5_IB_METHOD_UAR_OBJ_ALLOC = 0x1000
MLX5_IB_METHOD_UAR_OBJ_DESTROY = 0x1001
// enum mlx5_ib_uar_obj_alloc_attrs.
MLX5_IB_ATTR_UAR_OBJ_ALLOC_HANDLE = 0x1000
MLX5_IB_ATTR_UAR_OBJ_ALLOC_TYPE = 0x1001
MLX5_IB_ATTR_UAR_OBJ_ALLOC_MMAP_OFFSET = 0x1002
MLX5_IB_ATTR_UAR_OBJ_ALLOC_MMAP_LENGTH = 0x1003
MLX5_IB_ATTR_UAR_OBJ_ALLOC_PAGE_ID = 0x1004
// enum mlx5_ib_uar_obj_destroy_attrs.
MLX5_IB_ATTR_UAR_OBJ_DESTROY_HANDLE = 0x1000
)
// EFA driver-namespace method/attr IDs from include/uapi/rdma/efa-abi.h. EFA
// extends the standard UVERBS_OBJECT_MR with a query method returning the
// interconnect IDs an RDMA-read/write source MR must advertise to peers.
const (
// enum efa_mr_methods.
EFA_IB_METHOD_MR_QUERY = 0x1000
// enum efa_query_mr_attrs.
EFA_IB_ATTR_QUERY_MR_HANDLE = 0x1000
EFA_IB_ATTR_QUERY_MR_RESP_IC_ID_VALIDITY = 0x1001
EFA_IB_ATTR_QUERY_MR_RESP_RECV_IC_ID = 0x1002
EFA_IB_ATTR_QUERY_MR_RESP_RDMA_READ_IC_ID = 0x1003
EFA_IB_ATTR_QUERY_MR_RESP_RDMA_RECV_IC_ID = 0x1004
)
// Legacy write(2)-path command numbers (enum ib_uverbs_write_cmds,
// include/uapi/rdma/ib_user_verbs.h), as carried by the INVOKE_WRITE
// WRITE_CMD attribute.
const (
IB_USER_VERBS_CMD_REG_MR = 9
IB_USER_VERBS_CMD_DEREG_MR = 13
)
// UverbsRegMR is struct ib_uverbs_reg_mr, the legacy write-path REG_MR
// command (include/uapi/rdma/ib_user_verbs.h). Variable-length driver data
// may follow.
//
// +marshal
type UverbsRegMR struct {
_ structs.HostLayout
Response uint64
Start uint64
Length uint64
HcaVA uint64
PDHandle uint32
AccessFlags uint32
}
// UverbsRegMRResp is struct ib_uverbs_reg_mr_resp, REG_MR's response
// (include/uapi/rdma/ib_user_verbs.h).
//
// +marshal
type UverbsRegMRResp struct {
_ structs.HostLayout
MRHandle uint32
LKey uint32
RKey uint32
}
// Mlx5CreatePrefix is the common prefix of struct mlx5_ib_create_cq and
// struct mlx5_ib_create_qp (include/uapi/rdma/mlx5-abi.h): the work-queue
// buffer and doorbell guest addresses.
//
// +marshal
type Mlx5CreatePrefix struct {
_ structs.HostLayout
BufAddr uint64
DBAddr uint64
}