diff options
author | Jon Paul Maloy <jon.maloy@ericsson.com> | 2015-07-30 18:24:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-07-30 20:25:13 -0400 |
commit | 66996b6c47ed7f6bbb01a768e23fae262c7db8e0 (patch) | |
tree | 2567778802dedcde9c2b72430919038999512373 /net/tipc | |
parent | 655fb243b8ae5e652f744311bcb6e806e83cea1e (diff) |
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>
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/node.c | 89 | ||||
-rw-r--r-- | net/tipc/node.h | 14 |
2 files changed, 92 insertions, 11 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 65c2c80cffe7..6b18d73830ca 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -494,8 +494,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) | |||
494 | case SELF_LOST_CONTACT_EVT: | 494 | case SELF_LOST_CONTACT_EVT: |
495 | case PEER_LOST_CONTACT_EVT: | 495 | case PEER_LOST_CONTACT_EVT: |
496 | break; | 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 | default: | 501 | default: |
498 | pr_err("Unknown node fsm evt %x/%x\n", state, evt); | 502 | goto illegal_evt; |
499 | } | 503 | } |
500 | break; | 504 | break; |
501 | case SELF_UP_PEER_UP: | 505 | case SELF_UP_PEER_UP: |
@@ -506,11 +510,19 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) | |||
506 | case PEER_LOST_CONTACT_EVT: | 510 | case PEER_LOST_CONTACT_EVT: |
507 | state = SELF_LEAVING_PEER_DOWN; | 511 | state = SELF_LEAVING_PEER_DOWN; |
508 | break; | 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 | case SELF_ESTABL_CONTACT_EVT: | 519 | case SELF_ESTABL_CONTACT_EVT: |
510 | case PEER_ESTABL_CONTACT_EVT: | 520 | case PEER_ESTABL_CONTACT_EVT: |
521 | case NODE_SYNCH_END_EVT: | ||
522 | case NODE_FAILOVER_END_EVT: | ||
511 | break; | 523 | break; |
512 | default: | 524 | default: |
513 | pr_err("Unknown node fsm evt %x/%x\n", state, evt); | 525 | goto illegal_evt; |
514 | } | 526 | } |
515 | break; | 527 | break; |
516 | case SELF_DOWN_PEER_LEAVING: | 528 | case SELF_DOWN_PEER_LEAVING: |
@@ -522,8 +534,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) | |||
522 | case PEER_ESTABL_CONTACT_EVT: | 534 | case PEER_ESTABL_CONTACT_EVT: |
523 | case SELF_LOST_CONTACT_EVT: | 535 | case SELF_LOST_CONTACT_EVT: |
524 | break; | 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 | default: | 541 | default: |
526 | pr_err("Unknown node fsm evt %x/%x\n", state, evt); | 542 | goto illegal_evt; |
527 | } | 543 | } |
528 | break; | 544 | break; |
529 | case SELF_UP_PEER_COMING: | 545 | case SELF_UP_PEER_COMING: |
@@ -537,8 +553,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) | |||
537 | case SELF_ESTABL_CONTACT_EVT: | 553 | case SELF_ESTABL_CONTACT_EVT: |
538 | case PEER_LOST_CONTACT_EVT: | 554 | case PEER_LOST_CONTACT_EVT: |
539 | break; | 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 | default: | 560 | default: |
541 | pr_err("Unknown node fsm evt %x/%x\n", state, evt); | 561 | goto illegal_evt; |
542 | } | 562 | } |
543 | break; | 563 | break; |
544 | case SELF_COMING_PEER_UP: | 564 | case SELF_COMING_PEER_UP: |
@@ -552,8 +572,12 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) | |||
552 | case SELF_LOST_CONTACT_EVT: | 572 | case SELF_LOST_CONTACT_EVT: |
553 | case PEER_ESTABL_CONTACT_EVT: | 573 | case PEER_ESTABL_CONTACT_EVT: |
554 | break; | 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 | default: | 579 | default: |
556 | pr_err("Unknown node fsm evt %x/%x\n", state, evt); | 580 | goto illegal_evt; |
557 | } | 581 | } |
558 | break; | 582 | break; |
559 | case SELF_LEAVING_PEER_DOWN: | 583 | case SELF_LEAVING_PEER_DOWN: |
@@ -565,16 +589,67 @@ static void tipc_node_fsm_evt(struct tipc_node *n, int evt) | |||
565 | case PEER_ESTABL_CONTACT_EVT: | 589 | case PEER_ESTABL_CONTACT_EVT: |
566 | case PEER_LOST_CONTACT_EVT: | 590 | case PEER_LOST_CONTACT_EVT: |
567 | break; | 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: | ||
596 | default: | ||
597 | goto illegal_evt; | ||
598 | } | ||
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: | ||
568 | default: | 617 | default: |
569 | pr_err("Unknown node fsm evt %x/%x\n", state, evt); | 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; | ||
570 | } | 642 | } |
571 | break; | 643 | break; |
572 | default: | 644 | default: |
573 | pr_err("Unknown node fsm state %x\n", state); | 645 | pr_err("Unknown node fsm state %x\n", state); |
574 | break; | 646 | break; |
575 | } | 647 | } |
576 | |||
577 | n->state = state; | 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 | bool tipc_node_filter_skb(struct tipc_node *n, struct tipc_link *l, | 655 | bool tipc_node_filter_skb(struct tipc_node *n, struct tipc_link *l, |
diff --git a/net/tipc/node.h b/net/tipc/node.h index 49df0e934a65..65e2728f66a6 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
@@ -56,13 +56,19 @@ enum { | |||
56 | SELF_UP_PEER_COMING = 0xac, | 56 | SELF_UP_PEER_COMING = 0xac, |
57 | SELF_COMING_PEER_UP = 0xca, | 57 | SELF_COMING_PEER_UP = 0xca, |
58 | SELF_LEAVING_PEER_DOWN = 0x1d, | 58 | SELF_LEAVING_PEER_DOWN = 0x1d, |
59 | NODE_FAILINGOVER = 0xf0, | ||
60 | NODE_SYNCHING = 0xcc | ||
59 | }; | 61 | }; |
60 | 62 | ||
61 | enum { | 63 | enum { |
62 | SELF_ESTABL_CONTACT_EVT = 0xec, | 64 | SELF_ESTABL_CONTACT_EVT = 0xece, |
63 | SELF_LOST_CONTACT_EVT = 0x1c, | 65 | SELF_LOST_CONTACT_EVT = 0x1ce, |
64 | PEER_ESTABL_CONTACT_EVT = 0xfec, | 66 | PEER_ESTABL_CONTACT_EVT = 0xfece, |
65 | PEER_LOST_CONTACT_EVT = 0xf1c | 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 | /* Flags used to take different actions according to flag type | 74 | /* Flags used to take different actions according to flag type |