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