On 6/4/19 1:22 PM, Tuong Lien wrote:
> This commit is along with the latter commit 4ec6a14c3933

The commit ID might be changed after the commit is merged into upstream,
which means the ID will be invalid as well.

 ("tipc: fix
> changeover issues due to large packet") to resolve the issues with the
> link changeover mechanism. See that commit for details.
> 
> Basically, for the link synching, from now on, we will send only one
> single ("dummy") SYNCH message to peer. The SYNCH message does not
> contain any data, just a header conveying the synch point to the peer.
> 
> A new node capability flag ("TIPC_TUNNEL_ENHANCED") is introduced for
> backward compatible!
> 
> Suggested-by: Jon Maloy <jon.ma...@ericsson.com>
> Signed-off-by: Tuong Lien <tuong.t.l...@dektech.com.au>

Acked-by: Ying Xue <ying....@windriver.com>

> ---
>  net/tipc/link.c | 26 ++++++++++++++++++++++++++
>  net/tipc/msg.h  | 10 ++++++++++
>  net/tipc/node.c |  6 ++++--
>  net/tipc/node.h |  6 ++++--
>  4 files changed, 44 insertions(+), 4 deletions(-)
> 
> diff --git a/net/tipc/link.c b/net/tipc/link.c
> index f5cd986e1e50..6924cf1e526f 100644
> --- a/net/tipc/link.c
> +++ b/net/tipc/link.c
> @@ -1637,6 +1637,7 @@ void tipc_link_tnl_prepare(struct tipc_link *l, struct 
> tipc_link *tnl,
>       struct sk_buff_head *queue = &l->transmq;
>       struct sk_buff_head tmpxq, tnlq;
>       u16 pktlen, pktcnt, seqno = l->snd_nxt;
> +     u16 syncpt;
>  
>       if (!tnl)
>               return;
> @@ -1656,6 +1657,31 @@ void tipc_link_tnl_prepare(struct tipc_link *l, struct 
> tipc_link *tnl,
>       tipc_link_xmit(l, &tnlq, &tmpxq);
>       __skb_queue_purge(&tmpxq);
>  
> +     /* Link Synching:
> +      * From now on, send only one single ("dummy") SYNCH message
> +      * to peer. The SYNCH message does not contain any data, just
> +      * a header conveying the synch point to the peer.
> +      */
> +     if (mtyp == SYNCH_MSG && (tnl->peer_caps & TIPC_TUNNEL_ENHANCED)) {
> +             tnlskb = tipc_msg_create(TUNNEL_PROTOCOL, SYNCH_MSG,
> +                                      INT_H_SIZE, 0, l->addr,
> +                                      tipc_own_addr(l->net),
> +                                      0, 0, 0);
> +             if (!tnlskb) {
> +                     pr_warn("%sunable to create dummy SYNCH_MSG\n",
> +                             link_co_err);
> +                     return;
> +             }
> +
> +             hdr = buf_msg(tnlskb);
> +             syncpt = l->snd_nxt + skb_queue_len(&l->backlogq) - 1;
> +             msg_set_syncpt(hdr, syncpt);
> +             msg_set_bearer_id(hdr, l->peer_bearer_id);
> +             __skb_queue_tail(&tnlq, tnlskb);
> +             tipc_link_xmit(tnl, &tnlq, xmitq);
> +             return;
> +     }
> +
>       /* Initialize reusable tunnel packet header */
>       tipc_msg_init(tipc_own_addr(l->net), &tnlhdr, TUNNEL_PROTOCOL,
>                     mtyp, INT_H_SIZE, l->addr);
> diff --git a/net/tipc/msg.h b/net/tipc/msg.h
> index 8de02ad6e352..baf937bfa702 100644
> --- a/net/tipc/msg.h
> +++ b/net/tipc/msg.h
> @@ -877,6 +877,16 @@ static inline void msg_set_msgcnt(struct tipc_msg *m, 
> u16 n)
>       msg_set_bits(m, 9, 16, 0xffff, n);
>  }
>  
> +static inline u16 msg_syncpt(struct tipc_msg *m)
> +{
> +     return msg_bits(m, 9, 16, 0xffff);
> +}
> +
> +static inline void msg_set_syncpt(struct tipc_msg *m, u16 n)
> +{
> +     msg_set_bits(m, 9, 16, 0xffff, n);
> +}
> +
>  static inline u32 msg_conn_ack(struct tipc_msg *m)
>  {
>       return msg_bits(m, 9, 16, 0xffff);
> diff --git a/net/tipc/node.c b/net/tipc/node.c
> index 9e106d3ed187..2a8399cf5525 100644
> --- a/net/tipc/node.c
> +++ b/net/tipc/node.c
> @@ -1645,7 +1645,6 @@ static bool tipc_node_check_state(struct tipc_node *n, 
> struct sk_buff *skb,
>       int usr = msg_user(hdr);
>       int mtyp = msg_type(hdr);
>       u16 oseqno = msg_seqno(hdr);
> -     u16 iseqno = msg_seqno(msg_get_wrapped(hdr));
>       u16 exp_pkts = msg_msgcnt(hdr);
>       u16 rcv_nxt, syncpt, dlv_nxt, inputq_len;
>       int state = n->state;
> @@ -1744,7 +1743,10 @@ static bool tipc_node_check_state(struct tipc_node *n, 
> struct sk_buff *skb,
>  
>       /* Initiate synch mode if applicable */
>       if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG) && (oseqno == 1)) {
> -             syncpt = iseqno + exp_pkts - 1;
> +             if (n->capabilities & TIPC_TUNNEL_ENHANCED)
> +                     syncpt = msg_syncpt(hdr);
> +             else
> +                     syncpt = msg_seqno(msg_get_wrapped(hdr)) + exp_pkts - 1;
>               if (!tipc_link_is_up(l))
>                       __tipc_node_link_up(n, bearer_id, xmitq);
>               if (n->state == SELF_UP_PEER_UP) {
> diff --git a/net/tipc/node.h b/net/tipc/node.h
> index c0bf49ea3de4..291d0ecd4101 100644
> --- a/net/tipc/node.h
> +++ b/net/tipc/node.h
> @@ -53,7 +53,8 @@ enum {
>       TIPC_NODE_ID128       = (1 << 5),
>       TIPC_LINK_PROTO_SEQNO = (1 << 6),
>       TIPC_MCAST_RBCTL      = (1 << 7),
> -     TIPC_GAP_ACK_BLOCK    = (1 << 8)
> +     TIPC_GAP_ACK_BLOCK    = (1 << 8),
> +     TIPC_TUNNEL_ENHANCED  = (1 << 9)
>  };
>  
>  #define TIPC_NODE_CAPABILITIES (TIPC_SYN_BIT           |  \
> @@ -64,7 +65,8 @@ enum {
>                               TIPC_NODE_ID128        |   \
>                               TIPC_LINK_PROTO_SEQNO  |   \
>                               TIPC_MCAST_RBCTL       |   \
> -                             TIPC_GAP_ACK_BLOCK)
> +                             TIPC_GAP_ACK_BLOCK     |   \
> +                             TIPC_TUNNEL_ENHANCED)
>  #define INVALID_BEARER_ID -1
>  
>  void tipc_node_stop(struct net *net);
> 


_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to