Commit 66996b6c47ed7f6bbb01a768e23fae262c7db8e0
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
net/tipc/node.c
... | ... | @@ -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, |
net/tipc/node.h
... | ... | @@ -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 |