Samuel Cabrero | 06f08da | 2020-11-30 19:02:49 +0100 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | /* |
| 3 | * Netlink routines for CIFS |
| 4 | * |
| 5 | * Copyright (c) 2020 Samuel Cabrero <scabrero@suse.de> |
| 6 | */ |
| 7 | |
| 8 | #include <net/genetlink.h> |
| 9 | #include <uapi/linux/cifs/cifs_netlink.h> |
| 10 | |
| 11 | #include "netlink.h" |
| 12 | #include "cifsglob.h" |
| 13 | #include "cifs_debug.h" |
Samuel Cabrero | fed979a | 2020-11-30 19:02:52 +0100 | [diff] [blame] | 14 | #include "cifs_swn.h" |
Samuel Cabrero | 06f08da | 2020-11-30 19:02:49 +0100 | [diff] [blame] | 15 | |
| 16 | static const struct nla_policy cifs_genl_policy[CIFS_GENL_ATTR_MAX + 1] = { |
Samuel Cabrero | bf80e5d | 2020-11-30 19:02:51 +0100 | [diff] [blame] | 17 | [CIFS_GENL_ATTR_SWN_REGISTRATION_ID] = { .type = NLA_U32 }, |
| 18 | [CIFS_GENL_ATTR_SWN_NET_NAME] = { .type = NLA_STRING }, |
| 19 | [CIFS_GENL_ATTR_SWN_SHARE_NAME] = { .type = NLA_STRING }, |
| 20 | [CIFS_GENL_ATTR_SWN_IP] = { .len = sizeof(struct sockaddr_storage) }, |
| 21 | [CIFS_GENL_ATTR_SWN_NET_NAME_NOTIFY] = { .type = NLA_FLAG }, |
| 22 | [CIFS_GENL_ATTR_SWN_SHARE_NAME_NOTIFY] = { .type = NLA_FLAG }, |
| 23 | [CIFS_GENL_ATTR_SWN_IP_NOTIFY] = { .type = NLA_FLAG }, |
| 24 | [CIFS_GENL_ATTR_SWN_KRB_AUTH] = { .type = NLA_FLAG }, |
| 25 | [CIFS_GENL_ATTR_SWN_USER_NAME] = { .type = NLA_STRING }, |
| 26 | [CIFS_GENL_ATTR_SWN_PASSWORD] = { .type = NLA_STRING }, |
| 27 | [CIFS_GENL_ATTR_SWN_DOMAIN_NAME] = { .type = NLA_STRING }, |
Samuel Cabrero | fed979a | 2020-11-30 19:02:52 +0100 | [diff] [blame] | 28 | [CIFS_GENL_ATTR_SWN_NOTIFICATION_TYPE] = { .type = NLA_U32 }, |
| 29 | [CIFS_GENL_ATTR_SWN_RESOURCE_STATE] = { .type = NLA_U32 }, |
| 30 | [CIFS_GENL_ATTR_SWN_RESOURCE_NAME] = { .type = NLA_STRING}, |
Samuel Cabrero | 06f08da | 2020-11-30 19:02:49 +0100 | [diff] [blame] | 31 | }; |
| 32 | |
Rikard Falkeborn | 57c8ce7 | 2021-05-26 22:35:45 +0200 | [diff] [blame] | 33 | static const struct genl_ops cifs_genl_ops[] = { |
Samuel Cabrero | fed979a | 2020-11-30 19:02:52 +0100 | [diff] [blame] | 34 | { |
| 35 | .cmd = CIFS_GENL_CMD_SWN_NOTIFY, |
| 36 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
| 37 | .doit = cifs_swn_notify, |
| 38 | }, |
Samuel Cabrero | 06f08da | 2020-11-30 19:02:49 +0100 | [diff] [blame] | 39 | }; |
| 40 | |
| 41 | static const struct genl_multicast_group cifs_genl_mcgrps[] = { |
| 42 | [CIFS_GENL_MCGRP_SWN] = { .name = CIFS_GENL_MCGRP_SWN_NAME }, |
| 43 | }; |
| 44 | |
| 45 | struct genl_family cifs_genl_family = { |
| 46 | .name = CIFS_GENL_NAME, |
| 47 | .version = CIFS_GENL_VERSION, |
| 48 | .hdrsize = 0, |
| 49 | .maxattr = CIFS_GENL_ATTR_MAX, |
| 50 | .module = THIS_MODULE, |
| 51 | .policy = cifs_genl_policy, |
| 52 | .ops = cifs_genl_ops, |
| 53 | .n_ops = ARRAY_SIZE(cifs_genl_ops), |
| 54 | .mcgrps = cifs_genl_mcgrps, |
| 55 | .n_mcgrps = ARRAY_SIZE(cifs_genl_mcgrps), |
| 56 | }; |
| 57 | |
| 58 | /** |
| 59 | * cifs_genl_init - Register generic netlink family |
| 60 | * |
| 61 | * Return zero if initialized successfully, otherwise non-zero. |
| 62 | */ |
| 63 | int cifs_genl_init(void) |
| 64 | { |
| 65 | int ret; |
| 66 | |
| 67 | ret = genl_register_family(&cifs_genl_family); |
| 68 | if (ret < 0) { |
| 69 | cifs_dbg(VFS, "%s: failed to register netlink family\n", |
| 70 | __func__); |
| 71 | return ret; |
| 72 | } |
| 73 | |
| 74 | return 0; |
| 75 | } |
| 76 | |
| 77 | /** |
| 78 | * cifs_genl_exit - Unregister generic netlink family |
| 79 | */ |
| 80 | void cifs_genl_exit(void) |
| 81 | { |
| 82 | int ret; |
| 83 | |
| 84 | ret = genl_unregister_family(&cifs_genl_family); |
| 85 | if (ret < 0) { |
| 86 | cifs_dbg(VFS, "%s: failed to unregister netlink family\n", |
| 87 | __func__); |
| 88 | } |
| 89 | } |