ila_main.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <net/genetlink.h>
  3. #include <net/ila.h>
  4. #include <net/netns/generic.h>
  5. #include <uapi/linux/genetlink.h>
  6. #include "ila.h"
  7. static const struct nla_policy ila_nl_policy[ILA_ATTR_MAX + 1] = {
  8. [ILA_ATTR_LOCATOR] = { .type = NLA_U64, },
  9. [ILA_ATTR_LOCATOR_MATCH] = { .type = NLA_U64, },
  10. [ILA_ATTR_IFINDEX] = { .type = NLA_U32, },
  11. [ILA_ATTR_CSUM_MODE] = { .type = NLA_U8, },
  12. [ILA_ATTR_IDENT_TYPE] = { .type = NLA_U8, },
  13. };
  14. static const struct genl_ops ila_nl_ops[] = {
  15. {
  16. .cmd = ILA_CMD_ADD,
  17. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  18. .doit = ila_xlat_nl_cmd_add_mapping,
  19. .flags = GENL_ADMIN_PERM,
  20. },
  21. {
  22. .cmd = ILA_CMD_DEL,
  23. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  24. .doit = ila_xlat_nl_cmd_del_mapping,
  25. .flags = GENL_ADMIN_PERM,
  26. },
  27. {
  28. .cmd = ILA_CMD_FLUSH,
  29. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  30. .doit = ila_xlat_nl_cmd_flush,
  31. .flags = GENL_ADMIN_PERM,
  32. },
  33. {
  34. .cmd = ILA_CMD_GET,
  35. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  36. .doit = ila_xlat_nl_cmd_get_mapping,
  37. .start = ila_xlat_nl_dump_start,
  38. .dumpit = ila_xlat_nl_dump,
  39. .done = ila_xlat_nl_dump_done,
  40. },
  41. };
  42. unsigned int ila_net_id;
  43. struct genl_family ila_nl_family __ro_after_init = {
  44. .hdrsize = 0,
  45. .name = ILA_GENL_NAME,
  46. .version = ILA_GENL_VERSION,
  47. .maxattr = ILA_ATTR_MAX,
  48. .policy = ila_nl_policy,
  49. .netnsok = true,
  50. .parallel_ops = true,
  51. .module = THIS_MODULE,
  52. .ops = ila_nl_ops,
  53. .n_ops = ARRAY_SIZE(ila_nl_ops),
  54. .resv_start_op = ILA_CMD_FLUSH + 1,
  55. };
  56. static __net_init int ila_init_net(struct net *net)
  57. {
  58. int err;
  59. err = ila_xlat_init_net(net);
  60. if (err)
  61. goto ila_xlat_init_fail;
  62. return 0;
  63. ila_xlat_init_fail:
  64. return err;
  65. }
  66. static __net_exit void ila_exit_net(struct net *net)
  67. {
  68. ila_xlat_exit_net(net);
  69. }
  70. static struct pernet_operations ila_net_ops = {
  71. .init = ila_init_net,
  72. .exit = ila_exit_net,
  73. .id = &ila_net_id,
  74. .size = sizeof(struct ila_net),
  75. };
  76. static int __init ila_init(void)
  77. {
  78. int ret;
  79. ret = register_pernet_device(&ila_net_ops);
  80. if (ret)
  81. goto register_device_fail;
  82. ret = genl_register_family(&ila_nl_family);
  83. if (ret)
  84. goto register_family_fail;
  85. ret = ila_lwt_init();
  86. if (ret)
  87. goto fail_lwt;
  88. return 0;
  89. fail_lwt:
  90. genl_unregister_family(&ila_nl_family);
  91. register_family_fail:
  92. unregister_pernet_device(&ila_net_ops);
  93. register_device_fail:
  94. return ret;
  95. }
  96. static void __exit ila_fini(void)
  97. {
  98. ila_lwt_fini();
  99. genl_unregister_family(&ila_nl_family);
  100. unregister_pernet_device(&ila_net_ops);
  101. }
  102. module_init(ila_init);
  103. module_exit(ila_fini);
  104. MODULE_AUTHOR("Tom Herbert <[email protected]>");
  105. MODULE_LICENSE("GPL");
  106. MODULE_DESCRIPTION("IPv6: Identifier Locator Addressing (ILA)");