^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * net/tipc/name_table.h: Include file for TIPC name table code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2000-2006, 2014-2018, Ericsson AB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2004-2005, 2010-2011, Wind River Systems
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * modification, are permitted provided that the following conditions are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * 1. Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * notice, this list of conditions and the following disclaimer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * 2. Redistributions in binary form must reproduce the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * notice, this list of conditions and the following disclaimer in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * documentation and/or other materials provided with the distribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * 3. Neither the names of the copyright holders nor the names of its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * contributors may be used to endorse or promote products derived from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * Alternatively, this software may be distributed under the terms of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * GNU General Public License ("GPL") version 2 as published by the Free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * POSSIBILITY OF SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #ifndef _TIPC_NAME_TABLE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define _TIPC_NAME_TABLE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct tipc_subscription;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) struct tipc_plist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct tipc_nlist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct tipc_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * TIPC name types reserved for internal TIPC use (both current and planned)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define TIPC_ZM_SRV 3 /* zone master service name type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define TIPC_PUBL_SCOPE_NUM (TIPC_NODE_SCOPE + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define TIPC_NAMETBL_SIZE 1024 /* must be a power of 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * struct publication - info about a published (name or) name sequence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * @type: name sequence type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * @lower: name sequence lower bound
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * @upper: name sequence upper bound
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * @scope: scope of publication, TIPC_NODE_SCOPE or TIPC_CLUSTER_SCOPE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * @node: network address of publishing socket's node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * @port: publishing port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * @key: publication key, unique across the cluster
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * @id: publication id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * @binding_node: all publications from the same node which bound this one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * - Remote publications: in node->publ_list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * Used by node/name distr to withdraw publications when node is lost
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * - Local/node scope publications: in name_table->node_scope list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * - Local/cluster scope publications: in name_table->cluster_scope list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * @binding_sock: all publications from the same socket which bound this one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * Used by socket to withdraw publications when socket is unbound/released
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * @local_publ: list of identical publications made from this node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * Used by closest_first and multicast receive lookup algorithms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * @all_publ: all publications identical to this one, whatever node and scope
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * Used by round-robin lookup algorithm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * @list: to form a list of publications in temporal order
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * @rcu: RCU callback head used for deferred freeing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct publication {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) u32 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u32 lower;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u32 upper;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) u32 scope;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u32 node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u32 port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u32 key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) u32 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct list_head binding_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct list_head binding_sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) struct list_head local_publ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct list_head all_publ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * struct name_table - table containing all existing port name publications
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * @seq_hlist: name sequence hash lists
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * @node_scope: all local publications with node scope
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * - used by name_distr during re-init of name table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * @cluster_scope: all local publications with cluster scope
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * - used by name_distr to send bulk updates to new nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * - used by name_distr during re-init of name table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * @local_publ_count: number of publications issued by this node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct name_table {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct hlist_head services[TIPC_NAMETBL_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct list_head node_scope;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct list_head cluster_scope;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) rwlock_t cluster_scope_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) u32 local_publ_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) u32 rc_dests;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) u32 snd_nxt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) int tipc_nl_name_table_dump(struct sk_buff *skb, struct netlink_callback *cb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u32 tipc_nametbl_translate(struct net *net, u32 type, u32 instance, u32 *node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) void tipc_nametbl_mc_lookup(struct net *net, u32 type, u32 lower, u32 upper,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u32 scope, bool exact, struct list_head *dports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) void tipc_nametbl_build_group(struct net *net, struct tipc_group *grp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) u32 type, u32 domain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) void tipc_nametbl_lookup_dst_nodes(struct net *net, u32 type, u32 lower,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) u32 upper, struct tipc_nlist *nodes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) bool tipc_nametbl_lookup(struct net *net, u32 type, u32 instance, u32 domain,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) struct list_head *dsts, int *dstcnt, u32 exclude,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) bool all);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct publication *tipc_nametbl_publish(struct net *net, u32 type, u32 lower,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u32 upper, u32 scope, u32 port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) u32 key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower, u32 upper,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) u32 key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) struct publication *tipc_nametbl_insert_publ(struct net *net, u32 type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u32 lower, u32 upper, u32 scope,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) u32 node, u32 ref, u32 key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) struct publication *tipc_nametbl_remove_publ(struct net *net, u32 type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) u32 lower, u32 upper,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) u32 node, u32 key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) bool tipc_nametbl_subscribe(struct tipc_subscription *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) void tipc_nametbl_unsubscribe(struct tipc_subscription *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) int tipc_nametbl_init(struct net *net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) void tipc_nametbl_stop(struct net *net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) struct tipc_dest {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) u32 port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) u32 node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct tipc_dest *tipc_dest_find(struct list_head *l, u32 node, u32 port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) bool tipc_dest_push(struct list_head *l, u32 node, u32 port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) bool tipc_dest_pop(struct list_head *l, u32 *node, u32 *port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) bool tipc_dest_del(struct list_head *l, u32 node, u32 port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) void tipc_dest_list_purge(struct list_head *l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) int tipc_dest_list_len(struct list_head *l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #endif