2006-01-02 21:04:38 +03:00
/*
* net / tipc / node . h : Include file for TIPC node management routines
2007-02-09 17:25:21 +03:00
*
2016-09-01 20:52:49 +03:00
* Copyright ( c ) 2000 - 2006 , 2014 - 2016 , Ericsson AB
2014-03-27 08:54:36 +04:00
* Copyright ( c ) 2005 , 2010 - 2014 , Wind River Systems
2006-01-02 21:04:38 +03:00
* All rights reserved .
*
2006-01-11 15:30:43 +03:00
* Redistribution and use in source and binary forms , with or without
2006-01-02 21:04:38 +03:00
* modification , are permitted provided that the following conditions are met :
*
2006-01-11 15:30:43 +03:00
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. Neither the names of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission .
2006-01-02 21:04:38 +03:00
*
2006-01-11 15:30:43 +03:00
* Alternatively , this software may be distributed under the terms of the
* GNU General Public License ( " GPL " ) version 2 as published by the Free
* Software Foundation .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
* CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
2006-01-02 21:04:38 +03:00
* POSSIBILITY OF SUCH DAMAGE .
*/
# ifndef _TIPC_NODE_H
# define _TIPC_NODE_H
2010-12-31 21:59:19 +03:00
# include "addr.h"
# include "net.h"
2006-01-02 21:04:38 +03:00
# include "bearer.h"
2014-06-26 05:41:33 +04:00
# include "msg.h"
2006-01-02 21:04:38 +03:00
2015-10-22 15:51:40 +03:00
/* Optional capabilities supported by this code version
*/
enum {
2016-09-01 20:52:49 +03:00
TIPC_BCAST_SYNCH = ( 1 < < 1 ) ,
TIPC_BCAST_STATE_NACK = ( 1 < < 2 ) ,
2017-01-18 21:50:53 +03:00
TIPC_BLOCK_FLOWCTL = ( 1 < < 3 ) ,
tipc: introduce communication groups
As a preparation for introducing flow control for multicast and datagram
messaging we need a more strictly defined framework than we have now. A
socket must be able keep track of exactly how many and which other
sockets it is allowed to communicate with at any moment, and keep the
necessary state for those.
We therefore introduce a new concept we have named Communication Group.
Sockets can join a group via a new setsockopt() call TIPC_GROUP_JOIN.
The call takes four parameters: 'type' serves as group identifier,
'instance' serves as an logical member identifier, and 'scope' indicates
the visibility of the group (node/cluster/zone). Finally, 'flags' makes
it possible to set certain properties for the member. For now, there is
only one flag, indicating if the creator of the socket wants to receive
a copy of broadcast or multicast messages it is sending via the socket,
and if wants to be eligible as destination for its own anycasts.
A group is closed, i.e., sockets which have not joined a group will
not be able to send messages to or receive messages from members of
the group, and vice versa.
Any member of a group can send multicast ('group broadcast') messages
to all group members, optionally including itself, using the primitive
send(). The messages are received via the recvmsg() primitive. A socket
can only be member of one group at a time.
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2017-10-13 12:04:23 +03:00
TIPC_BCAST_RCAST = ( 1 < < 4 ) ,
2018-03-22 22:42:50 +03:00
TIPC_NODE_ID128 = ( 1 < < 5 )
2015-10-22 15:51:40 +03:00
} ;
2016-09-01 20:52:49 +03:00
# define TIPC_NODE_CAPABILITIES (TIPC_BCAST_SYNCH | \
TIPC_BCAST_STATE_NACK | \
2017-01-18 21:50:53 +03:00
TIPC_BCAST_RCAST | \
tipc: remove restrictions on node address values
Nominally, TIPC organizes network nodes into a three-level network
hierarchy consisting of the levels 'zone', 'cluster' and 'node'. This
hierarchy is reflected in the node address format, - it is sub-divided
into an 8-bit zone id, and 12 bit cluster id, and a 12-bit node id.
However, the 'zone' and 'cluster' levels have in reality never been
fully implemented,and never will be. The result of this has been
that the first 20 bits the node identity structure have been wasted,
and the usable node identity range within a cluster has been limited
to 12 bits. This is starting to become a problem.
In the following commits, we will need to be able to connect between
nodes which are using the whole 32-bit value space of the node address.
We therefore remove the restrictions on which values can be assigned
to node identity, -it is from now on only a 32-bit integer with no
assumed internal structure.
Isolation between clusters is now achieved only by setting different
values for the 'network id' field used during neighbor discovery, in
practice leading to the latter becoming the new cluster identity.
The rules for accepting discovery requests/responses from neighboring
nodes now become:
- If the user is using legacy address format on both peers, reception
of discovery messages is subject to the legacy lookup domain check
in addition to the cluster id check.
- Otherwise, the discovery request/response is always accepted, provided
both peers have the same network id.
This secures backwards compatibility for users who have been using zone
or cluster identities as cluster separators, instead of the intended
'network id'.
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2018-03-22 22:42:47 +03:00
TIPC_BLOCK_FLOWCTL | \
2018-03-22 22:42:50 +03:00
TIPC_NODE_ID128 )
2015-11-19 22:30:46 +03:00
# define INVALID_BEARER_ID -1
2015-10-22 15:51:40 +03:00
2015-01-09 10:27:05 +03:00
void tipc_node_stop ( struct net * net ) ;
2018-04-25 20:29:36 +03:00
bool tipc_node_get_id ( struct net * net , u32 addr , u8 * id ) ;
tipc: handle collisions of 32-bit node address hash values
When a 32-bit node address is generated from a 128-bit identifier,
there is a risk of collisions which must be discovered and handled.
We do this as follows:
- We don't apply the generated address immediately to the node, but do
instead initiate a 1 sec trial period to allow other cluster members
to discover and handle such collisions.
- During the trial period the node periodically sends out a new type
of message, DSC_TRIAL_MSG, using broadcast or emulated broadcast,
to all the other nodes in the cluster.
- When a node is receiving such a message, it must check that the
presented 32-bit identifier either is unused, or was used by the very
same peer in a previous session. In both cases it accepts the request
by not responding to it.
- If it finds that the same node has been up before using a different
address, it responds with a DSC_TRIAL_FAIL_MSG containing that
address.
- If it finds that the address has already been taken by some other
node, it generates a new, unused address and returns it to the
requester.
- During the trial period the requesting node must always be prepared
to accept a failure message, i.e., a message where a peer suggests a
different (or equal) address to the one tried. In those cases it
must apply the suggested value as trial address and restart the trial
period.
This algorithm ensures that in the vast majority of cases a node will
have the same address before and after a reboot. If a legacy user
configures the address explicitly, there will be no trial period and
messages, so this protocol addition is completely backwards compatible.
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2018-03-22 22:42:51 +03:00
u32 tipc_node_try_addr ( struct net * net , u8 * id , u32 addr ) ;
void tipc_node_check_dest ( struct net * net , u32 onode , u8 * peer_id128 ,
2015-07-31 01:24:22 +03:00
struct tipc_bearer * bearer ,
u16 capabilities , u32 signature ,
struct tipc_media_addr * maddr ,
bool * respond , bool * dupl_addr ) ;
2015-07-31 01:24:16 +03:00
void tipc_node_delete_links ( struct net * net , int bearer_id ) ;
2018-04-19 12:06:20 +03:00
void tipc_node_apply_property ( struct net * net , struct tipc_bearer * b , int prop ) ;
2015-01-09 10:27:05 +03:00
int tipc_node_get_linkname ( struct net * net , u32 bearer_id , u32 node ,
char * linkname , size_t len ) ;
2015-07-16 23:54:24 +03:00
int tipc_node_xmit ( struct net * net , struct sk_buff_head * list , u32 dnode ,
int selector ) ;
2017-10-13 12:04:21 +03:00
int tipc_node_distr_xmit ( struct net * net , struct sk_buff_head * list ) ;
2015-07-16 23:54:24 +03:00
int tipc_node_xmit_skb ( struct net * net , struct sk_buff * skb , u32 dest ,
u32 selector ) ;
2015-11-19 22:30:42 +03:00
void tipc_node_subscribe ( struct net * net , struct list_head * subscr , u32 addr ) ;
void tipc_node_unsubscribe ( struct net * net , struct list_head * subscr , u32 addr ) ;
void tipc_node_broadcast ( struct net * net , struct sk_buff * skb ) ;
2015-01-09 10:27:05 +03:00
int tipc_node_add_conn ( struct net * net , u32 dnode , u32 port , u32 peer_port ) ;
void tipc_node_remove_conn ( struct net * net , u32 dnode , u32 port ) ;
2015-11-19 22:30:45 +03:00
int tipc_node_get_mtu ( struct net * net , u32 addr , u32 sel ) ;
2017-10-13 12:04:19 +03:00
bool tipc_node_is_up ( struct net * net , u32 addr ) ;
2016-05-02 18:58:46 +03:00
u16 tipc_node_get_capabilities ( struct net * net , u32 addr ) ;
2014-11-20 12:29:17 +03:00
int tipc_nl_node_dump ( struct sk_buff * skb , struct netlink_callback * cb ) ;
2015-11-19 22:30:46 +03:00
int tipc_nl_node_dump_link ( struct sk_buff * skb , struct netlink_callback * cb ) ;
2015-11-19 22:30:45 +03:00
int tipc_nl_node_reset_link_stats ( struct sk_buff * skb , struct genl_info * info ) ;
int tipc_nl_node_get_link ( struct sk_buff * skb , struct genl_info * info ) ;
int tipc_nl_node_set_link ( struct sk_buff * skb , struct genl_info * info ) ;
2016-08-18 11:33:52 +03:00
int tipc_nl_peer_rm ( struct sk_buff * skb , struct genl_info * info ) ;
2014-06-26 05:41:33 +04:00
2016-07-26 09:47:19 +03:00
int tipc_nl_node_set_monitor ( struct sk_buff * skb , struct genl_info * info ) ;
2016-07-26 09:47:20 +03:00
int tipc_nl_node_get_monitor ( struct sk_buff * skb , struct genl_info * info ) ;
2016-07-26 09:47:22 +03:00
int tipc_nl_node_dump_monitor ( struct sk_buff * skb , struct netlink_callback * cb ) ;
int tipc_nl_node_dump_monitor_peer ( struct sk_buff * skb ,
struct netlink_callback * cb ) ;
2006-01-02 21:04:38 +03:00
# endif