Commit 66996b6c authored by Jon Paul Maloy's avatar Jon Paul Maloy Committed by David S. Miller

tipc: extend node FSM

In the next commit, we will move link synch/failover orchestration to
the link aggregation level. In order to do this, we first need to extend
the node FSM with two more states, NODE_SYNCHING and NODE_FAILINGOVER,
plus four new events to enter and leave those states.

This commit introduces this change, without yet making use of it.
The node FSM now looks as follows:

                           +-----------------------------------------+
                           |                            PEER_DOWN_EVT|
                           |                                         |
  +------------------------+----------------+                        |
  |SELF_DOWN_EVT           |                |                        |
  |                        |                |                        |
  |              +-----------+          +-----------+                |
  |              |NODE_      |          |NODE_      |                |
  |   +----------|FAILINGOVER|<---------|SYNCHING   |------------+   |
  |   |SELF_     +-----------+ FAILOVER_+-----------+    PEER_   |   |
  |   |DOWN_EVT   |         A  BEGIN_EVT A         |     DOWN_EVT|   |
  |   |           |         |            |         |             |   |
  |   |           |         |            |         |             |   |
  |   |           |FAILOVER_|FAILOVER_   |SYNCH_   |SYNCH_       |   |
  |   |           |END_EVT  |BEGIN_EVT   |BEGIN_EVT|END_EVT      |   |
  |   |           |         |            |         |             |   |
  |   |           |         |            |         |             |   |
  |   |           |        +--------------+        |             |   |
  |   |           +------->|   SELF_UP_   |<-------+             |   |
  |   |   +----------------|   PEER_UP    |------------------+   |   |
  |   |   |SELF_DOWN_EVT   +--------------+     PEER_DOWN_EVT|   |   |
  |   |   |                   A          A                   |   |   |
  |   |   |                   |          |                   |   |   |
  |   |   |        PEER_UP_EVT|          |SELF_UP_EVT        |   |   |
  |   |   |                   |          |                   |   |   |
  V   V   V                   |          |                   V   V   V
+------------+       +-----------+    +-----------+       +------------+
|SELF_DOWN_  |       |SELF_UP_   |    |PEER_UP_   |       |PEER_DOWN   |
|PEER_LEAVING|<------|PEER_COMING|    |SELF_COMING|------>|SELF_LEAVING|
+------------+ SELF_ +-----------+    +-----------+ PEER_ +------------+
       |       DOWN_EVT       A          A          DOWN_EVT     |
       |                      |          |                       |
       |                      |          |                       |
       |           SELF_UP_EVT|          |PEER_UP_EVT            |
       |                      |          |                       |
       |                      |          |                       |
       |PEER_DOWN_EVT       +--------------+        SELF_DOWN_EVT|
       +------------------->|  SELF_DOWN_  |<--------------------+
                            |  PEER_DOWN   |
                            +--------------+
Tested-by: default avatarYing Xue <ying.xue@windriver.com>
Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 655fb243
...@@ -494,8 +494,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) ...@@ -494,8 +494,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt)
case SELF_LOST_CONTACT_EVT: case SELF_LOST_CONTACT_EVT:
case PEER_LOST_CONTACT_EVT: case PEER_LOST_CONTACT_EVT:
break; break;
case NODE_SYNCH_END_EVT:
case NODE_SYNCH_BEGIN_EVT:
case NODE_FAILOVER_BEGIN_EVT:
case NODE_FAILOVER_END_EVT:
default: default:
pr_err("Unknown node fsm evt %x/%x\n", state, evt); goto illegal_evt;
} }
break; break;
case SELF_UP_PEER_UP: case SELF_UP_PEER_UP:
...@@ -506,11 +510,19 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) ...@@ -506,11 +510,19 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt)
case PEER_LOST_CONTACT_EVT: case PEER_LOST_CONTACT_EVT:
state = SELF_LEAVING_PEER_DOWN; state = SELF_LEAVING_PEER_DOWN;
break; break;
case NODE_SYNCH_BEGIN_EVT:
state = NODE_SYNCHING;
break;
case NODE_FAILOVER_BEGIN_EVT:
state = NODE_FAILINGOVER;
break;
case SELF_ESTABL_CONTACT_EVT: case SELF_ESTABL_CONTACT_EVT:
case PEER_ESTABL_CONTACT_EVT: case PEER_ESTABL_CONTACT_EVT:
case NODE_SYNCH_END_EVT:
case NODE_FAILOVER_END_EVT:
break; break;
default: default:
pr_err("Unknown node fsm evt %x/%x\n", state, evt); goto illegal_evt;
} }
break; break;
case SELF_DOWN_PEER_LEAVING: case SELF_DOWN_PEER_LEAVING:
...@@ -522,8 +534,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) ...@@ -522,8 +534,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt)
case PEER_ESTABL_CONTACT_EVT: case PEER_ESTABL_CONTACT_EVT:
case SELF_LOST_CONTACT_EVT: case SELF_LOST_CONTACT_EVT:
break; break;
case NODE_SYNCH_END_EVT:
case NODE_SYNCH_BEGIN_EVT:
case NODE_FAILOVER_BEGIN_EVT:
case NODE_FAILOVER_END_EVT:
default: default:
pr_err("Unknown node fsm evt %x/%x\n", state, evt); goto illegal_evt;
} }
break; break;
case SELF_UP_PEER_COMING: case SELF_UP_PEER_COMING:
...@@ -537,8 +553,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) ...@@ -537,8 +553,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt)
case SELF_ESTABL_CONTACT_EVT: case SELF_ESTABL_CONTACT_EVT:
case PEER_LOST_CONTACT_EVT: case PEER_LOST_CONTACT_EVT:
break; break;
case NODE_SYNCH_END_EVT:
case NODE_SYNCH_BEGIN_EVT:
case NODE_FAILOVER_BEGIN_EVT:
case NODE_FAILOVER_END_EVT:
default: default:
pr_err("Unknown node fsm evt %x/%x\n", state, evt); goto illegal_evt;
} }
break; break;
case SELF_COMING_PEER_UP: case SELF_COMING_PEER_UP:
...@@ -552,8 +572,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) ...@@ -552,8 +572,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt)
case SELF_LOST_CONTACT_EVT: case SELF_LOST_CONTACT_EVT:
case PEER_ESTABL_CONTACT_EVT: case PEER_ESTABL_CONTACT_EVT:
break; break;
case NODE_SYNCH_END_EVT:
case NODE_SYNCH_BEGIN_EVT:
case NODE_FAILOVER_BEGIN_EVT:
case NODE_FAILOVER_END_EVT:
default: default:
pr_err("Unknown node fsm evt %x/%x\n", state, evt); goto illegal_evt;
} }
break; break;
case SELF_LEAVING_PEER_DOWN: case SELF_LEAVING_PEER_DOWN:
...@@ -565,16 +589,67 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) ...@@ -565,16 +589,67 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt)
case PEER_ESTABL_CONTACT_EVT: case PEER_ESTABL_CONTACT_EVT:
case PEER_LOST_CONTACT_EVT: case PEER_LOST_CONTACT_EVT:
break; break;
case NODE_SYNCH_END_EVT:
case NODE_SYNCH_BEGIN_EVT:
case NODE_FAILOVER_BEGIN_EVT:
case NODE_FAILOVER_END_EVT:
default:
goto illegal_evt;
}
break;
case NODE_FAILINGOVER:
switch (evt) {
case SELF_LOST_CONTACT_EVT:
state = SELF_DOWN_PEER_LEAVING;
break;
case PEER_LOST_CONTACT_EVT:
state = SELF_LEAVING_PEER_DOWN;
break;
case NODE_FAILOVER_END_EVT:
state = SELF_UP_PEER_UP;
break;
case NODE_FAILOVER_BEGIN_EVT:
case SELF_ESTABL_CONTACT_EVT:
case PEER_ESTABL_CONTACT_EVT:
break;
case NODE_SYNCH_BEGIN_EVT:
case NODE_SYNCH_END_EVT:
default:
goto illegal_evt;
}
break;
case NODE_SYNCHING:
switch (evt) {
case SELF_LOST_CONTACT_EVT:
state = SELF_DOWN_PEER_LEAVING;
break;
case PEER_LOST_CONTACT_EVT:
state = SELF_LEAVING_PEER_DOWN;
break;
case NODE_SYNCH_END_EVT:
state = SELF_UP_PEER_UP;
break;
case NODE_FAILOVER_BEGIN_EVT:
state = NODE_FAILINGOVER;
break;
case NODE_SYNCH_BEGIN_EVT:
case SELF_ESTABL_CONTACT_EVT:
case PEER_ESTABL_CONTACT_EVT:
break;
case NODE_FAILOVER_END_EVT:
default: default:
pr_err("Unknown node fsm evt %x/%x\n", state, evt); goto illegal_evt;
} }
break; break;
default: default:
pr_err("Unknown node fsm state %x\n", state); pr_err("Unknown node fsm state %x\n", state);
break; break;
} }
n->state = state; n->state = state;
return;
illegal_evt:
pr_err("Illegal node fsm evt %x in state %x\n", evt, state);
} }
bool tipc_node_filter_skb(struct tipc_node *n, struct tipc_link *l, bool tipc_node_filter_skb(struct tipc_node *n, struct tipc_link *l,
......
...@@ -56,13 +56,19 @@ enum { ...@@ -56,13 +56,19 @@ enum {
SELF_UP_PEER_COMING = 0xac, SELF_UP_PEER_COMING = 0xac,
SELF_COMING_PEER_UP = 0xca, SELF_COMING_PEER_UP = 0xca,
SELF_LEAVING_PEER_DOWN = 0x1d, SELF_LEAVING_PEER_DOWN = 0x1d,
NODE_FAILINGOVER = 0xf0,
NODE_SYNCHING = 0xcc
}; };
enum { enum {
SELF_ESTABL_CONTACT_EVT = 0xec, SELF_ESTABL_CONTACT_EVT = 0xece,
SELF_LOST_CONTACT_EVT = 0x1c, SELF_LOST_CONTACT_EVT = 0x1ce,
PEER_ESTABL_CONTACT_EVT = 0xfec, PEER_ESTABL_CONTACT_EVT = 0xfece,
PEER_LOST_CONTACT_EVT = 0xf1c PEER_LOST_CONTACT_EVT = 0xf1ce,
NODE_FAILOVER_BEGIN_EVT = 0xfbe,
NODE_FAILOVER_END_EVT = 0xfee,
NODE_SYNCH_BEGIN_EVT = 0xcbe,
NODE_SYNCH_END_EVT = 0xcee
}; };
/* Flags used to take different actions according to flag type /* Flags used to take different actions according to flag type
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment