2006-01-02 21:04:38 +03:00
/*
* net / tipc / bcast . h : Include file for TIPC broadcast code
2007-02-09 17:25:21 +03:00
*
2014-07-17 04:41:00 +04:00
* Copyright ( c ) 2003 - 2006 , 2014 , Ericsson AB
2011-01-18 21:53:16 +03:00
* Copyright ( c ) 2005 , 2010 - 2011 , 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_BCAST_H
# define _TIPC_BCAST_H
# define MAX_NODES 4096
# define WSIZE 32
2014-05-05 04:56:17 +04:00
# define TIPC_BCLINK_RESET 1
2006-01-02 21:04:38 +03:00
/**
2008-09-03 10:38:32 +04:00
* struct tipc_node_map - set of node identifiers
2006-01-02 21:04:38 +03:00
* @ count : # of nodes in set
* @ map : bitmap of node identifiers that are in the set
*/
2008-09-03 10:38:32 +04:00
struct tipc_node_map {
2006-01-02 21:04:38 +03:00
u32 count ;
u32 map [ MAX_NODES / WSIZE ] ;
} ;
# define PLSIZE 32
/**
2011-12-30 05:33:30 +04:00
* struct tipc_port_list - set of node local destination ports
2006-01-02 21:04:38 +03:00
* @ count : # of ports in set ( only valid for first entry in list )
* @ next : pointer to next entry in list
* @ ports : array of port references
*/
2011-12-30 05:33:30 +04:00
struct tipc_port_list {
2006-01-02 21:04:38 +03:00
int count ;
2011-12-30 05:33:30 +04:00
struct tipc_port_list * next ;
2006-01-02 21:04:38 +03:00
u32 ports [ PLSIZE ] ;
} ;
2008-09-03 10:38:32 +04:00
struct tipc_node ;
2006-01-02 21:04:38 +03:00
2009-03-19 05:11:29 +03:00
extern const char tipc_bclink_name [ ] ;
2006-01-02 21:04:38 +03:00
/**
2010-05-11 18:30:12 +04:00
* tipc_nmap_equal - test for equality of node maps
2006-01-02 21:04:38 +03:00
*/
2013-06-17 18:54:47 +04:00
static inline int tipc_nmap_equal ( struct tipc_node_map * nm_a ,
struct tipc_node_map * nm_b )
2006-01-02 21:04:38 +03:00
{
return ! memcmp ( nm_a , nm_b , sizeof ( * nm_a ) ) ;
}
2011-12-30 05:33:30 +04:00
void tipc_port_list_add ( struct tipc_port_list * pl_ptr , u32 port ) ;
void tipc_port_list_free ( struct tipc_port_list * pl_ptr ) ;
2006-01-02 21:04:38 +03:00
2014-05-05 04:56:16 +04:00
int tipc_bclink_init ( void ) ;
2006-01-18 02:38:21 +03:00
void tipc_bclink_stop ( void ) ;
2014-05-05 04:56:17 +04:00
void tipc_bclink_set_flags ( unsigned int flags ) ;
2011-10-24 19:18:12 +04:00
void tipc_bclink_add_node ( u32 addr ) ;
void tipc_bclink_remove_node ( u32 addr ) ;
2011-01-18 21:53:16 +03:00
struct tipc_node * tipc_bclink_retransmit_to ( void ) ;
2008-09-03 10:38:32 +04:00
void tipc_bclink_acknowledge ( struct tipc_node * n_ptr , u32 acked ) ;
2014-02-18 12:06:46 +04:00
void tipc_bclink_rcv ( struct sk_buff * buf ) ;
2006-01-18 02:38:21 +03:00
u32 tipc_bclink_get_last_sent ( void ) ;
2008-09-03 10:38:32 +04:00
u32 tipc_bclink_acks_missing ( struct tipc_node * n_ptr ) ;
tipc: Major redesign of broadcast link ACK/NACK algorithms
Completely redesigns broadcast link ACK and NACK mechanisms to prevent
spurious retransmit requests in dual LAN networks, and to prevent the
broadcast link from stalling due to the failure of a receiving node to
acknowledge receiving a broadcast message or request its retransmission.
Note: These changes only impact the timing of when ACK and NACK messages
are sent, and not the basic broadcast link protocol itself, so inter-
operability with nodes using the "classic" algorithms is maintained.
The revised algorithms are as follows:
1) An explicit ACK message is still sent after receiving 16 in-sequence
messages, and implicit ACK information continues to be carried in other
unicast link message headers (including link state messages). However,
the timing of explicit ACKs is now based on the receiving node's absolute
network address rather than its relative network address to ensure that
the failure of another node does not delay the ACK beyond its 16 message
target.
2) A NACK message is now typically sent only when a message gap persists
for two consecutive incoming link state messages; this ensures that a
suspected gap is not confirmed until both LANs in a dual LAN network have
had an opportunity to deliver the message, thereby preventing spurious NACKs.
A NACK message can also be generated by the arrival of a single link state
message, if the deferred queue is so big that the current message gap
cannot be the result of "normal" mis-ordering due to the use of dual LANs
(or one LAN using a bonded interface). Since link state messages typically
arrive at different nodes at different times the problem of multiple nodes
issuing identical NACKs simultaneously is inherently avoided.
3) Nodes continue to "peek" at NACK messages sent by other nodes. If
another node requests retransmission of a message gap suspected (but not
yet confirmed) by the peeking node, the peeking node forgets about the
gap and does not generate a duplicate retransmit request. (If the peeking
node subsequently fails to receive the lost message, later link state
messages will cause it to rediscover and confirm the gap and send another
NACK.)
4) Message gap "equality" is now determined by the start of the gap only.
This is sufficient to deal with the most common cases of message loss,
and eliminates the need for complex end of gap computations.
5) A peeking node no longer tries to determine whether it should send a
complementary NACK, since the most common cases of message loss don't
require it to be sent. Consequently, the node no longer examines the
"broadcast tag" field of a NACK message when peeking.
Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
2011-10-27 22:17:53 +04:00
void tipc_bclink_update_link_state ( struct tipc_node * n_ptr , u32 last_sent ) ;
2006-01-18 02:38:21 +03:00
int tipc_bclink_stats ( char * stats_buf , const u32 buf_size ) ;
int tipc_bclink_reset_stats ( void ) ;
int tipc_bclink_set_queue_limits ( u32 limit ) ;
2014-04-21 06:55:51 +04:00
void tipc_bcbearer_sort ( struct tipc_node_map * nm_ptr , u32 node , bool action ) ;
2014-07-17 04:41:00 +04:00
uint tipc_bclink_get_mtu ( void ) ;
2014-07-17 04:41:03 +04:00
int tipc_bclink_xmit ( struct sk_buff * buf ) ;
tipc: fix bug in multicast congestion handling
One aim of commit 50100a5e39461b2a61d6040e73c384766c29975d ("tipc:
use pseudo message to wake up sockets after link congestion") was
to handle link congestion abatement in a uniform way for both unicast
and multicast transmit. However, the latter doesn't work correctly,
and has been broken since the referenced commit was applied.
If a user now sends a burst of multicast messages that is big
enough to cause broadcast link congestion, it will be put to sleep,
and not be waked up when the congestion abates as it should be.
This has two reasons. First, the flag that is used, TIPC_WAKEUP_USERS,
is set correctly, but in the wrong field. Instead of setting it in the
'action_flags' field of the arrival node struct, it is by mistake set
in the dummy node struct that is owned by the broadcast link, where it
will never tested for. Second, we cannot use the same flag for waking
up unicast and multicast users, since the function tipc_node_unlock()
needs to pick the wakeup pseudo messages to deliver from different
queues. It must hence be able to distinguish between the two cases.
This commit solves this problem by adding a new flag
TIPC_WAKEUP_BCAST_USERS, and a new function tipc_bclink_wakeup_user().
The latter is to be called by tipc_node_unlock() when the named flag,
now set in the correct field, is encountered.
v2: using explicit 'unsigned int' declaration instead of 'uint', as
per comment from David Miller.
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2014-10-07 22:12:34 +04:00
void tipc_bclink_wakeup_users ( void ) ;
2006-01-02 21:04:38 +03:00
# endif