162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * net/tipc/netlink.c: TIPC configuration handling 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2005-2006, 2014, Ericsson AB 562306a36Sopenharmony_ci * Copyright (c) 2005-2007, Wind River Systems 662306a36Sopenharmony_ci * All rights reserved. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 962306a36Sopenharmony_ci * modification, are permitted provided that the following conditions are met: 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1262306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer. 1362306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 1462306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 1562306a36Sopenharmony_ci * documentation and/or other materials provided with the distribution. 1662306a36Sopenharmony_ci * 3. Neither the names of the copyright holders nor the names of its 1762306a36Sopenharmony_ci * contributors may be used to endorse or promote products derived from 1862306a36Sopenharmony_ci * this software without specific prior written permission. 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * Alternatively, this software may be distributed under the terms of the 2162306a36Sopenharmony_ci * GNU General Public License ("GPL") version 2 as published by the Free 2262306a36Sopenharmony_ci * Software Foundation. 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2562306a36Sopenharmony_ci * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2662306a36Sopenharmony_ci * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2762306a36Sopenharmony_ci * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 2862306a36Sopenharmony_ci * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2962306a36Sopenharmony_ci * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 3062306a36Sopenharmony_ci * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 3162306a36Sopenharmony_ci * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 3262306a36Sopenharmony_ci * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3362306a36Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3462306a36Sopenharmony_ci * POSSIBILITY OF SUCH DAMAGE. 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#include "core.h" 3862306a36Sopenharmony_ci#include "socket.h" 3962306a36Sopenharmony_ci#include "name_table.h" 4062306a36Sopenharmony_ci#include "bearer.h" 4162306a36Sopenharmony_ci#include "link.h" 4262306a36Sopenharmony_ci#include "node.h" 4362306a36Sopenharmony_ci#include "net.h" 4462306a36Sopenharmony_ci#include "udp_media.h" 4562306a36Sopenharmony_ci#include <net/genetlink.h> 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic const struct nla_policy tipc_nl_policy[TIPC_NLA_MAX + 1] = { 4862306a36Sopenharmony_ci [TIPC_NLA_UNSPEC] = { .type = NLA_UNSPEC, }, 4962306a36Sopenharmony_ci [TIPC_NLA_BEARER] = { .type = NLA_NESTED, }, 5062306a36Sopenharmony_ci [TIPC_NLA_SOCK] = { .type = NLA_NESTED, }, 5162306a36Sopenharmony_ci [TIPC_NLA_PUBL] = { .type = NLA_NESTED, }, 5262306a36Sopenharmony_ci [TIPC_NLA_LINK] = { .type = NLA_NESTED, }, 5362306a36Sopenharmony_ci [TIPC_NLA_MEDIA] = { .type = NLA_NESTED, }, 5462306a36Sopenharmony_ci [TIPC_NLA_NODE] = { .type = NLA_NESTED, }, 5562306a36Sopenharmony_ci [TIPC_NLA_NET] = { .type = NLA_NESTED, }, 5662306a36Sopenharmony_ci [TIPC_NLA_NAME_TABLE] = { .type = NLA_NESTED, }, 5762306a36Sopenharmony_ci [TIPC_NLA_MON] = { .type = NLA_NESTED, }, 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ciconst struct nla_policy 6162306a36Sopenharmony_citipc_nl_name_table_policy[TIPC_NLA_NAME_TABLE_MAX + 1] = { 6262306a36Sopenharmony_ci [TIPC_NLA_NAME_TABLE_UNSPEC] = { .type = NLA_UNSPEC }, 6362306a36Sopenharmony_ci [TIPC_NLA_NAME_TABLE_PUBL] = { .type = NLA_NESTED } 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciconst struct nla_policy tipc_nl_monitor_policy[TIPC_NLA_MON_MAX + 1] = { 6762306a36Sopenharmony_ci [TIPC_NLA_MON_UNSPEC] = { .type = NLA_UNSPEC }, 6862306a36Sopenharmony_ci [TIPC_NLA_MON_REF] = { .type = NLA_U32 }, 6962306a36Sopenharmony_ci [TIPC_NLA_MON_ACTIVATION_THRESHOLD] = { .type = NLA_U32 }, 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciconst struct nla_policy tipc_nl_sock_policy[TIPC_NLA_SOCK_MAX + 1] = { 7362306a36Sopenharmony_ci [TIPC_NLA_SOCK_UNSPEC] = { .type = NLA_UNSPEC }, 7462306a36Sopenharmony_ci [TIPC_NLA_SOCK_ADDR] = { .type = NLA_U32 }, 7562306a36Sopenharmony_ci [TIPC_NLA_SOCK_REF] = { .type = NLA_U32 }, 7662306a36Sopenharmony_ci [TIPC_NLA_SOCK_CON] = { .type = NLA_NESTED }, 7762306a36Sopenharmony_ci [TIPC_NLA_SOCK_HAS_PUBL] = { .type = NLA_FLAG } 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ciconst struct nla_policy tipc_nl_net_policy[TIPC_NLA_NET_MAX + 1] = { 8162306a36Sopenharmony_ci [TIPC_NLA_NET_UNSPEC] = { .type = NLA_UNSPEC }, 8262306a36Sopenharmony_ci [TIPC_NLA_NET_ID] = { .type = NLA_U32 }, 8362306a36Sopenharmony_ci [TIPC_NLA_NET_ADDR] = { .type = NLA_U32 }, 8462306a36Sopenharmony_ci [TIPC_NLA_NET_NODEID] = { .type = NLA_U64 }, 8562306a36Sopenharmony_ci [TIPC_NLA_NET_NODEID_W1] = { .type = NLA_U64 }, 8662306a36Sopenharmony_ci [TIPC_NLA_NET_ADDR_LEGACY] = { .type = NLA_FLAG } 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciconst struct nla_policy tipc_nl_link_policy[TIPC_NLA_LINK_MAX + 1] = { 9062306a36Sopenharmony_ci [TIPC_NLA_LINK_UNSPEC] = { .type = NLA_UNSPEC }, 9162306a36Sopenharmony_ci [TIPC_NLA_LINK_NAME] = { .type = NLA_NUL_STRING, 9262306a36Sopenharmony_ci .len = TIPC_MAX_LINK_NAME }, 9362306a36Sopenharmony_ci [TIPC_NLA_LINK_MTU] = { .type = NLA_U32 }, 9462306a36Sopenharmony_ci [TIPC_NLA_LINK_BROADCAST] = { .type = NLA_FLAG }, 9562306a36Sopenharmony_ci [TIPC_NLA_LINK_UP] = { .type = NLA_FLAG }, 9662306a36Sopenharmony_ci [TIPC_NLA_LINK_ACTIVE] = { .type = NLA_FLAG }, 9762306a36Sopenharmony_ci [TIPC_NLA_LINK_PROP] = { .type = NLA_NESTED }, 9862306a36Sopenharmony_ci [TIPC_NLA_LINK_STATS] = { .type = NLA_NESTED }, 9962306a36Sopenharmony_ci [TIPC_NLA_LINK_RX] = { .type = NLA_U32 }, 10062306a36Sopenharmony_ci [TIPC_NLA_LINK_TX] = { .type = NLA_U32 } 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ciconst struct nla_policy tipc_nl_node_policy[TIPC_NLA_NODE_MAX + 1] = { 10462306a36Sopenharmony_ci [TIPC_NLA_NODE_UNSPEC] = { .type = NLA_UNSPEC }, 10562306a36Sopenharmony_ci [TIPC_NLA_NODE_ADDR] = { .type = NLA_U32 }, 10662306a36Sopenharmony_ci [TIPC_NLA_NODE_UP] = { .type = NLA_FLAG }, 10762306a36Sopenharmony_ci [TIPC_NLA_NODE_ID] = { .type = NLA_BINARY, 10862306a36Sopenharmony_ci .len = TIPC_NODEID_LEN}, 10962306a36Sopenharmony_ci [TIPC_NLA_NODE_KEY] = { .type = NLA_BINARY, 11062306a36Sopenharmony_ci .len = TIPC_AEAD_KEY_SIZE_MAX}, 11162306a36Sopenharmony_ci [TIPC_NLA_NODE_KEY_MASTER] = { .type = NLA_FLAG }, 11262306a36Sopenharmony_ci [TIPC_NLA_NODE_REKEYING] = { .type = NLA_U32 }, 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci/* Properties valid for media, bearer and link */ 11662306a36Sopenharmony_ciconst struct nla_policy tipc_nl_prop_policy[TIPC_NLA_PROP_MAX + 1] = { 11762306a36Sopenharmony_ci [TIPC_NLA_PROP_UNSPEC] = { .type = NLA_UNSPEC }, 11862306a36Sopenharmony_ci [TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 }, 11962306a36Sopenharmony_ci [TIPC_NLA_PROP_TOL] = { .type = NLA_U32 }, 12062306a36Sopenharmony_ci [TIPC_NLA_PROP_WIN] = { .type = NLA_U32 }, 12162306a36Sopenharmony_ci [TIPC_NLA_PROP_MTU] = { .type = NLA_U32 }, 12262306a36Sopenharmony_ci [TIPC_NLA_PROP_BROADCAST] = { .type = NLA_U32 }, 12362306a36Sopenharmony_ci [TIPC_NLA_PROP_BROADCAST_RATIO] = { .type = NLA_U32 } 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ciconst struct nla_policy tipc_nl_bearer_policy[TIPC_NLA_BEARER_MAX + 1] = { 12762306a36Sopenharmony_ci [TIPC_NLA_BEARER_UNSPEC] = { .type = NLA_UNSPEC }, 12862306a36Sopenharmony_ci [TIPC_NLA_BEARER_NAME] = { .type = NLA_NUL_STRING, 12962306a36Sopenharmony_ci .len = TIPC_MAX_BEARER_NAME }, 13062306a36Sopenharmony_ci [TIPC_NLA_BEARER_PROP] = { .type = NLA_NESTED }, 13162306a36Sopenharmony_ci [TIPC_NLA_BEARER_DOMAIN] = { .type = NLA_U32 } 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ciconst struct nla_policy tipc_nl_media_policy[TIPC_NLA_MEDIA_MAX + 1] = { 13562306a36Sopenharmony_ci [TIPC_NLA_MEDIA_UNSPEC] = { .type = NLA_UNSPEC }, 13662306a36Sopenharmony_ci [TIPC_NLA_MEDIA_NAME] = { .type = NLA_STRING }, 13762306a36Sopenharmony_ci [TIPC_NLA_MEDIA_PROP] = { .type = NLA_NESTED } 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ciconst struct nla_policy tipc_nl_udp_policy[TIPC_NLA_UDP_MAX + 1] = { 14162306a36Sopenharmony_ci [TIPC_NLA_UDP_UNSPEC] = {.type = NLA_UNSPEC}, 14262306a36Sopenharmony_ci [TIPC_NLA_UDP_LOCAL] = {.type = NLA_BINARY, 14362306a36Sopenharmony_ci .len = sizeof(struct sockaddr_storage)}, 14462306a36Sopenharmony_ci [TIPC_NLA_UDP_REMOTE] = {.type = NLA_BINARY, 14562306a36Sopenharmony_ci .len = sizeof(struct sockaddr_storage)}, 14662306a36Sopenharmony_ci}; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci/* Users of the legacy API (tipc-config) can't handle that we add operations, 14962306a36Sopenharmony_ci * so we have a separate genl handling for the new API. 15062306a36Sopenharmony_ci */ 15162306a36Sopenharmony_cistatic const struct genl_ops tipc_genl_v2_ops[] = { 15262306a36Sopenharmony_ci { 15362306a36Sopenharmony_ci .cmd = TIPC_NL_BEARER_DISABLE, 15462306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15562306a36Sopenharmony_ci .doit = tipc_nl_bearer_disable, 15662306a36Sopenharmony_ci }, 15762306a36Sopenharmony_ci { 15862306a36Sopenharmony_ci .cmd = TIPC_NL_BEARER_ENABLE, 15962306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16062306a36Sopenharmony_ci .doit = tipc_nl_bearer_enable, 16162306a36Sopenharmony_ci }, 16262306a36Sopenharmony_ci { 16362306a36Sopenharmony_ci .cmd = TIPC_NL_BEARER_GET, 16462306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16562306a36Sopenharmony_ci .doit = tipc_nl_bearer_get, 16662306a36Sopenharmony_ci .dumpit = tipc_nl_bearer_dump, 16762306a36Sopenharmony_ci }, 16862306a36Sopenharmony_ci { 16962306a36Sopenharmony_ci .cmd = TIPC_NL_BEARER_ADD, 17062306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17162306a36Sopenharmony_ci .doit = tipc_nl_bearer_add, 17262306a36Sopenharmony_ci }, 17362306a36Sopenharmony_ci { 17462306a36Sopenharmony_ci .cmd = TIPC_NL_BEARER_SET, 17562306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17662306a36Sopenharmony_ci .doit = tipc_nl_bearer_set, 17762306a36Sopenharmony_ci }, 17862306a36Sopenharmony_ci { 17962306a36Sopenharmony_ci .cmd = TIPC_NL_SOCK_GET, 18062306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18162306a36Sopenharmony_ci .start = tipc_dump_start, 18262306a36Sopenharmony_ci .dumpit = tipc_nl_sk_dump, 18362306a36Sopenharmony_ci .done = tipc_dump_done, 18462306a36Sopenharmony_ci }, 18562306a36Sopenharmony_ci { 18662306a36Sopenharmony_ci .cmd = TIPC_NL_PUBL_GET, 18762306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | 18862306a36Sopenharmony_ci GENL_DONT_VALIDATE_DUMP_STRICT, 18962306a36Sopenharmony_ci .dumpit = tipc_nl_publ_dump, 19062306a36Sopenharmony_ci }, 19162306a36Sopenharmony_ci { 19262306a36Sopenharmony_ci .cmd = TIPC_NL_LINK_GET, 19362306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT, 19462306a36Sopenharmony_ci .doit = tipc_nl_node_get_link, 19562306a36Sopenharmony_ci .dumpit = tipc_nl_node_dump_link, 19662306a36Sopenharmony_ci }, 19762306a36Sopenharmony_ci { 19862306a36Sopenharmony_ci .cmd = TIPC_NL_LINK_SET, 19962306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20062306a36Sopenharmony_ci .doit = tipc_nl_node_set_link, 20162306a36Sopenharmony_ci }, 20262306a36Sopenharmony_ci { 20362306a36Sopenharmony_ci .cmd = TIPC_NL_LINK_RESET_STATS, 20462306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20562306a36Sopenharmony_ci .doit = tipc_nl_node_reset_link_stats, 20662306a36Sopenharmony_ci }, 20762306a36Sopenharmony_ci { 20862306a36Sopenharmony_ci .cmd = TIPC_NL_MEDIA_GET, 20962306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 21062306a36Sopenharmony_ci .doit = tipc_nl_media_get, 21162306a36Sopenharmony_ci .dumpit = tipc_nl_media_dump, 21262306a36Sopenharmony_ci }, 21362306a36Sopenharmony_ci { 21462306a36Sopenharmony_ci .cmd = TIPC_NL_MEDIA_SET, 21562306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 21662306a36Sopenharmony_ci .doit = tipc_nl_media_set, 21762306a36Sopenharmony_ci }, 21862306a36Sopenharmony_ci { 21962306a36Sopenharmony_ci .cmd = TIPC_NL_NODE_GET, 22062306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 22162306a36Sopenharmony_ci .dumpit = tipc_nl_node_dump, 22262306a36Sopenharmony_ci }, 22362306a36Sopenharmony_ci { 22462306a36Sopenharmony_ci .cmd = TIPC_NL_NET_GET, 22562306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 22662306a36Sopenharmony_ci .dumpit = tipc_nl_net_dump, 22762306a36Sopenharmony_ci }, 22862306a36Sopenharmony_ci { 22962306a36Sopenharmony_ci .cmd = TIPC_NL_NET_SET, 23062306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 23162306a36Sopenharmony_ci .doit = tipc_nl_net_set, 23262306a36Sopenharmony_ci }, 23362306a36Sopenharmony_ci { 23462306a36Sopenharmony_ci .cmd = TIPC_NL_NAME_TABLE_GET, 23562306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 23662306a36Sopenharmony_ci .dumpit = tipc_nl_name_table_dump, 23762306a36Sopenharmony_ci }, 23862306a36Sopenharmony_ci { 23962306a36Sopenharmony_ci .cmd = TIPC_NL_MON_SET, 24062306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 24162306a36Sopenharmony_ci .doit = tipc_nl_node_set_monitor, 24262306a36Sopenharmony_ci }, 24362306a36Sopenharmony_ci { 24462306a36Sopenharmony_ci .cmd = TIPC_NL_MON_GET, 24562306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 24662306a36Sopenharmony_ci .doit = tipc_nl_node_get_monitor, 24762306a36Sopenharmony_ci .dumpit = tipc_nl_node_dump_monitor, 24862306a36Sopenharmony_ci }, 24962306a36Sopenharmony_ci { 25062306a36Sopenharmony_ci .cmd = TIPC_NL_MON_PEER_GET, 25162306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | 25262306a36Sopenharmony_ci GENL_DONT_VALIDATE_DUMP_STRICT, 25362306a36Sopenharmony_ci .dumpit = tipc_nl_node_dump_monitor_peer, 25462306a36Sopenharmony_ci }, 25562306a36Sopenharmony_ci { 25662306a36Sopenharmony_ci .cmd = TIPC_NL_PEER_REMOVE, 25762306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 25862306a36Sopenharmony_ci .doit = tipc_nl_peer_rm, 25962306a36Sopenharmony_ci }, 26062306a36Sopenharmony_ci#ifdef CONFIG_TIPC_MEDIA_UDP 26162306a36Sopenharmony_ci { 26262306a36Sopenharmony_ci .cmd = TIPC_NL_UDP_GET_REMOTEIP, 26362306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | 26462306a36Sopenharmony_ci GENL_DONT_VALIDATE_DUMP_STRICT, 26562306a36Sopenharmony_ci .dumpit = tipc_udp_nl_dump_remoteip, 26662306a36Sopenharmony_ci }, 26762306a36Sopenharmony_ci#endif 26862306a36Sopenharmony_ci#ifdef CONFIG_TIPC_CRYPTO 26962306a36Sopenharmony_ci { 27062306a36Sopenharmony_ci .cmd = TIPC_NL_KEY_SET, 27162306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 27262306a36Sopenharmony_ci .doit = tipc_nl_node_set_key, 27362306a36Sopenharmony_ci }, 27462306a36Sopenharmony_ci { 27562306a36Sopenharmony_ci .cmd = TIPC_NL_KEY_FLUSH, 27662306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 27762306a36Sopenharmony_ci .doit = tipc_nl_node_flush_key, 27862306a36Sopenharmony_ci }, 27962306a36Sopenharmony_ci#endif 28062306a36Sopenharmony_ci { 28162306a36Sopenharmony_ci .cmd = TIPC_NL_ADDR_LEGACY_GET, 28262306a36Sopenharmony_ci .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 28362306a36Sopenharmony_ci .doit = tipc_nl_net_addr_legacy_get, 28462306a36Sopenharmony_ci }, 28562306a36Sopenharmony_ci}; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_cistruct genl_family tipc_genl_family __ro_after_init = { 28862306a36Sopenharmony_ci .name = TIPC_GENL_V2_NAME, 28962306a36Sopenharmony_ci .version = TIPC_GENL_V2_VERSION, 29062306a36Sopenharmony_ci .hdrsize = 0, 29162306a36Sopenharmony_ci .maxattr = TIPC_NLA_MAX, 29262306a36Sopenharmony_ci .policy = tipc_nl_policy, 29362306a36Sopenharmony_ci .netnsok = true, 29462306a36Sopenharmony_ci .module = THIS_MODULE, 29562306a36Sopenharmony_ci .ops = tipc_genl_v2_ops, 29662306a36Sopenharmony_ci .n_ops = ARRAY_SIZE(tipc_genl_v2_ops), 29762306a36Sopenharmony_ci .resv_start_op = TIPC_NL_ADDR_LEGACY_GET + 1, 29862306a36Sopenharmony_ci}; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ciint __init tipc_netlink_start(void) 30162306a36Sopenharmony_ci{ 30262306a36Sopenharmony_ci int res; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci res = genl_register_family(&tipc_genl_family); 30562306a36Sopenharmony_ci if (res) { 30662306a36Sopenharmony_ci pr_err("Failed to register netlink interface\n"); 30762306a36Sopenharmony_ci return res; 30862306a36Sopenharmony_ci } 30962306a36Sopenharmony_ci return 0; 31062306a36Sopenharmony_ci} 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_civoid tipc_netlink_stop(void) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci genl_unregister_family(&tipc_genl_family); 31562306a36Sopenharmony_ci} 316