162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * net/tipc/core.h: Include file for TIPC global declarations
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (c) 2005-2006, 2013-2018 Ericsson AB
562306a36Sopenharmony_ci * Copyright (c) 2005-2007, 2010-2013, Wind River Systems
662306a36Sopenharmony_ci * Copyright (c) 2020, Red Hat Inc
762306a36Sopenharmony_ci * All rights reserved.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without
1062306a36Sopenharmony_ci * modification, are permitted provided that the following conditions are met:
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright
1362306a36Sopenharmony_ci *    notice, this list of conditions and the following disclaimer.
1462306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright
1562306a36Sopenharmony_ci *    notice, this list of conditions and the following disclaimer in the
1662306a36Sopenharmony_ci *    documentation and/or other materials provided with the distribution.
1762306a36Sopenharmony_ci * 3. Neither the names of the copyright holders nor the names of its
1862306a36Sopenharmony_ci *    contributors may be used to endorse or promote products derived from
1962306a36Sopenharmony_ci *    this software without specific prior written permission.
2062306a36Sopenharmony_ci *
2162306a36Sopenharmony_ci * Alternatively, this software may be distributed under the terms of the
2262306a36Sopenharmony_ci * GNU General Public License ("GPL") version 2 as published by the Free
2362306a36Sopenharmony_ci * Software Foundation.
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2662306a36Sopenharmony_ci * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2762306a36Sopenharmony_ci * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2862306a36Sopenharmony_ci * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2962306a36Sopenharmony_ci * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
3062306a36Sopenharmony_ci * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
3162306a36Sopenharmony_ci * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
3262306a36Sopenharmony_ci * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3362306a36Sopenharmony_ci * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3462306a36Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3562306a36Sopenharmony_ci * POSSIBILITY OF SUCH DAMAGE.
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#ifndef _TIPC_CORE_H
3962306a36Sopenharmony_ci#define _TIPC_CORE_H
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#include <linux/tipc.h>
4262306a36Sopenharmony_ci#include <linux/tipc_config.h>
4362306a36Sopenharmony_ci#include <linux/tipc_netlink.h>
4462306a36Sopenharmony_ci#include <linux/types.h>
4562306a36Sopenharmony_ci#include <linux/kernel.h>
4662306a36Sopenharmony_ci#include <linux/errno.h>
4762306a36Sopenharmony_ci#include <linux/mm.h>
4862306a36Sopenharmony_ci#include <linux/timer.h>
4962306a36Sopenharmony_ci#include <linux/string.h>
5062306a36Sopenharmony_ci#include <linux/uaccess.h>
5162306a36Sopenharmony_ci#include <linux/interrupt.h>
5262306a36Sopenharmony_ci#include <linux/atomic.h>
5362306a36Sopenharmony_ci#include <linux/netdevice.h>
5462306a36Sopenharmony_ci#include <linux/in.h>
5562306a36Sopenharmony_ci#include <linux/list.h>
5662306a36Sopenharmony_ci#include <linux/slab.h>
5762306a36Sopenharmony_ci#include <linux/vmalloc.h>
5862306a36Sopenharmony_ci#include <linux/rtnetlink.h>
5962306a36Sopenharmony_ci#include <linux/etherdevice.h>
6062306a36Sopenharmony_ci#include <net/netns/generic.h>
6162306a36Sopenharmony_ci#include <linux/rhashtable.h>
6262306a36Sopenharmony_ci#include <net/genetlink.h>
6362306a36Sopenharmony_ci#include <net/netns/hash.h>
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#ifdef pr_fmt
6662306a36Sopenharmony_ci#undef pr_fmt
6762306a36Sopenharmony_ci#endif
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistruct tipc_node;
7262306a36Sopenharmony_cistruct tipc_bearer;
7362306a36Sopenharmony_cistruct tipc_bc_base;
7462306a36Sopenharmony_cistruct tipc_link;
7562306a36Sopenharmony_cistruct tipc_name_table;
7662306a36Sopenharmony_cistruct tipc_topsrv;
7762306a36Sopenharmony_cistruct tipc_monitor;
7862306a36Sopenharmony_ci#ifdef CONFIG_TIPC_CRYPTO
7962306a36Sopenharmony_cistruct tipc_crypto;
8062306a36Sopenharmony_ci#endif
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#define TIPC_MOD_VER "2.0.0"
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#define NODE_HTABLE_SIZE       512
8562306a36Sopenharmony_ci#define MAX_BEARERS	         3
8662306a36Sopenharmony_ci#define TIPC_DEF_MON_THRESHOLD  32
8762306a36Sopenharmony_ci#define NODE_ID_LEN             16
8862306a36Sopenharmony_ci#define NODE_ID_STR_LEN        (NODE_ID_LEN * 2 + 1)
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciextern unsigned int tipc_net_id __read_mostly;
9162306a36Sopenharmony_ciextern int sysctl_tipc_rmem[3] __read_mostly;
9262306a36Sopenharmony_ciextern int sysctl_tipc_named_timeout __read_mostly;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistruct tipc_net {
9562306a36Sopenharmony_ci	u8  node_id[NODE_ID_LEN];
9662306a36Sopenharmony_ci	u32 node_addr;
9762306a36Sopenharmony_ci	u32 trial_addr;
9862306a36Sopenharmony_ci	unsigned long addr_trial_end;
9962306a36Sopenharmony_ci	char node_id_string[NODE_ID_STR_LEN];
10062306a36Sopenharmony_ci	int net_id;
10162306a36Sopenharmony_ci	int random;
10262306a36Sopenharmony_ci	bool legacy_addr_format;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	/* Node table and node list */
10562306a36Sopenharmony_ci	spinlock_t node_list_lock;
10662306a36Sopenharmony_ci	struct hlist_head node_htable[NODE_HTABLE_SIZE];
10762306a36Sopenharmony_ci	struct list_head node_list;
10862306a36Sopenharmony_ci	u32 num_nodes;
10962306a36Sopenharmony_ci	u32 num_links;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	/* Neighbor monitoring list */
11262306a36Sopenharmony_ci	struct tipc_monitor *monitors[MAX_BEARERS];
11362306a36Sopenharmony_ci	int mon_threshold;
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	/* Bearer list */
11662306a36Sopenharmony_ci	struct tipc_bearer __rcu *bearer_list[MAX_BEARERS + 1];
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	/* Broadcast link */
11962306a36Sopenharmony_ci	spinlock_t bclock;
12062306a36Sopenharmony_ci	struct tipc_bc_base *bcbase;
12162306a36Sopenharmony_ci	struct tipc_link *bcl;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	/* Socket hash table */
12462306a36Sopenharmony_ci	struct rhashtable sk_rht;
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	/* Name table */
12762306a36Sopenharmony_ci	spinlock_t nametbl_lock;
12862306a36Sopenharmony_ci	struct name_table *nametbl;
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	/* Topology subscription server */
13162306a36Sopenharmony_ci	struct tipc_topsrv *topsrv;
13262306a36Sopenharmony_ci	atomic_t subscription_count;
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	/* Cluster capabilities */
13562306a36Sopenharmony_ci	u16 capabilities;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	/* Tracing of node internal messages */
13862306a36Sopenharmony_ci	struct packet_type loopback_pt;
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci#ifdef CONFIG_TIPC_CRYPTO
14162306a36Sopenharmony_ci	/* TX crypto handler */
14262306a36Sopenharmony_ci	struct tipc_crypto *crypto_tx;
14362306a36Sopenharmony_ci#endif
14462306a36Sopenharmony_ci	/* Work item for net finalize */
14562306a36Sopenharmony_ci	struct work_struct work;
14662306a36Sopenharmony_ci	/* The numbers of work queues in schedule */
14762306a36Sopenharmony_ci	atomic_t wq_count;
14862306a36Sopenharmony_ci};
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_cistatic inline struct tipc_net *tipc_net(struct net *net)
15162306a36Sopenharmony_ci{
15262306a36Sopenharmony_ci	return net_generic(net, tipc_net_id);
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cistatic inline int tipc_netid(struct net *net)
15662306a36Sopenharmony_ci{
15762306a36Sopenharmony_ci	return tipc_net(net)->net_id;
15862306a36Sopenharmony_ci}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cistatic inline struct list_head *tipc_nodes(struct net *net)
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci	return &tipc_net(net)->node_list;
16362306a36Sopenharmony_ci}
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistatic inline struct name_table *tipc_name_table(struct net *net)
16662306a36Sopenharmony_ci{
16762306a36Sopenharmony_ci	return tipc_net(net)->nametbl;
16862306a36Sopenharmony_ci}
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_cistatic inline struct tipc_topsrv *tipc_topsrv(struct net *net)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	return tipc_net(net)->topsrv;
17362306a36Sopenharmony_ci}
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_cistatic inline unsigned int tipc_hashfn(u32 addr)
17662306a36Sopenharmony_ci{
17762306a36Sopenharmony_ci	return addr & (NODE_HTABLE_SIZE - 1);
17862306a36Sopenharmony_ci}
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic inline u16 mod(u16 x)
18162306a36Sopenharmony_ci{
18262306a36Sopenharmony_ci	return x & 0xffffu;
18362306a36Sopenharmony_ci}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cistatic inline int less_eq(u16 left, u16 right)
18662306a36Sopenharmony_ci{
18762306a36Sopenharmony_ci	return mod(right - left) < 32768u;
18862306a36Sopenharmony_ci}
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistatic inline int more(u16 left, u16 right)
19162306a36Sopenharmony_ci{
19262306a36Sopenharmony_ci	return !less_eq(left, right);
19362306a36Sopenharmony_ci}
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_cistatic inline int less(u16 left, u16 right)
19662306a36Sopenharmony_ci{
19762306a36Sopenharmony_ci	return less_eq(left, right) && (mod(right) != mod(left));
19862306a36Sopenharmony_ci}
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_cistatic inline int tipc_in_range(u16 val, u16 min, u16 max)
20162306a36Sopenharmony_ci{
20262306a36Sopenharmony_ci	return !less(val, min) && !more(val, max);
20362306a36Sopenharmony_ci}
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cistatic inline u32 tipc_net_hash_mixes(struct net *net, int tn_rand)
20662306a36Sopenharmony_ci{
20762306a36Sopenharmony_ci	return net_hash_mix(&init_net) ^ net_hash_mix(net) ^ tn_rand;
20862306a36Sopenharmony_ci}
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cistatic inline u32 hash128to32(char *bytes)
21162306a36Sopenharmony_ci{
21262306a36Sopenharmony_ci	__be32 *tmp = (__be32 *)bytes;
21362306a36Sopenharmony_ci	u32 res;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	res = ntohl(tmp[0] ^ tmp[1] ^ tmp[2] ^ tmp[3]);
21662306a36Sopenharmony_ci	if (likely(res))
21762306a36Sopenharmony_ci		return res;
21862306a36Sopenharmony_ci	return  ntohl(tmp[0] | tmp[1] | tmp[2] | tmp[3]);
21962306a36Sopenharmony_ci}
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci#ifdef CONFIG_SYSCTL
22262306a36Sopenharmony_ciint tipc_register_sysctl(void);
22362306a36Sopenharmony_civoid tipc_unregister_sysctl(void);
22462306a36Sopenharmony_ci#else
22562306a36Sopenharmony_ci#define tipc_register_sysctl() 0
22662306a36Sopenharmony_ci#define tipc_unregister_sysctl()
22762306a36Sopenharmony_ci#endif
22862306a36Sopenharmony_ci#endif
229