]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tipc: optimize link synching mechanism
authorTuong Lien <tuong.t.lien@dektech.com.au>
Wed, 24 Jul 2019 01:56:11 +0000 (08:56 +0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 25 Jul 2019 22:55:47 +0000 (15:55 -0700)
This commit along with the next one are 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!

Acked-by: Ying Xue <ying.xue@windriver.com>
Acked-by: Jon Maloy <jon.maloy@ericsson.com>
Suggested-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: Tuong Lien <tuong.t.lien@dektech.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/link.c
net/tipc/msg.h
net/tipc/node.c
net/tipc/node.h

index 66d3a07bc5711ff404332e2224d139ad71daaaee..e215b4ba6a4bb5dec0ca9c218b7a04406df8ee80 100644 (file)
@@ -1665,6 +1665,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;
@@ -1684,6 +1685,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);
index da509f0eb9ca48d70ef012418e2e3326d9e83563..fca042cdff88aa8e623890ec4d0545ccb1389f6c 100644 (file)
@@ -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);
index 3a5be1d7e572a0eb4a5ea0e90bcfaff5ee155791..7ca019001f7c8236e1362e85d848943df2a3acb5 100644 (file)
@@ -1649,7 +1649,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_inner_hdr(hdr));
        u16 exp_pkts = msg_msgcnt(hdr);
        u16 rcv_nxt, syncpt, dlv_nxt, inputq_len;
        int state = n->state;
@@ -1748,7 +1747,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_inner_hdr(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) {
index c0bf49ea3de46ce91ba1757c8efe912d077da92d..291d0ecd4101303e8983c37370779f7a72eeb4ab 100644 (file)
@@ -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);