smc_netlink.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Shared Memory Communications over RDMA (SMC-R) and RoCE
  4. *
  5. * Generic netlink support functions to interact with SMC module
  6. *
  7. * Copyright IBM Corp. 2020
  8. *
  9. * Author(s): Guvenc Gulce <[email protected]>
  10. */
  11. #include <linux/module.h>
  12. #include <linux/list.h>
  13. #include <linux/ctype.h>
  14. #include <linux/mutex.h>
  15. #include <linux/if.h>
  16. #include <linux/smc.h>
  17. #include "smc_core.h"
  18. #include "smc_ism.h"
  19. #include "smc_ib.h"
  20. #include "smc_clc.h"
  21. #include "smc_stats.h"
  22. #include "smc_netlink.h"
  23. const struct nla_policy
  24. smc_gen_ueid_policy[SMC_NLA_EID_TABLE_MAX + 1] = {
  25. [SMC_NLA_EID_TABLE_UNSPEC] = { .type = NLA_UNSPEC },
  26. [SMC_NLA_EID_TABLE_ENTRY] = { .type = NLA_STRING,
  27. .len = SMC_MAX_EID_LEN,
  28. },
  29. };
  30. #define SMC_CMD_MAX_ATTR 1
  31. /* SMC_GENL generic netlink operation definition */
  32. static const struct genl_ops smc_gen_nl_ops[] = {
  33. {
  34. .cmd = SMC_NETLINK_GET_SYS_INFO,
  35. /* can be retrieved by unprivileged users */
  36. .dumpit = smc_nl_get_sys_info,
  37. },
  38. {
  39. .cmd = SMC_NETLINK_GET_LGR_SMCR,
  40. /* can be retrieved by unprivileged users */
  41. .dumpit = smcr_nl_get_lgr,
  42. },
  43. {
  44. .cmd = SMC_NETLINK_GET_LINK_SMCR,
  45. /* can be retrieved by unprivileged users */
  46. .dumpit = smcr_nl_get_link,
  47. },
  48. {
  49. .cmd = SMC_NETLINK_GET_LGR_SMCD,
  50. /* can be retrieved by unprivileged users */
  51. .dumpit = smcd_nl_get_lgr,
  52. },
  53. {
  54. .cmd = SMC_NETLINK_GET_DEV_SMCD,
  55. /* can be retrieved by unprivileged users */
  56. .dumpit = smcd_nl_get_device,
  57. },
  58. {
  59. .cmd = SMC_NETLINK_GET_DEV_SMCR,
  60. /* can be retrieved by unprivileged users */
  61. .dumpit = smcr_nl_get_device,
  62. },
  63. {
  64. .cmd = SMC_NETLINK_GET_STATS,
  65. /* can be retrieved by unprivileged users */
  66. .dumpit = smc_nl_get_stats,
  67. },
  68. {
  69. .cmd = SMC_NETLINK_GET_FBACK_STATS,
  70. /* can be retrieved by unprivileged users */
  71. .dumpit = smc_nl_get_fback_stats,
  72. },
  73. {
  74. .cmd = SMC_NETLINK_DUMP_UEID,
  75. /* can be retrieved by unprivileged users */
  76. .dumpit = smc_nl_dump_ueid,
  77. },
  78. {
  79. .cmd = SMC_NETLINK_ADD_UEID,
  80. .flags = GENL_ADMIN_PERM,
  81. .doit = smc_nl_add_ueid,
  82. .policy = smc_gen_ueid_policy,
  83. },
  84. {
  85. .cmd = SMC_NETLINK_REMOVE_UEID,
  86. .flags = GENL_ADMIN_PERM,
  87. .doit = smc_nl_remove_ueid,
  88. .policy = smc_gen_ueid_policy,
  89. },
  90. {
  91. .cmd = SMC_NETLINK_FLUSH_UEID,
  92. .flags = GENL_ADMIN_PERM,
  93. .doit = smc_nl_flush_ueid,
  94. },
  95. {
  96. .cmd = SMC_NETLINK_DUMP_SEID,
  97. /* can be retrieved by unprivileged users */
  98. .dumpit = smc_nl_dump_seid,
  99. },
  100. {
  101. .cmd = SMC_NETLINK_ENABLE_SEID,
  102. .flags = GENL_ADMIN_PERM,
  103. .doit = smc_nl_enable_seid,
  104. },
  105. {
  106. .cmd = SMC_NETLINK_DISABLE_SEID,
  107. .flags = GENL_ADMIN_PERM,
  108. .doit = smc_nl_disable_seid,
  109. },
  110. {
  111. .cmd = SMC_NETLINK_DUMP_HS_LIMITATION,
  112. /* can be retrieved by unprivileged users */
  113. .dumpit = smc_nl_dump_hs_limitation,
  114. },
  115. {
  116. .cmd = SMC_NETLINK_ENABLE_HS_LIMITATION,
  117. .flags = GENL_ADMIN_PERM,
  118. .doit = smc_nl_enable_hs_limitation,
  119. },
  120. {
  121. .cmd = SMC_NETLINK_DISABLE_HS_LIMITATION,
  122. .flags = GENL_ADMIN_PERM,
  123. .doit = smc_nl_disable_hs_limitation,
  124. },
  125. };
  126. static const struct nla_policy smc_gen_nl_policy[2] = {
  127. [SMC_CMD_MAX_ATTR] = { .type = NLA_REJECT, },
  128. };
  129. /* SMC_GENL family definition */
  130. struct genl_family smc_gen_nl_family __ro_after_init = {
  131. .hdrsize = 0,
  132. .name = SMC_GENL_FAMILY_NAME,
  133. .version = SMC_GENL_FAMILY_VERSION,
  134. .maxattr = SMC_CMD_MAX_ATTR,
  135. .policy = smc_gen_nl_policy,
  136. .netnsok = true,
  137. .module = THIS_MODULE,
  138. .ops = smc_gen_nl_ops,
  139. .n_ops = ARRAY_SIZE(smc_gen_nl_ops),
  140. .resv_start_op = SMC_NETLINK_DISABLE_HS_LIMITATION + 1,
  141. };
  142. int __init smc_nl_init(void)
  143. {
  144. return genl_register_family(&smc_gen_nl_family);
  145. }
  146. void smc_nl_exit(void)
  147. {
  148. genl_unregister_family(&smc_gen_nl_family);
  149. }