1*e8372d9dSGuvenc Gulce // SPDX-License-Identifier: GPL-2.0 2*e8372d9dSGuvenc Gulce /* 3*e8372d9dSGuvenc Gulce * Shared Memory Communications over RDMA (SMC-R) and RoCE 4*e8372d9dSGuvenc Gulce * 5*e8372d9dSGuvenc Gulce * Generic netlink support functions to interact with SMC module 6*e8372d9dSGuvenc Gulce * 7*e8372d9dSGuvenc Gulce * Copyright IBM Corp. 2020 8*e8372d9dSGuvenc Gulce * 9*e8372d9dSGuvenc Gulce * Author(s): Guvenc Gulce <guvenc@linux.ibm.com> 10*e8372d9dSGuvenc Gulce */ 11*e8372d9dSGuvenc Gulce 12*e8372d9dSGuvenc Gulce #include <linux/module.h> 13*e8372d9dSGuvenc Gulce #include <linux/list.h> 14*e8372d9dSGuvenc Gulce #include <linux/ctype.h> 15*e8372d9dSGuvenc Gulce #include <linux/mutex.h> 16*e8372d9dSGuvenc Gulce #include <linux/if.h> 17*e8372d9dSGuvenc Gulce #include <linux/smc.h> 18*e8372d9dSGuvenc Gulce 19*e8372d9dSGuvenc Gulce #include "smc_core.h" 20*e8372d9dSGuvenc Gulce #include "smc_netlink.h" 21*e8372d9dSGuvenc Gulce 22*e8372d9dSGuvenc Gulce #define SMC_CMD_MAX_ATTR 1 23*e8372d9dSGuvenc Gulce 24*e8372d9dSGuvenc Gulce /* SMC_GENL generic netlink operation definition */ 25*e8372d9dSGuvenc Gulce static const struct genl_ops smc_gen_nl_ops[] = { 26*e8372d9dSGuvenc Gulce }; 27*e8372d9dSGuvenc Gulce 28*e8372d9dSGuvenc Gulce static const struct nla_policy smc_gen_nl_policy[2] = { 29*e8372d9dSGuvenc Gulce [SMC_CMD_MAX_ATTR] = { .type = NLA_REJECT, }, 30*e8372d9dSGuvenc Gulce }; 31*e8372d9dSGuvenc Gulce 32*e8372d9dSGuvenc Gulce /* SMC_GENL family definition */ 33*e8372d9dSGuvenc Gulce struct genl_family smc_gen_nl_family __ro_after_init = { 34*e8372d9dSGuvenc Gulce .hdrsize = 0, 35*e8372d9dSGuvenc Gulce .name = SMC_GENL_FAMILY_NAME, 36*e8372d9dSGuvenc Gulce .version = SMC_GENL_FAMILY_VERSION, 37*e8372d9dSGuvenc Gulce .maxattr = SMC_CMD_MAX_ATTR, 38*e8372d9dSGuvenc Gulce .policy = smc_gen_nl_policy, 39*e8372d9dSGuvenc Gulce .netnsok = true, 40*e8372d9dSGuvenc Gulce .module = THIS_MODULE, 41*e8372d9dSGuvenc Gulce .ops = smc_gen_nl_ops, 42*e8372d9dSGuvenc Gulce .n_ops = ARRAY_SIZE(smc_gen_nl_ops) 43*e8372d9dSGuvenc Gulce }; 44*e8372d9dSGuvenc Gulce 45*e8372d9dSGuvenc Gulce int __init smc_nl_init(void) 46*e8372d9dSGuvenc Gulce { 47*e8372d9dSGuvenc Gulce return genl_register_family(&smc_gen_nl_family); 48*e8372d9dSGuvenc Gulce } 49*e8372d9dSGuvenc Gulce 50*e8372d9dSGuvenc Gulce void smc_nl_exit(void) 51*e8372d9dSGuvenc Gulce { 52*e8372d9dSGuvenc Gulce genl_unregister_family(&smc_gen_nl_family); 53*e8372d9dSGuvenc Gulce } 54