^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * net/tipc/netlink.c: TIPC configuration handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2005-2006, 2014, Ericsson AB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2005-2007, Wind River Systems
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * modification, are permitted provided that the following conditions are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * 1. Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * notice, this list of conditions and the following disclaimer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * 2. Redistributions in binary form must reproduce the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * notice, this list of conditions and the following disclaimer in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * documentation and/or other materials provided with the distribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * 3. Neither the names of the copyright holders nor the names of its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * contributors may be used to endorse or promote products derived from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * Alternatively, this software may be distributed under the terms of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * GNU General Public License ("GPL") version 2 as published by the Free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * POSSIBILITY OF SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "core.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "socket.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include "name_table.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include "bearer.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "link.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include "node.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include "net.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include "udp_media.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include <net/genetlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static const struct nla_policy tipc_nl_policy[TIPC_NLA_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) [TIPC_NLA_UNSPEC] = { .type = NLA_UNSPEC, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) [TIPC_NLA_BEARER] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) [TIPC_NLA_SOCK] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) [TIPC_NLA_PUBL] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) [TIPC_NLA_LINK] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) [TIPC_NLA_MEDIA] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) [TIPC_NLA_NODE] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) [TIPC_NLA_NET] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) [TIPC_NLA_NAME_TABLE] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) [TIPC_NLA_MON] = { .type = NLA_NESTED, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) const struct nla_policy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) tipc_nl_name_table_policy[TIPC_NLA_NAME_TABLE_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) [TIPC_NLA_NAME_TABLE_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) [TIPC_NLA_NAME_TABLE_PUBL] = { .type = NLA_NESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) const struct nla_policy tipc_nl_monitor_policy[TIPC_NLA_MON_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) [TIPC_NLA_MON_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) [TIPC_NLA_MON_REF] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) [TIPC_NLA_MON_ACTIVATION_THRESHOLD] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) const struct nla_policy tipc_nl_sock_policy[TIPC_NLA_SOCK_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) [TIPC_NLA_SOCK_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) [TIPC_NLA_SOCK_ADDR] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) [TIPC_NLA_SOCK_REF] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) [TIPC_NLA_SOCK_CON] = { .type = NLA_NESTED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) [TIPC_NLA_SOCK_HAS_PUBL] = { .type = NLA_FLAG }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) const struct nla_policy tipc_nl_net_policy[TIPC_NLA_NET_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) [TIPC_NLA_NET_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) [TIPC_NLA_NET_ID] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) [TIPC_NLA_NET_ADDR] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) [TIPC_NLA_NET_NODEID] = { .type = NLA_U64 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) [TIPC_NLA_NET_NODEID_W1] = { .type = NLA_U64 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) [TIPC_NLA_NET_ADDR_LEGACY] = { .type = NLA_FLAG }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) const struct nla_policy tipc_nl_link_policy[TIPC_NLA_LINK_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) [TIPC_NLA_LINK_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) [TIPC_NLA_LINK_NAME] = { .type = NLA_STRING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .len = TIPC_MAX_LINK_NAME },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) [TIPC_NLA_LINK_MTU] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) [TIPC_NLA_LINK_BROADCAST] = { .type = NLA_FLAG },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) [TIPC_NLA_LINK_UP] = { .type = NLA_FLAG },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) [TIPC_NLA_LINK_ACTIVE] = { .type = NLA_FLAG },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) [TIPC_NLA_LINK_PROP] = { .type = NLA_NESTED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) [TIPC_NLA_LINK_STATS] = { .type = NLA_NESTED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) [TIPC_NLA_LINK_RX] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) [TIPC_NLA_LINK_TX] = { .type = NLA_U32 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) const struct nla_policy tipc_nl_node_policy[TIPC_NLA_NODE_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) [TIPC_NLA_NODE_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) [TIPC_NLA_NODE_ADDR] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) [TIPC_NLA_NODE_UP] = { .type = NLA_FLAG },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) [TIPC_NLA_NODE_ID] = { .type = NLA_BINARY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .len = TIPC_NODEID_LEN},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) [TIPC_NLA_NODE_KEY] = { .type = NLA_BINARY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) .len = TIPC_AEAD_KEY_SIZE_MAX},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) [TIPC_NLA_NODE_KEY_MASTER] = { .type = NLA_FLAG },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) [TIPC_NLA_NODE_REKEYING] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* Properties valid for media, bearer and link */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) const struct nla_policy tipc_nl_prop_policy[TIPC_NLA_PROP_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) [TIPC_NLA_PROP_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) [TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) [TIPC_NLA_PROP_TOL] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) [TIPC_NLA_PROP_WIN] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) [TIPC_NLA_PROP_MTU] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) [TIPC_NLA_PROP_BROADCAST] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) [TIPC_NLA_PROP_BROADCAST_RATIO] = { .type = NLA_U32 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) const struct nla_policy tipc_nl_bearer_policy[TIPC_NLA_BEARER_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) [TIPC_NLA_BEARER_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) [TIPC_NLA_BEARER_NAME] = { .type = NLA_STRING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .len = TIPC_MAX_BEARER_NAME },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) [TIPC_NLA_BEARER_PROP] = { .type = NLA_NESTED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) [TIPC_NLA_BEARER_DOMAIN] = { .type = NLA_U32 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) const struct nla_policy tipc_nl_media_policy[TIPC_NLA_MEDIA_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) [TIPC_NLA_MEDIA_UNSPEC] = { .type = NLA_UNSPEC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) [TIPC_NLA_MEDIA_NAME] = { .type = NLA_STRING },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) [TIPC_NLA_MEDIA_PROP] = { .type = NLA_NESTED }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) const struct nla_policy tipc_nl_udp_policy[TIPC_NLA_UDP_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) [TIPC_NLA_UDP_UNSPEC] = {.type = NLA_UNSPEC},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) [TIPC_NLA_UDP_LOCAL] = {.type = NLA_BINARY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .len = sizeof(struct sockaddr_storage)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) [TIPC_NLA_UDP_REMOTE] = {.type = NLA_BINARY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) .len = sizeof(struct sockaddr_storage)},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* Users of the legacy API (tipc-config) can't handle that we add operations,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * so we have a separate genl handling for the new API.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) static const struct genl_ops tipc_genl_v2_ops[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) .cmd = TIPC_NL_BEARER_DISABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .doit = tipc_nl_bearer_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) .cmd = TIPC_NL_BEARER_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) .doit = tipc_nl_bearer_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) .cmd = TIPC_NL_BEARER_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) .doit = tipc_nl_bearer_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .dumpit = tipc_nl_bearer_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) .cmd = TIPC_NL_BEARER_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) .doit = tipc_nl_bearer_add,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) .cmd = TIPC_NL_BEARER_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) .doit = tipc_nl_bearer_set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .cmd = TIPC_NL_SOCK_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .start = tipc_dump_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) .dumpit = tipc_nl_sk_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .done = tipc_dump_done,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) .cmd = TIPC_NL_PUBL_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) .validate = GENL_DONT_VALIDATE_STRICT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) GENL_DONT_VALIDATE_DUMP_STRICT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .dumpit = tipc_nl_publ_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) .cmd = TIPC_NL_LINK_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) .validate = GENL_DONT_VALIDATE_STRICT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) .doit = tipc_nl_node_get_link,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) .dumpit = tipc_nl_node_dump_link,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) .cmd = TIPC_NL_LINK_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) .doit = tipc_nl_node_set_link,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .cmd = TIPC_NL_LINK_RESET_STATS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) .doit = tipc_nl_node_reset_link_stats,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) .cmd = TIPC_NL_MEDIA_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) .doit = tipc_nl_media_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) .dumpit = tipc_nl_media_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .cmd = TIPC_NL_MEDIA_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .doit = tipc_nl_media_set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) .cmd = TIPC_NL_NODE_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) .dumpit = tipc_nl_node_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .cmd = TIPC_NL_NET_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) .dumpit = tipc_nl_net_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) .cmd = TIPC_NL_NET_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) .doit = tipc_nl_net_set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) .cmd = TIPC_NL_NAME_TABLE_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) .dumpit = tipc_nl_name_table_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) .cmd = TIPC_NL_MON_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) .doit = tipc_nl_node_set_monitor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) .cmd = TIPC_NL_MON_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) .doit = tipc_nl_node_get_monitor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) .dumpit = tipc_nl_node_dump_monitor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .cmd = TIPC_NL_MON_PEER_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .validate = GENL_DONT_VALIDATE_STRICT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) GENL_DONT_VALIDATE_DUMP_STRICT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) .dumpit = tipc_nl_node_dump_monitor_peer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) .cmd = TIPC_NL_PEER_REMOVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) .doit = tipc_nl_peer_rm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) #ifdef CONFIG_TIPC_MEDIA_UDP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) .cmd = TIPC_NL_UDP_GET_REMOTEIP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) .validate = GENL_DONT_VALIDATE_STRICT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) GENL_DONT_VALIDATE_DUMP_STRICT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) .dumpit = tipc_udp_nl_dump_remoteip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #ifdef CONFIG_TIPC_CRYPTO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) .cmd = TIPC_NL_KEY_SET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) .doit = tipc_nl_node_set_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .cmd = TIPC_NL_KEY_FLUSH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .doit = tipc_nl_node_flush_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) .cmd = TIPC_NL_ADDR_LEGACY_GET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) .doit = tipc_nl_net_addr_legacy_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) struct genl_family tipc_genl_family __ro_after_init = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) .name = TIPC_GENL_V2_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) .version = TIPC_GENL_V2_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) .hdrsize = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) .maxattr = TIPC_NLA_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) .policy = tipc_nl_policy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) .netnsok = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) .module = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) .ops = tipc_genl_v2_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) .n_ops = ARRAY_SIZE(tipc_genl_v2_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) int __init tipc_netlink_start(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) res = genl_register_family(&tipc_genl_family);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) if (res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) pr_err("Failed to register netlink interface\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) void tipc_netlink_stop(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) genl_unregister_family(&tipc_genl_family);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) }