aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-07-30 18:24:18 -0400
committerDavid S. Miller <davem@davemloft.net>2015-07-30 20:25:13 -0400
commit66996b6c47ed7f6bbb01a768e23fae262c7db8e0 (patch)
tree2567778802dedcde9c2b72430919038999512373 /net/tipc
parent655fb243b8ae5e652f744311bcb6e806e83cea1e (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.c89
-rw-r--r--net/tipc/node.h14
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
651illegal_evt:
652 pr_err("Illegal node fsm evt %x in state %x\n", evt, state);
578} 653}
579 654
580bool tipc_node_filter_skb(struct tipc_node *n, struct tipc_link *l, 655bool 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
61enum { 63enum {
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