/* * New FW supports the TOOLS_RESOURCES uid security label * which allows commands to manipulate the global device state. * Otherwise only basic existing RDMA devx privilege are allowed.
*/ if (MLX5_CAP_GEN(mcdev->mdev, uctx_cap) &
MLX5_UCTX_OBJECT_CAP_TOOLS_RESOURCES)
mfd->uctx_caps |= MLX5_UCTX_OBJECT_CAP_TOOLS_RESOURCES;
uid = mlx5ctl_alloc_uid(mcdev, mfd->uctx_caps); if (uid < 0) return uid;
staticbool mlx5ctl_validate_rpc(constvoid *in, enum fwctl_rpc_scope scope)
{
u16 opcode = MLX5_GET(mbox_in_hdr, in, opcode);
u16 op_mod = MLX5_GET(mbox_in_hdr, in, op_mod);
/* * Currently the driver can't keep track of commands that allocate * objects in the FW, these commands are safe from a security * perspective but nothing will free the memory when the FD is closed. * For now permit only query commands and set commands that don't alter * objects. Also the caps for the scope have not been defined yet, * filter commands manually for now.
*/ switch (opcode) { case MLX5_CMD_OP_POSTPONE_CONNECTED_QP_TIMEOUT: case MLX5_CMD_OP_QUERY_ADAPTER: case MLX5_CMD_OP_QUERY_ESW_FUNCTIONS: case MLX5_CMD_OP_QUERY_HCA_CAP: case MLX5_CMD_OP_QUERY_HCA_VPORT_CONTEXT: case MLX5_CMD_OP_QUERY_OTHER_HCA_CAP: case MLX5_CMD_OP_QUERY_ROCE_ADDRESS: case MLX5_CMD_OPCODE_QUERY_VUID: /* * FW limits SET_HCA_CAP on the tools UID to only the other function * mode which is used for function pre-configuration
*/ case MLX5_CMD_OP_SET_HCA_CAP: returntrue; /* scope >= FWCTL_RPC_CONFIGURATION; */
case MLX5_CMD_OP_FPGA_QUERY_QP_COUNTERS: case MLX5_CMD_OP_FPGA_QUERY_QP: case MLX5_CMD_OP_NOP: case MLX5_CMD_OP_QUERY_AFU: case MLX5_CMD_OP_QUERY_BURST_SIZE: case MLX5_CMD_OP_QUERY_CAPI_PEC: case MLX5_CMD_OP_QUERY_CONG_PARAMS: case MLX5_CMD_OP_QUERY_CONG_STATISTICS: case MLX5_CMD_OP_QUERY_CONG_STATUS: case MLX5_CMD_OP_QUERY_CQ: case MLX5_CMD_OP_QUERY_CRYPTO_STATE: case MLX5_CMD_OP_QUERY_DC_CNAK_TRACE: case MLX5_CMD_OP_QUERY_DCT: case MLX5_CMD_OP_QUERY_DELAY_DROP_PARAMS: case MLX5_CMD_OP_QUERY_DIAGNOSTIC_COUNTERS: case MLX5_CMD_OP_QUERY_DIAGNOSTIC_PARAMS: case MLX5_CMD_OP_QUERY_DPA_PARTITION: case MLX5_CMD_OP_QUERY_DPA_PARTITIONS: case MLX5_CMD_OP_QUERY_DRIVER_VERSION: case MLX5_CMD_OP_QUERY_EMULATED_FUNCTIONS_INFO: case MLX5_CMD_OP_QUERY_EMULATED_RESOURCES_INFO: case MLX5_CMD_OP_QUERY_EMULATION_DEVICE_EQ_MSIX_MAPPING: case MLX5_CMD_OP_QUERY_EQ: case MLX5_CMD_OP_QUERY_ESW_VPORT_CONTEXT: case MLX5_CMD_OP_QUERY_FLOW_COUNTER: case MLX5_CMD_OP_QUERY_FLOW_GROUP: case MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY: case MLX5_CMD_OP_QUERY_FLOW_TABLE: case MLX5_CMD_OP_QUERY_GENERAL_OBJECT: case MLX5_CMD_OP_QUERY_HCA_VPORT_GID: case MLX5_CMD_OP_QUERY_HCA_VPORT_PKEY: case MLX5_CMD_OP_QUERY_ISSI: case MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY: case MLX5_CMD_OP_QUERY_LAG: case MLX5_CMD_OP_QUERY_MAD_DEMUX: case MLX5_CMD_OP_QUERY_MATCH_SAMPLE_INFO: case MLX5_CMD_OP_QUERY_MKEY: case MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT: case MLX5_CMD_OP_QUERY_MTT: case MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT: case MLX5_CMD_OP_QUERY_NVMF_BACKEND_CONTROLLER: case MLX5_CMD_OP_QUERY_NVMF_CC_RESPONSE: case MLX5_CMD_OP_QUERY_NVMF_NAMESPACE_CONTEXT: case MLX5_CMD_OP_QUERY_PACKET_REFORMAT_CONTEXT: case MLX5_CMD_OP_QUERY_PAGES: case MLX5_CMD_OP_QUERY_PSV: case MLX5_CMD_OP_QUERY_Q_COUNTER: case MLX5_CMD_OP_QUERY_QP: case MLX5_CMD_OP_QUERY_RATE_LIMIT: case MLX5_CMD_OP_QUERY_RDB: case MLX5_CMD_OP_QUERY_REGEXP_PARAMS: case MLX5_CMD_OP_QUERY_REGEXP_REGISTER: case MLX5_CMD_OP_QUERY_RMP: case MLX5_CMD_OP_QUERY_RQ: case MLX5_CMD_OP_QUERY_RQT: case MLX5_CMD_OP_QUERY_RSV_RESOURCES: case MLX5_CMD_OP_QUERY_SCHED_QUEUE: case MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT: case MLX5_CMD_OP_QUERY_SF_PARTITION: case MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS: case MLX5_CMD_OP_QUERY_SQ: case MLX5_CMD_OP_QUERY_SRQ: case MLX5_CMD_OP_QUERY_TIR: case MLX5_CMD_OP_QUERY_TIS: case MLX5_CMD_OP_QUERY_UCTX: case MLX5_CMD_OP_QUERY_UMEM: case MLX5_CMD_OP_QUERY_VHCA_MIGRATION_STATE: case MLX5_CMD_OP_QUERY_VHCA_STATE: case MLX5_CMD_OP_QUERY_VNIC_ENV: case MLX5_CMD_OP_QUERY_VPORT_COUNTER: case MLX5_CMD_OP_QUERY_VPORT_STATE: case MLX5_CMD_OP_QUERY_WOL_ROL: case MLX5_CMD_OP_QUERY_XRC_SRQ: case MLX5_CMD_OP_QUERY_XRQ_DC_PARAMS_ENTRY: case MLX5_CMD_OP_QUERY_XRQ_ERROR_PARAMS: case MLX5_CMD_OP_QUERY_XRQ: case MLX5_CMD_OP_USER_QUERY_XRQ_DC_PARAMS_ENTRY: case MLX5_CMD_OP_USER_QUERY_XRQ_ERROR_PARAMS: return scope >= FWCTL_RPC_DEBUG_READ_ONLY;
case MLX5_CMD_OP_SET_DIAGNOSTIC_PARAMS: return scope >= FWCTL_RPC_DEBUG_WRITE;
case MLX5_CMD_OP_ACCESS_REG: case MLX5_CMD_OP_ACCESS_REGISTER_USER: if (op_mod == 0) /* write */ returntrue; /* scope >= FWCTL_RPC_CONFIGURATION; */ return scope >= FWCTL_RPC_DEBUG_READ_ONLY; default: returnfalse;
}
}
if (!mlx5ctl_validate_rpc(rpc_in, scope)) return ERR_PTR(-EBADMSG);
/* * mlx5_cmd_do() copies the input message to its own buffer before * executing it, so we can reuse the allocation for the output.
*/ if (*out_len <= in_len) {
rpc_out = rpc_in;
} else {
rpc_out = kvzalloc(*out_len, GFP_KERNEL); if (!rpc_out) return ERR_PTR(-ENOMEM);
}
/* Enforce the user context for the command */
MLX5_SET(mbox_in_hdr, rpc_in, uid, mfd->uctx_uid);
ret = mlx5_cmd_do(mcdev->mdev, rpc_in, in_len, rpc_out, *out_len);
/* * -EREMOTEIO means execution succeeded and the out is valid, * but an error code was returned inside out. Everything else * means the RPC did not make it to the device.
*/ if (ret && ret != -EREMOTEIO) { if (rpc_out != rpc_in)
kvfree(rpc_out); return ERR_PTR(ret);
} return rpc_out;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.