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

core.c (6035B)


      1/*
      2 * net/tipc/core.c: TIPC module code
      3 *
      4 * Copyright (c) 2003-2006, 2013, Ericsson AB
      5 * Copyright (c) 2005-2006, 2010-2013, 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 "name_table.h"
     39#include "subscr.h"
     40#include "bearer.h"
     41#include "net.h"
     42#include "socket.h"
     43#include "bcast.h"
     44#include "node.h"
     45#include "crypto.h"
     46
     47#include <linux/module.h>
     48
     49/* configurable TIPC parameters */
     50unsigned int tipc_net_id __read_mostly;
     51int sysctl_tipc_rmem[3] __read_mostly;	/* min/default/max */
     52
     53static int __net_init tipc_init_net(struct net *net)
     54{
     55	struct tipc_net *tn = net_generic(net, tipc_net_id);
     56	int err;
     57
     58	tn->net_id = 4711;
     59	tn->node_addr = 0;
     60	tn->trial_addr = 0;
     61	tn->addr_trial_end = 0;
     62	tn->capabilities = TIPC_NODE_CAPABILITIES;
     63	INIT_WORK(&tn->work, tipc_net_finalize_work);
     64	memset(tn->node_id, 0, sizeof(tn->node_id));
     65	memset(tn->node_id_string, 0, sizeof(tn->node_id_string));
     66	tn->mon_threshold = TIPC_DEF_MON_THRESHOLD;
     67	get_random_bytes(&tn->random, sizeof(int));
     68	INIT_LIST_HEAD(&tn->node_list);
     69	spin_lock_init(&tn->node_list_lock);
     70
     71#ifdef CONFIG_TIPC_CRYPTO
     72	err = tipc_crypto_start(&tn->crypto_tx, net, NULL);
     73	if (err)
     74		goto out_crypto;
     75#endif
     76	err = tipc_sk_rht_init(net);
     77	if (err)
     78		goto out_sk_rht;
     79
     80	err = tipc_nametbl_init(net);
     81	if (err)
     82		goto out_nametbl;
     83
     84	err = tipc_bcast_init(net);
     85	if (err)
     86		goto out_bclink;
     87
     88	err = tipc_attach_loopback(net);
     89	if (err)
     90		goto out_bclink;
     91
     92	return 0;
     93
     94out_bclink:
     95	tipc_nametbl_stop(net);
     96out_nametbl:
     97	tipc_sk_rht_destroy(net);
     98out_sk_rht:
     99
    100#ifdef CONFIG_TIPC_CRYPTO
    101	tipc_crypto_stop(&tn->crypto_tx);
    102out_crypto:
    103#endif
    104	return err;
    105}
    106
    107static void __net_exit tipc_exit_net(struct net *net)
    108{
    109	struct tipc_net *tn = tipc_net(net);
    110
    111	tipc_detach_loopback(net);
    112	tipc_net_stop(net);
    113	/* Make sure the tipc_net_finalize_work() finished */
    114	cancel_work_sync(&tn->work);
    115	tipc_bcast_stop(net);
    116	tipc_nametbl_stop(net);
    117	tipc_sk_rht_destroy(net);
    118#ifdef CONFIG_TIPC_CRYPTO
    119	tipc_crypto_stop(&tipc_net(net)->crypto_tx);
    120#endif
    121	while (atomic_read(&tn->wq_count))
    122		cond_resched();
    123}
    124
    125static void __net_exit tipc_pernet_pre_exit(struct net *net)
    126{
    127	tipc_node_pre_cleanup_net(net);
    128}
    129
    130static struct pernet_operations tipc_pernet_pre_exit_ops = {
    131	.pre_exit = tipc_pernet_pre_exit,
    132};
    133
    134static struct pernet_operations tipc_net_ops = {
    135	.init = tipc_init_net,
    136	.exit = tipc_exit_net,
    137	.id   = &tipc_net_id,
    138	.size = sizeof(struct tipc_net),
    139};
    140
    141static struct pernet_operations tipc_topsrv_net_ops = {
    142	.init = tipc_topsrv_init_net,
    143	.exit = tipc_topsrv_exit_net,
    144};
    145
    146static int __init tipc_init(void)
    147{
    148	int err;
    149
    150	pr_info("Activated (version " TIPC_MOD_VER ")\n");
    151
    152	sysctl_tipc_rmem[0] = RCVBUF_MIN;
    153	sysctl_tipc_rmem[1] = RCVBUF_DEF;
    154	sysctl_tipc_rmem[2] = RCVBUF_MAX;
    155
    156	err = tipc_register_sysctl();
    157	if (err)
    158		goto out_sysctl;
    159
    160	err = register_pernet_device(&tipc_net_ops);
    161	if (err)
    162		goto out_pernet;
    163
    164	err = tipc_socket_init();
    165	if (err)
    166		goto out_socket;
    167
    168	err = register_pernet_device(&tipc_topsrv_net_ops);
    169	if (err)
    170		goto out_pernet_topsrv;
    171
    172	err = register_pernet_subsys(&tipc_pernet_pre_exit_ops);
    173	if (err)
    174		goto out_register_pernet_subsys;
    175
    176	err = tipc_bearer_setup();
    177	if (err)
    178		goto out_bearer;
    179
    180	err = tipc_netlink_start();
    181	if (err)
    182		goto out_netlink;
    183
    184	err = tipc_netlink_compat_start();
    185	if (err)
    186		goto out_netlink_compat;
    187
    188	pr_info("Started in single node mode\n");
    189	return 0;
    190
    191out_netlink_compat:
    192	tipc_netlink_stop();
    193out_netlink:
    194	tipc_bearer_cleanup();
    195out_bearer:
    196	unregister_pernet_subsys(&tipc_pernet_pre_exit_ops);
    197out_register_pernet_subsys:
    198	unregister_pernet_device(&tipc_topsrv_net_ops);
    199out_pernet_topsrv:
    200	tipc_socket_stop();
    201out_socket:
    202	unregister_pernet_device(&tipc_net_ops);
    203out_pernet:
    204	tipc_unregister_sysctl();
    205out_sysctl:
    206	pr_err("Unable to start in single node mode\n");
    207	return err;
    208}
    209
    210static void __exit tipc_exit(void)
    211{
    212	tipc_netlink_compat_stop();
    213	tipc_netlink_stop();
    214	tipc_bearer_cleanup();
    215	unregister_pernet_subsys(&tipc_pernet_pre_exit_ops);
    216	unregister_pernet_device(&tipc_topsrv_net_ops);
    217	tipc_socket_stop();
    218	unregister_pernet_device(&tipc_net_ops);
    219	tipc_unregister_sysctl();
    220
    221	pr_info("Deactivated\n");
    222}
    223
    224module_init(tipc_init);
    225module_exit(tipc_exit);
    226
    227MODULE_DESCRIPTION("TIPC: Transparent Inter Process Communication");
    228MODULE_LICENSE("Dual BSD/GPL");
    229MODULE_VERSION(TIPC_MOD_VER);