// SPDX-License-Identifier: GPL-2.0 /* * Shared Memory Communications over RDMA (SMC-R) and RoCE * * Generic netlink support functions to interact with SMC module * * Copyright IBM Corp. 2020 * * Author(s): Guvenc Gulce */ #include #include #include #include #include #include #include "smc_core.h" #include "smc_ism.h" #include "smc_ib.h" #include "smc_clc.h" #include "smc_stats.h" #include "smc_netlink.h" const struct nla_policy smc_gen_ueid_policy[SMC_NLA_EID_TABLE_MAX + 1] = { [SMC_NLA_EID_TABLE_UNSPEC] = { .type = NLA_UNSPEC }, [SMC_NLA_EID_TABLE_ENTRY] = { .type = NLA_STRING, .len = SMC_MAX_EID_LEN, }, }; #define SMC_CMD_MAX_ATTR 1 /* SMC_GENL generic netlink operation definition */ static const struct genl_ops smc_gen_nl_ops[] = { { .cmd = SMC_NETLINK_GET_SYS_INFO, /* can be retrieved by unprivileged users */ .dumpit = smc_nl_get_sys_info, }, { .cmd = SMC_NETLINK_GET_LGR_SMCR, /* can be retrieved by unprivileged users */ .dumpit = smcr_nl_get_lgr, }, { .cmd = SMC_NETLINK_GET_LINK_SMCR, /* can be retrieved by unprivileged users */ .dumpit = smcr_nl_get_link, }, { .cmd = SMC_NETLINK_GET_LGR_SMCD, /* can be retrieved by unprivileged users */ .dumpit = smcd_nl_get_lgr, }, { .cmd = SMC_NETLINK_GET_DEV_SMCD, /* can be retrieved by unprivileged users */ .dumpit = smcd_nl_get_device, }, { .cmd = SMC_NETLINK_GET_DEV_SMCR, /* can be retrieved by unprivileged users */ .dumpit = smcr_nl_get_device, }, { .cmd = SMC_NETLINK_GET_STATS, /* can be retrieved by unprivileged users */ .dumpit = smc_nl_get_stats, }, { .cmd = SMC_NETLINK_GET_FBACK_STATS, /* can be retrieved by unprivileged users */ .dumpit = smc_nl_get_fback_stats, }, { .cmd = SMC_NETLINK_DUMP_UEID, /* can be retrieved by unprivileged users */ .dumpit = smc_nl_dump_ueid, }, { .cmd = SMC_NETLINK_ADD_UEID, .flags = GENL_ADMIN_PERM, .doit = smc_nl_add_ueid, .policy = smc_gen_ueid_policy, }, { .cmd = SMC_NETLINK_REMOVE_UEID, .flags = GENL_ADMIN_PERM, .doit = smc_nl_remove_ueid, .policy = smc_gen_ueid_policy, }, { .cmd = SMC_NETLINK_FLUSH_UEID, .flags = GENL_ADMIN_PERM, .doit = smc_nl_flush_ueid, }, { .cmd = SMC_NETLINK_DUMP_SEID, /* can be retrieved by unprivileged users */ .dumpit = smc_nl_dump_seid, }, { .cmd = SMC_NETLINK_ENABLE_SEID, .flags = GENL_ADMIN_PERM, .doit = smc_nl_enable_seid, }, { .cmd = SMC_NETLINK_DISABLE_SEID, .flags = GENL_ADMIN_PERM, .doit = smc_nl_disable_seid, }, { .cmd = SMC_NETLINK_DUMP_HS_LIMITATION, /* can be retrieved by unprivileged users */ .dumpit = smc_nl_dump_hs_limitation, }, { .cmd = SMC_NETLINK_ENABLE_HS_LIMITATION, .flags = GENL_ADMIN_PERM, .doit = smc_nl_enable_hs_limitation, }, { .cmd = SMC_NETLINK_DISABLE_HS_LIMITATION, .flags = GENL_ADMIN_PERM, .doit = smc_nl_disable_hs_limitation, }, }; static const struct nla_policy smc_gen_nl_policy[2] = { [SMC_CMD_MAX_ATTR] = { .type = NLA_REJECT, }, }; /* SMC_GENL family definition */ struct genl_family smc_gen_nl_family __ro_after_init = { .hdrsize = 0, .name = SMC_GENL_FAMILY_NAME, .version = SMC_GENL_FAMILY_VERSION, .maxattr = SMC_CMD_MAX_ATTR, .policy = smc_gen_nl_policy, .netnsok = true, .module = THIS_MODULE, .ops = smc_gen_nl_ops, .n_ops = ARRAY_SIZE(smc_gen_nl_ops), .resv_start_op = SMC_NETLINK_DISABLE_HS_LIMITATION + 1, }; int __init smc_nl_init(void) { return genl_register_family(&smc_gen_nl_family); } void smc_nl_exit(void) { genl_unregister_family(&smc_gen_nl_family); }