1e8372d9dSGuvenc Gulce // SPDX-License-Identifier: GPL-2.0 2e8372d9dSGuvenc Gulce /* 3e8372d9dSGuvenc Gulce * Shared Memory Communications over RDMA (SMC-R) and RoCE 4e8372d9dSGuvenc Gulce * 5e8372d9dSGuvenc Gulce * Generic netlink support functions to interact with SMC module 6e8372d9dSGuvenc Gulce * 7e8372d9dSGuvenc Gulce * Copyright IBM Corp. 2020 8e8372d9dSGuvenc Gulce * 9e8372d9dSGuvenc Gulce * Author(s): Guvenc Gulce <guvenc@linux.ibm.com> 10e8372d9dSGuvenc Gulce */ 11e8372d9dSGuvenc Gulce 12e8372d9dSGuvenc Gulce #include <linux/module.h> 13e8372d9dSGuvenc Gulce #include <linux/list.h> 14e8372d9dSGuvenc Gulce #include <linux/ctype.h> 15e8372d9dSGuvenc Gulce #include <linux/mutex.h> 16e8372d9dSGuvenc Gulce #include <linux/if.h> 17e8372d9dSGuvenc Gulce #include <linux/smc.h> 18e8372d9dSGuvenc Gulce 19e8372d9dSGuvenc Gulce #include "smc_core.h" 20aaf95523SGuvenc Gulce #include "smc_ism.h" 21a3db10efSGuvenc Gulce #include "smc_ib.h" 228c40602bSGuvenc Gulce #include "smc_stats.h" 23e8372d9dSGuvenc Gulce #include "smc_netlink.h" 24e8372d9dSGuvenc Gulce 25e8372d9dSGuvenc Gulce #define SMC_CMD_MAX_ATTR 1 26e8372d9dSGuvenc Gulce 27e8372d9dSGuvenc Gulce /* SMC_GENL generic netlink operation definition */ 28e8372d9dSGuvenc Gulce static const struct genl_ops smc_gen_nl_ops[] = { 29099b990bSGuvenc Gulce { 30099b990bSGuvenc Gulce .cmd = SMC_NETLINK_GET_SYS_INFO, 31099b990bSGuvenc Gulce /* can be retrieved by unprivileged users */ 32099b990bSGuvenc Gulce .dumpit = smc_nl_get_sys_info, 33099b990bSGuvenc Gulce }, 34e9b8c845SGuvenc Gulce { 35e9b8c845SGuvenc Gulce .cmd = SMC_NETLINK_GET_LGR_SMCR, 36e9b8c845SGuvenc Gulce /* can be retrieved by unprivileged users */ 37e9b8c845SGuvenc Gulce .dumpit = smcr_nl_get_lgr, 38e9b8c845SGuvenc Gulce }, 395a7e09d5SGuvenc Gulce { 405a7e09d5SGuvenc Gulce .cmd = SMC_NETLINK_GET_LINK_SMCR, 415a7e09d5SGuvenc Gulce /* can be retrieved by unprivileged users */ 425a7e09d5SGuvenc Gulce .dumpit = smcr_nl_get_link, 435a7e09d5SGuvenc Gulce }, 448f9dde4bSGuvenc Gulce { 458f9dde4bSGuvenc Gulce .cmd = SMC_NETLINK_GET_LGR_SMCD, 468f9dde4bSGuvenc Gulce /* can be retrieved by unprivileged users */ 478f9dde4bSGuvenc Gulce .dumpit = smcd_nl_get_lgr, 488f9dde4bSGuvenc Gulce }, 49aaf95523SGuvenc Gulce { 50aaf95523SGuvenc Gulce .cmd = SMC_NETLINK_GET_DEV_SMCD, 51aaf95523SGuvenc Gulce /* can be retrieved by unprivileged users */ 52aaf95523SGuvenc Gulce .dumpit = smcd_nl_get_device, 53aaf95523SGuvenc Gulce }, 54a3db10efSGuvenc Gulce { 55a3db10efSGuvenc Gulce .cmd = SMC_NETLINK_GET_DEV_SMCR, 56a3db10efSGuvenc Gulce /* can be retrieved by unprivileged users */ 57a3db10efSGuvenc Gulce .dumpit = smcr_nl_get_device, 58a3db10efSGuvenc Gulce }, 598c40602bSGuvenc Gulce { 608c40602bSGuvenc Gulce .cmd = SMC_NETLINK_GET_STATS, 618c40602bSGuvenc Gulce /* can be retrieved by unprivileged users */ 628c40602bSGuvenc Gulce .dumpit = smc_nl_get_stats, 638c40602bSGuvenc Gulce }, 64*f0dd7bf5SGuvenc Gulce { 65*f0dd7bf5SGuvenc Gulce .cmd = SMC_NETLINK_GET_FBACK_STATS, 66*f0dd7bf5SGuvenc Gulce /* can be retrieved by unprivileged users */ 67*f0dd7bf5SGuvenc Gulce .dumpit = smc_nl_get_fback_stats, 68*f0dd7bf5SGuvenc Gulce }, 69e8372d9dSGuvenc Gulce }; 70e8372d9dSGuvenc Gulce 71e8372d9dSGuvenc Gulce static const struct nla_policy smc_gen_nl_policy[2] = { 72e8372d9dSGuvenc Gulce [SMC_CMD_MAX_ATTR] = { .type = NLA_REJECT, }, 73e8372d9dSGuvenc Gulce }; 74e8372d9dSGuvenc Gulce 75e8372d9dSGuvenc Gulce /* SMC_GENL family definition */ 76e8372d9dSGuvenc Gulce struct genl_family smc_gen_nl_family __ro_after_init = { 77e8372d9dSGuvenc Gulce .hdrsize = 0, 78e8372d9dSGuvenc Gulce .name = SMC_GENL_FAMILY_NAME, 79e8372d9dSGuvenc Gulce .version = SMC_GENL_FAMILY_VERSION, 80e8372d9dSGuvenc Gulce .maxattr = SMC_CMD_MAX_ATTR, 81e8372d9dSGuvenc Gulce .policy = smc_gen_nl_policy, 82e8372d9dSGuvenc Gulce .netnsok = true, 83e8372d9dSGuvenc Gulce .module = THIS_MODULE, 84e8372d9dSGuvenc Gulce .ops = smc_gen_nl_ops, 85e8372d9dSGuvenc Gulce .n_ops = ARRAY_SIZE(smc_gen_nl_ops) 86e8372d9dSGuvenc Gulce }; 87e8372d9dSGuvenc Gulce 88e8372d9dSGuvenc Gulce int __init smc_nl_init(void) 89e8372d9dSGuvenc Gulce { 90e8372d9dSGuvenc Gulce return genl_register_family(&smc_gen_nl_family); 91e8372d9dSGuvenc Gulce } 92e8372d9dSGuvenc Gulce 93e8372d9dSGuvenc Gulce void smc_nl_exit(void) 94e8372d9dSGuvenc Gulce { 95e8372d9dSGuvenc Gulce genl_unregister_family(&smc_gen_nl_family); 96e8372d9dSGuvenc Gulce } 97