@@ -89,17 +89,9 @@ static const struct nla_policy tipc_nl_prop_policy[TIPC_NLA_PROP_MAX + 1] = {
8989#define TIMEOUT_EVT 560817u /* link timer expired */
9090
9191/*
92- * The following two 'message types' is really just implementation
93- * data conveniently stored in the message header.
94- * They must not be considered part of the protocol
92+ * State value stored in 'failover_pkts'
9593 */
96- #define OPEN_MSG 0
97- #define CLOSED_MSG 1
98-
99- /*
100- * State value stored in 'exp_msg_count'
101- */
102- #define START_CHANGEOVER 100000u
94+ #define FIRST_FAILOVER 0xffffu
10395
10496static void link_handle_out_of_seq_msg (struct tipc_link * link ,
10597 struct sk_buff * skb );
@@ -113,8 +105,7 @@ static void tipc_link_sync_xmit(struct tipc_link *l);
113105static void tipc_link_sync_rcv (struct tipc_node * n , struct sk_buff * buf );
114106static void tipc_link_input (struct tipc_link * l , struct sk_buff * skb );
115107static bool tipc_data_input (struct tipc_link * l , struct sk_buff * skb );
116- static bool tipc_link_failover_rcv (struct tipc_node * node ,
117- struct sk_buff * * skb );
108+ static bool tipc_link_failover_rcv (struct tipc_link * l , struct sk_buff * * skb );
118109/*
119110 * Simple link routines
120111 */
@@ -332,15 +323,19 @@ struct tipc_link *tipc_link_create(struct tipc_node *n_ptr,
332323}
333324
334325/**
335- * link_delete - Conditional deletion of link.
336- * If timer still running, real delete is done when it expires
337- * @link: link to be deleted
326+ * tipc_link_delete - Delete a link
327+ * @l: link to be deleted
338328 */
339- void tipc_link_delete (struct tipc_link * link )
329+ void tipc_link_delete (struct tipc_link * l )
340330{
341- tipc_link_reset_fragments (link );
342- tipc_node_detach_link (link -> owner , link );
343- tipc_link_put (link );
331+ tipc_link_reset (l );
332+ if (del_timer (& l -> timer ))
333+ tipc_link_put (l );
334+ l -> flags |= LINK_STOPPED ;
335+ /* Delete link now, or when timer is finished: */
336+ tipc_link_reset_fragments (l );
337+ tipc_node_detach_link (l -> owner , l );
338+ tipc_link_put (l );
344339}
345340
346341void tipc_link_delete_list (struct net * net , unsigned int bearer_id ,
@@ -349,23 +344,12 @@ void tipc_link_delete_list(struct net *net, unsigned int bearer_id,
349344 struct tipc_net * tn = net_generic (net , tipc_net_id );
350345 struct tipc_link * link ;
351346 struct tipc_node * node ;
352- bool del_link ;
353347
354348 rcu_read_lock ();
355349 list_for_each_entry_rcu (node , & tn -> node_list , list ) {
356350 tipc_node_lock (node );
357351 link = node -> links [bearer_id ];
358- if (!link ) {
359- tipc_node_unlock (node );
360- continue ;
361- }
362- del_link = !tipc_link_is_up (link ) && !link -> exp_msg_count ;
363- tipc_link_reset (link );
364- if (del_timer (& link -> timer ))
365- tipc_link_put (link );
366- link -> flags |= LINK_STOPPED ;
367- /* Delete link now, or when failover is finished: */
368- if (shutting_down || !tipc_node_is_up (node ) || del_link )
352+ if (link )
369353 tipc_link_delete (link );
370354 tipc_node_unlock (node );
371355 }
@@ -472,9 +456,9 @@ void tipc_link_purge_queues(struct tipc_link *l_ptr)
472456void tipc_link_reset (struct tipc_link * l_ptr )
473457{
474458 u32 prev_state = l_ptr -> state ;
475- u32 checkpoint = l_ptr -> next_in_no ;
476459 int was_active_link = tipc_link_is_active (l_ptr );
477460 struct tipc_node * owner = l_ptr -> owner ;
461+ struct tipc_link * pl = tipc_parallel_link (l_ptr );
478462
479463 msg_set_session (l_ptr -> pmsg , ((msg_session (l_ptr -> pmsg ) + 1 ) & 0xffff ));
480464
@@ -492,11 +476,15 @@ void tipc_link_reset(struct tipc_link *l_ptr)
492476 tipc_node_link_down (l_ptr -> owner , l_ptr );
493477 tipc_bearer_remove_dest (owner -> net , l_ptr -> bearer_id , l_ptr -> addr );
494478
495- if (was_active_link && tipc_node_active_links (l_ptr -> owner )) {
496- l_ptr -> reset_checkpoint = checkpoint ;
497- l_ptr -> exp_msg_count = START_CHANGEOVER ;
479+ if (was_active_link && tipc_node_is_up (l_ptr -> owner ) && (pl != l_ptr )) {
480+ l_ptr -> flags |= LINK_FAILINGOVER ;
481+ l_ptr -> failover_checkpt = l_ptr -> next_in_no ;
482+ pl -> failover_pkts = FIRST_FAILOVER ;
483+ pl -> failover_checkpt = l_ptr -> next_in_no ;
484+ pl -> failover_skb = l_ptr -> reasm_buf ;
485+ } else {
486+ kfree_skb (l_ptr -> reasm_buf );
498487 }
499-
500488 /* Clean up all queues, except inputq: */
501489 __skb_queue_purge (& l_ptr -> transmq );
502490 __skb_queue_purge (& l_ptr -> deferdq );
@@ -506,6 +494,7 @@ void tipc_link_reset(struct tipc_link *l_ptr)
506494 if (!skb_queue_empty (owner -> inputq ))
507495 owner -> action_flags |= TIPC_MSG_EVT ;
508496 tipc_link_purge_backlog (l_ptr );
497+ l_ptr -> reasm_buf = NULL ;
509498 l_ptr -> rcv_unacked = 0 ;
510499 l_ptr -> checkpoint = 1 ;
511500 l_ptr -> next_out_no = 1 ;
@@ -557,8 +546,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
557546 if (!(l_ptr -> flags & LINK_STARTED ) && (event != STARTING_EVT ))
558547 return ; /* Not yet. */
559548
560- /* Check whether changeover is going on */
561- if (l_ptr -> exp_msg_count ) {
549+ if (l_ptr -> flags & LINK_FAILINGOVER ) {
562550 if (event == TIMEOUT_EVT )
563551 link_set_timer (l_ptr , cont_intv );
564552 return ;
@@ -1242,7 +1230,7 @@ static bool tipc_data_input(struct tipc_link *link, struct sk_buff *skb)
12421230 node -> action_flags |= TIPC_NAMED_MSG_EVT ;
12431231 return true;
12441232 case MSG_BUNDLER :
1245- case CHANGEOVER_PROTOCOL :
1233+ case TUNNEL_PROTOCOL :
12461234 case MSG_FRAGMENTER :
12471235 case BCAST_PROTOCOL :
12481236 return false;
@@ -1269,14 +1257,14 @@ static void tipc_link_input(struct tipc_link *link, struct sk_buff *skb)
12691257 return ;
12701258
12711259 switch (msg_user (msg )) {
1272- case CHANGEOVER_PROTOCOL :
1260+ case TUNNEL_PROTOCOL :
12731261 if (msg_dup (msg )) {
12741262 link -> flags |= LINK_SYNCHING ;
12751263 link -> synch_point = msg_seqno (msg_get_wrapped (msg ));
12761264 kfree_skb (skb );
12771265 break ;
12781266 }
1279- if (!tipc_link_failover_rcv (node , & skb ))
1267+ if (!tipc_link_failover_rcv (link , & skb ))
12801268 break ;
12811269 if (msg_user (buf_msg (skb )) != MSG_BUNDLER ) {
12821270 tipc_data_input (link , skb );
@@ -1391,8 +1379,8 @@ void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int probe_msg,
13911379 u32 msg_size = sizeof (l_ptr -> proto_msg );
13921380 int r_flag ;
13931381
1394- /* Don't send protocol message during link changeover */
1395- if (l_ptr -> exp_msg_count )
1382+ /* Don't send protocol message during link failover */
1383+ if (l_ptr -> flags & LINK_FAILINGOVER )
13961384 return ;
13971385
13981386 /* Abort non-RESET send if communication with node is prohibited */
@@ -1444,7 +1432,7 @@ void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int probe_msg,
14441432 }
14451433 l_ptr -> stats .sent_states ++ ;
14461434 } else { /* RESET_MSG or ACTIVATE_MSG */
1447- msg_set_ack (msg , mod (l_ptr -> reset_checkpoint - 1 ));
1435+ msg_set_ack (msg , mod (l_ptr -> failover_checkpt - 1 ));
14481436 msg_set_seq_gap (msg , 0 );
14491437 msg_set_next_sent (msg , 1 );
14501438 msg_set_probe (msg , 0 );
@@ -1486,8 +1474,7 @@ static void tipc_link_proto_rcv(struct tipc_link *l_ptr,
14861474 u32 msg_tol ;
14871475 struct tipc_msg * msg = buf_msg (buf );
14881476
1489- /* Discard protocol message during link changeover */
1490- if (l_ptr -> exp_msg_count )
1477+ if (l_ptr -> flags & LINK_FAILINGOVER )
14911478 goto exit ;
14921479
14931480 if (l_ptr -> net_plane != msg_net_plane (msg ))
@@ -1659,8 +1646,8 @@ void tipc_link_failover_send_queue(struct tipc_link *l_ptr)
16591646 if (!tunnel )
16601647 return ;
16611648
1662- tipc_msg_init (link_own_addr (l_ptr ), & tunnel_hdr , CHANGEOVER_PROTOCOL ,
1663- ORIGINAL_MSG , INT_H_SIZE , l_ptr -> addr );
1649+ tipc_msg_init (link_own_addr (l_ptr ), & tunnel_hdr , TUNNEL_PROTOCOL ,
1650+ FAILOVER_MSG , INT_H_SIZE , l_ptr -> addr );
16641651 skb_queue_splice_tail_init (& l_ptr -> backlogq , & l_ptr -> transmq );
16651652 tipc_link_purge_backlog (l_ptr );
16661653 msgcount = skb_queue_len (& l_ptr -> transmq );
@@ -1722,8 +1709,8 @@ void tipc_link_dup_queue_xmit(struct tipc_link *link,
17221709 struct sk_buff_head * queue = & link -> transmq ;
17231710 int mcnt ;
17241711
1725- tipc_msg_init (link_own_addr (link ), & tnl_hdr , CHANGEOVER_PROTOCOL ,
1726- DUPLICATE_MSG , INT_H_SIZE , link -> addr );
1712+ tipc_msg_init (link_own_addr (link ), & tnl_hdr , TUNNEL_PROTOCOL ,
1713+ SYNCH_MSG , INT_H_SIZE , link -> addr );
17271714 mcnt = skb_queue_len (& link -> transmq ) + skb_queue_len (& link -> backlogq );
17281715 msg_set_msgcnt (& tnl_hdr , mcnt );
17291716 msg_set_bearer_id (& tnl_hdr , link -> peer_bearer_id );
@@ -1756,59 +1743,60 @@ void tipc_link_dup_queue_xmit(struct tipc_link *link,
17561743 goto tunnel_queue ;
17571744}
17581745
1759- /* tipc_link_failover_rcv(): Receive a tunnelled ORIGINAL_MSG packet
1746+ /* tipc_link_failover_rcv(): Receive a tunnelled FAILOVER_MSG packet
17601747 * Owner node is locked.
17611748 */
1762- static bool tipc_link_failover_rcv (struct tipc_node * node ,
1749+ static bool tipc_link_failover_rcv (struct tipc_link * link ,
17631750 struct sk_buff * * skb )
17641751{
17651752 struct tipc_msg * msg = buf_msg (* skb );
17661753 struct sk_buff * iskb = NULL ;
1767- struct tipc_link * link = NULL ;
1754+ struct tipc_link * pl = NULL ;
17681755 int bearer_id = msg_bearer_id (msg );
17691756 int pos = 0 ;
17701757
1771- if (msg_type (msg ) != ORIGINAL_MSG ) {
1758+ if (msg_type (msg ) != FAILOVER_MSG ) {
17721759 pr_warn ("%sunknown tunnel pkt received\n" , link_co_err );
17731760 goto exit ;
17741761 }
17751762 if (bearer_id >= MAX_BEARERS )
17761763 goto exit ;
1777- link = node -> links [ bearer_id ];
1778- if (! link )
1764+
1765+ if (bearer_id == link -> bearer_id )
17791766 goto exit ;
1780- if (tipc_link_is_up (link ))
1781- tipc_link_reset (link );
17821767
1783- /* First failover packet? */
1784- if (link -> exp_msg_count == START_CHANGEOVER )
1785- link -> exp_msg_count = msg_msgcnt (msg );
1768+ pl = link -> owner -> links [bearer_id ];
1769+ if (pl && tipc_link_is_up (pl ))
1770+ tipc_link_reset (pl );
1771+
1772+ if (link -> failover_pkts == FIRST_FAILOVER )
1773+ link -> failover_pkts = msg_msgcnt (msg );
17861774
17871775 /* Should we expect an inner packet? */
1788- if (!link -> exp_msg_count )
1776+ if (!link -> failover_pkts )
17891777 goto exit ;
17901778
17911779 if (!tipc_msg_extract (* skb , & iskb , & pos )) {
17921780 pr_warn ("%sno inner failover pkt\n" , link_co_err );
17931781 * skb = NULL ;
17941782 goto exit ;
17951783 }
1796- link -> exp_msg_count -- ;
1784+ link -> failover_pkts -- ;
17971785 * skb = NULL ;
17981786
1799- /* Was packet already delivered? */
1800- if (less (buf_seqno (iskb ), link -> reset_checkpoint )) {
1787+ /* Was this packet already delivered? */
1788+ if (less (buf_seqno (iskb ), link -> failover_checkpt )) {
18011789 kfree_skb (iskb );
18021790 iskb = NULL ;
18031791 goto exit ;
18041792 }
18051793 if (msg_user (buf_msg (iskb )) == MSG_FRAGMENTER ) {
18061794 link -> stats .recv_fragments ++ ;
1807- tipc_buf_append (& link -> reasm_buf , & iskb );
1795+ tipc_buf_append (& link -> failover_skb , & iskb );
18081796 }
18091797exit :
1810- if (link && ( !link -> exp_msg_count ) && ( link -> flags & LINK_STOPPED ) )
1811- tipc_link_delete ( link ) ;
1798+ if (!link -> failover_pkts && pl )
1799+ pl -> flags &= ~ LINK_FAILINGOVER ;
18121800 kfree_skb (* skb );
18131801 * skb = iskb ;
18141802 return * skb ;
0 commit comments