cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

netlink.c (10384B)


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