Commit 66996b6c47ed7f6bbb01a768e23fae262c7db8e0

Authored by Jon Paul Maloy
Committed by David S. Miller
1 parent 655fb243b8

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: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 2 changed files with 92 additions and 11 deletions Side-by-side Diff

... ... @@ -494,8 +494,12 @@
494 494 case SELF_LOST_CONTACT_EVT:
495 495 case PEER_LOST_CONTACT_EVT:
496 496 break;
  497 + case NODE_SYNCH_END_EVT:
  498 + case NODE_SYNCH_BEGIN_EVT:
  499 + case NODE_FAILOVER_BEGIN_EVT:
  500 + case NODE_FAILOVER_END_EVT:
497 501 default:
498   - pr_err("Unknown node fsm evt %x/%x\n", state, evt);
  502 + goto illegal_evt;
499 503 }
500 504 break;
501 505 case SELF_UP_PEER_UP:
502 506  
503 507  
... ... @@ -506,11 +510,19 @@
506 510 case PEER_LOST_CONTACT_EVT:
507 511 state = SELF_LEAVING_PEER_DOWN;
508 512 break;
  513 + case NODE_SYNCH_BEGIN_EVT:
  514 + state = NODE_SYNCHING;
  515 + break;
  516 + case NODE_FAILOVER_BEGIN_EVT:
  517 + state = NODE_FAILINGOVER;
  518 + break;
509 519 case SELF_ESTABL_CONTACT_EVT:
510 520 case PEER_ESTABL_CONTACT_EVT:
  521 + case NODE_SYNCH_END_EVT:
  522 + case NODE_FAILOVER_END_EVT:
511 523 break;
512 524 default:
513   - pr_err("Unknown node fsm evt %x/%x\n", state, evt);
  525 + goto illegal_evt;
514 526 }
515 527 break;
516 528 case SELF_DOWN_PEER_LEAVING:
517 529  
... ... @@ -522,8 +534,12 @@
522 534 case PEER_ESTABL_CONTACT_EVT:
523 535 case SELF_LOST_CONTACT_EVT:
524 536 break;
  537 + case NODE_SYNCH_END_EVT:
  538 + case NODE_SYNCH_BEGIN_EVT:
  539 + case NODE_FAILOVER_BEGIN_EVT:
  540 + case NODE_FAILOVER_END_EVT:
525 541 default:
526   - pr_err("Unknown node fsm evt %x/%x\n", state, evt);
  542 + goto illegal_evt;
527 543 }
528 544 break;
529 545 case SELF_UP_PEER_COMING:
530 546  
... ... @@ -537,8 +553,12 @@
537 553 case SELF_ESTABL_CONTACT_EVT:
538 554 case PEER_LOST_CONTACT_EVT:
539 555 break;
  556 + case NODE_SYNCH_END_EVT:
  557 + case NODE_SYNCH_BEGIN_EVT:
  558 + case NODE_FAILOVER_BEGIN_EVT:
  559 + case NODE_FAILOVER_END_EVT:
540 560 default:
541   - pr_err("Unknown node fsm evt %x/%x\n", state, evt);
  561 + goto illegal_evt;
542 562 }
543 563 break;
544 564 case SELF_COMING_PEER_UP:
545 565  
... ... @@ -552,8 +572,12 @@
552 572 case SELF_LOST_CONTACT_EVT:
553 573 case PEER_ESTABL_CONTACT_EVT:
554 574 break;
  575 + case NODE_SYNCH_END_EVT:
  576 + case NODE_SYNCH_BEGIN_EVT:
  577 + case NODE_FAILOVER_BEGIN_EVT:
  578 + case NODE_FAILOVER_END_EVT:
555 579 default:
556   - pr_err("Unknown node fsm evt %x/%x\n", state, evt);
  580 + goto illegal_evt;
557 581 }
558 582 break;
559 583 case SELF_LEAVING_PEER_DOWN:
560 584  
561 585  
562 586  
563 587  
... ... @@ -565,16 +589,67 @@
565 589 case PEER_ESTABL_CONTACT_EVT:
566 590 case PEER_LOST_CONTACT_EVT:
567 591 break;
  592 + case NODE_SYNCH_END_EVT:
  593 + case NODE_SYNCH_BEGIN_EVT:
  594 + case NODE_FAILOVER_BEGIN_EVT:
  595 + case NODE_FAILOVER_END_EVT:
568 596 default:
569   - pr_err("Unknown node fsm evt %x/%x\n", state, evt);
  597 + goto illegal_evt;
570 598 }
571 599 break;
  600 + case NODE_FAILINGOVER:
  601 + switch (evt) {
  602 + case SELF_LOST_CONTACT_EVT:
  603 + state = SELF_DOWN_PEER_LEAVING;
  604 + break;
  605 + case PEER_LOST_CONTACT_EVT:
  606 + state = SELF_LEAVING_PEER_DOWN;
  607 + break;
  608 + case NODE_FAILOVER_END_EVT:
  609 + state = SELF_UP_PEER_UP;
  610 + break;
  611 + case NODE_FAILOVER_BEGIN_EVT:
  612 + case SELF_ESTABL_CONTACT_EVT:
  613 + case PEER_ESTABL_CONTACT_EVT:
  614 + break;
  615 + case NODE_SYNCH_BEGIN_EVT:
  616 + case NODE_SYNCH_END_EVT:
  617 + default:
  618 + goto illegal_evt;
  619 + }
  620 + break;
  621 + case NODE_SYNCHING:
  622 + switch (evt) {
  623 + case SELF_LOST_CONTACT_EVT:
  624 + state = SELF_DOWN_PEER_LEAVING;
  625 + break;
  626 + case PEER_LOST_CONTACT_EVT:
  627 + state = SELF_LEAVING_PEER_DOWN;
  628 + break;
  629 + case NODE_SYNCH_END_EVT:
  630 + state = SELF_UP_PEER_UP;
  631 + break;
  632 + case NODE_FAILOVER_BEGIN_EVT:
  633 + state = NODE_FAILINGOVER;
  634 + break;
  635 + case NODE_SYNCH_BEGIN_EVT:
  636 + case SELF_ESTABL_CONTACT_EVT:
  637 + case PEER_ESTABL_CONTACT_EVT:
  638 + break;
  639 + case NODE_FAILOVER_END_EVT:
  640 + default:
  641 + goto illegal_evt;
  642 + }
  643 + break;
572 644 default:
573 645 pr_err("Unknown node fsm state %x\n", state);
574 646 break;
575 647 }
576   -
577 648 n->state = state;
  649 + return;
  650 +
  651 +illegal_evt:
  652 + pr_err("Illegal node fsm evt %x in state %x\n", evt, state);
578 653 }
579 654  
580 655 bool tipc_node_filter_skb(struct tipc_node *n, struct tipc_link *l,
... ... @@ -56,13 +56,19 @@
56 56 SELF_UP_PEER_COMING = 0xac,
57 57 SELF_COMING_PEER_UP = 0xca,
58 58 SELF_LEAVING_PEER_DOWN = 0x1d,
  59 + NODE_FAILINGOVER = 0xf0,
  60 + NODE_SYNCHING = 0xcc
59 61 };
60 62  
61 63 enum {
62   - SELF_ESTABL_CONTACT_EVT = 0xec,
63   - SELF_LOST_CONTACT_EVT = 0x1c,
64   - PEER_ESTABL_CONTACT_EVT = 0xfec,
65   - PEER_LOST_CONTACT_EVT = 0xf1c
  64 + SELF_ESTABL_CONTACT_EVT = 0xece,
  65 + SELF_LOST_CONTACT_EVT = 0x1ce,
  66 + PEER_ESTABL_CONTACT_EVT = 0xfece,
  67 + PEER_LOST_CONTACT_EVT = 0xf1ce,
  68 + NODE_FAILOVER_BEGIN_EVT = 0xfbe,
  69 + NODE_FAILOVER_END_EVT = 0xfee,
  70 + NODE_SYNCH_BEGIN_EVT = 0xcbe,
  71 + NODE_SYNCH_END_EVT = 0xcee
66 72 };
67 73  
68 74 /* Flags used to take different actions according to flag type