I'm sending a v2 of this patch with all the requested modifications.

Regards,
Daniele

2014-11-14 1:17 GMT+01:00 Jarno Rajahalme <jrajaha...@nicira.com>:

> Daniele,
>
> See my comments below,
>
> Thanks!
>
>   Jarno
>
> On Nov 6, 2014, at 7:31 AM, Daniele Venturino <daniele.ventur...@m3s.it>
> wrote:
>
> >      When the condition associated with a global transition is met, it
> >      supersedes all other exit conditions including UCT.
>
> It would be nice if you’d explain in a sentence or two what a global
> transition is.
>
> >
> > Signed-off-by: Daniele Venturino <daniele.ventur...@m3s.it>
> > ---
> > lib/rstp-state-machines.c | 139
> +++++++++++++++++++++++++++++++++++++++++++---
> > 1 file changed, 130 insertions(+), 9 deletions(-)
> >
> > diff --git a/lib/rstp-state-machines.c b/lib/rstp-state-machines.c
> > index 40eeea5..dc25b00 100644
> > --- a/lib/rstp-state-machines.c
> > +++ b/lib/rstp-state-machines.c
> > @@ -518,7 +518,12 @@ port_receive_sm(struct rstp_port *p)
> >         p->port_receive_sm_state = PORT_RECEIVE_SM_DISCARD;
> >         /* no break */
> >     case PORT_RECEIVE_SM_DISCARD:
> > -        if (p->rcvd_bpdu && p->port_enabled) {
> > +        /* Global transition. */
>
> The test for the Global transition condition follows, right? In that case
> it would be better to move the above comment inside the if statement, i.e.,
> when the condition is satisfied.
>
> > +        if ((p->rcvd_bpdu || (p->edge_delay_while != r->migrate_time))
> > +                && !p->port_enabled) {
> > +            p->port_receive_sm_state = PORT_RECEIVE_SM_DISCARD_EXEC;
> > +            break;
>
> The break here is not needed.
>
> These same two comments apply throughout, also to the existing “Global
> transition” cases in the file.
>
> > +        } else if (p->rcvd_bpdu && p->port_enabled) {
> >             p->port_receive_sm_state = PORT_RECEIVE_SM_RECEIVE_EXEC;
> >         }
> >         break;
> > @@ -530,7 +535,12 @@ port_receive_sm(struct rstp_port *p)
> >         p->port_receive_sm_state = PORT_RECEIVE_SM_RECEIVE;
> >         /* no break */
> >     case PORT_RECEIVE_SM_RECEIVE:
> > -        if (p->rcvd_bpdu && p->port_enabled && !p->rcvd_msg) {
> > +        /* Global transition. */
> > +        if ((p->rcvd_bpdu || (p->edge_delay_while != r->migrate_time))
> > +                && !p->port_enabled) {
> > +            p->port_receive_sm_state = PORT_RECEIVE_SM_DISCARD_EXEC;
> > +            break;
> > +        } else if (p->rcvd_bpdu && p->port_enabled && !p->rcvd_msg) {
> >             p->port_receive_sm_state = PORT_RECEIVE_SM_RECEIVE_EXEC;
> >         }
> >         break;
> > @@ -1127,12 +1137,10 @@ port_information_sm(struct rstp_port *p)
> >     old_state = p->port_information_sm_state;
> >     r = p->rstp;
> >
> > -    if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > -        p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > -    }
> >     switch (p->port_information_sm_state) {
> >     case PORT_INFORMATION_SM_INIT:
> > -        if (r->begin) {
> > +        if (r->begin
> > +            || (!p->port_enabled && p->info_is != INFO_IS_DISABLED)) {
> >             p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
>
> I guess this change is also related to Global transition? Does it need a
> comment also?
>
> >         }
> >         break;
> > @@ -1146,7 +1154,11 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state = PORT_INFORMATION_SM_DISABLED;
> >         /* no break */
> >     case PORT_INFORMATION_SM_DISABLED:
> > -        if (p->port_enabled) {
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        } else if (p->port_enabled) {
> >             p->port_information_sm_state = PORT_INFORMATION_SM_AGED_EXEC;
> >         } else if (p->rcvd_msg) {
> >             p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > @@ -1159,7 +1171,11 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state = PORT_INFORMATION_SM_AGED;
> >         /* no break */
> >     case PORT_INFORMATION_SM_AGED:
> > -        if (p->selected && p->updt_info) {
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        } else if (p->selected && p->updt_info) {
> >             p->port_information_sm_state =
> PORT_INFORMATION_SM_UPDATE_EXEC;
> >         }
> >         break;
> > @@ -1183,13 +1199,22 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state = PORT_INFORMATION_SM_UPDATE;
> >         /* no break */
> >     case PORT_INFORMATION_SM_UPDATE:
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        }
> >         p->port_information_sm_state = PORT_INFORMATION_SM_CURRENT_EXEC;
> >         break;
> >     case PORT_INFORMATION_SM_CURRENT_EXEC:
> >         p->port_information_sm_state = PORT_INFORMATION_SM_CURRENT;
> >         /* no break */
> >     case PORT_INFORMATION_SM_CURRENT:
> > -        if (p->rcvd_msg && !p->updt_info) {
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        } else if (p->rcvd_msg && !p->updt_info) {
> >             p->port_information_sm_state =
> PORT_INFORMATION_SM_RECEIVE_EXEC;
> >         } else if (p->selected && p->updt_info) {
> >             p->port_information_sm_state =
> PORT_INFORMATION_SM_UPDATE_EXEC;
> > @@ -1204,6 +1229,11 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state = PORT_INFORMATION_SM_RECEIVE;
> >         /* no break */
> >     case PORT_INFORMATION_SM_RECEIVE:
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        }
> >         switch (p->rcvd_info) {
> >         case SUPERIOR_DESIGNATED_INFO:
> >             p->port_information_sm_state =
> > @@ -1234,6 +1264,11 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state = PORT_INFORMATION_SM_OTHER;
> >         /* no break */
> >     case PORT_INFORMATION_SM_OTHER:
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        }
> >         p->port_information_sm_state = PORT_INFORMATION_SM_CURRENT_EXEC;
> >         break;
> >     case PORT_INFORMATION_SM_NOT_DESIGNATED_EXEC:
> > @@ -1243,6 +1278,11 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state =
> PORT_INFORMATION_SM_NOT_DESIGNATED;
> >         /* no break */
> >     case PORT_INFORMATION_SM_NOT_DESIGNATED:
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        }
> >         p->port_information_sm_state = PORT_INFORMATION_SM_CURRENT_EXEC;
> >         break;
> >     case PORT_INFORMATION_SM_INFERIOR_DESIGNATED_EXEC:
> > @@ -1251,6 +1291,11 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state =
> PORT_INFORMATION_SM_INFERIOR_DESIGNATED;
> >         /* no break */
> >     case PORT_INFORMATION_SM_INFERIOR_DESIGNATED:
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        }
> >         p->port_information_sm_state = PORT_INFORMATION_SM_CURRENT_EXEC;
> >         break;
> >     case PORT_INFORMATION_SM_REPEATED_DESIGNATED_EXEC:
> > @@ -1261,6 +1306,11 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state =
> PORT_INFORMATION_SM_REPEATED_DESIGNATED;
> >         /* no break */
> >     case PORT_INFORMATION_SM_REPEATED_DESIGNATED:
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        }
> >         p->port_information_sm_state = PORT_INFORMATION_SM_CURRENT_EXEC;
> >         break;
> >     case PORT_INFORMATION_SM_SUPERIOR_DESIGNATED_EXEC:
> > @@ -1279,6 +1329,11 @@ port_information_sm(struct rstp_port *p)
> >         p->port_information_sm_state =
> PORT_INFORMATION_SM_SUPERIOR_DESIGNATED;
> >         /* no break */
> >     case PORT_INFORMATION_SM_SUPERIOR_DESIGNATED:
> > +        /* Global transition. */
> > +        if (!p->port_enabled && p->info_is != INFO_IS_DISABLED) {
> > +            p->port_information_sm_state =
> PORT_INFORMATION_SM_DISABLED_EXEC;
> > +            break;
> > +        }
> >         p->port_information_sm_state = PORT_INFORMATION_SM_CURRENT_EXEC;
> >         break;
> >     default:
> > @@ -1464,6 +1519,7 @@ port_role_transition_sm(struct rstp_port *p)
> >             PORT_ROLE_TRANSITION_SM_DISABLE_PORT;
> >         /* no break */
> >     case PORT_ROLE_TRANSITION_SM_DISABLE_PORT:
> > +        /* Global transition. */
> >         if (check_selected_role_change(p, ROLE_DISABLED)) {
> >             break;
> >         } else if (p->selected && !p->updt_info && !p->learning
> > @@ -1481,6 +1537,7 @@ port_role_transition_sm(struct rstp_port *p)
> >             PORT_ROLE_TRANSITION_SM_DISABLED_PORT;
> >         /* no break */
> >     case PORT_ROLE_TRANSITION_SM_DISABLED_PORT:
> > +        /* Global transition. */
> >         if (check_selected_role_change(p, ROLE_DISABLED)) {
> >             break;
> >         } else if (p->selected && !p->updt_info
> > @@ -1496,6 +1553,7 @@ port_role_transition_sm(struct rstp_port *p)
> >         p->port_role_transition_sm_state =
> PORT_ROLE_TRANSITION_SM_ROOT_PORT;
> >         /* no break */
> >     case PORT_ROLE_TRANSITION_SM_ROOT_PORT:
> > +        /* Global transition. */
> >         if (check_selected_role_change(p, ROLE_ROOT)) {
> >             break;
> >         } else if (p->selected && !p->updt_info) {
> > @@ -1536,11 +1594,19 @@ port_role_transition_sm(struct rstp_port *p)
> >         }
> >     break;
> >     case PORT_ROLE_TRANSITION_SM_REROOT_EXEC:
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ROOT)) {
> > +            break;
> > +        }
>
> Could remove the break here too, and follow with “} else { … }”.
>
> >         set_re_root_tree(p);
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_ROOT_PORT_EXEC;
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_ROOT_AGREED_EXEC:
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ROOT)) {
> > +            break;
> > +        }
> >         p->proposed = p->sync = false;
> >         p->agree = p->new_info = true;
> >         p->port_role_transition_sm_state =
> > @@ -1549,23 +1615,39 @@ port_role_transition_sm(struct rstp_port *p)
> >     case PORT_ROLE_TRANSITION_SM_ROOT_PROPOSED_EXEC:
> >         set_sync_tree(p);
> >         p->proposed = false;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ROOT)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_ROOT_PORT_EXEC;
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_ROOT_FORWARD_EXEC:
> >         p->fd_while = 0;
> >         p->forward = true;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ROOT)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_ROOT_PORT_EXEC;
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_ROOT_LEARN_EXEC:
> >         p->fd_while = forward_delay(p);
> >         p->learn = true;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ROOT)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_ROOT_PORT_EXEC;
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_REROOTED_EXEC:
> >         p->re_root = false;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ROOT)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_ROOT_PORT_EXEC;
> >         break;
> > @@ -1575,6 +1657,7 @@ port_role_transition_sm(struct rstp_port *p)
> >             PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT;
> >         /* no break */
> >     case PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT:
> > +         /* Global transition. */
> >         if (check_selected_role_change(p, ROLE_DESIGNATED)) {
> >             break;
> >         } else if (p->selected && !p->updt_info) {
> > @@ -1611,6 +1694,10 @@ port_role_transition_sm(struct rstp_port *p)
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_DESIGNATED_RETIRED_EXEC:
> >         p->re_root = false;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_DESIGNATED)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT_EXEC;
> >         break;
> > @@ -1618,6 +1705,10 @@ port_role_transition_sm(struct rstp_port *p)
> >         p->rr_while = 0;
> >         p->synced = true;
> >         p->sync = false;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_DESIGNATED)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT_EXEC;
> >         break;
> > @@ -1625,6 +1716,10 @@ port_role_transition_sm(struct rstp_port *p)
> >         p->proposing = true;
> >         p->edge_delay_while = edge_delay(p);
> >         p->new_info = true;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_DESIGNATED)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT_EXEC;
> >         break;
> > @@ -1632,18 +1727,30 @@ port_role_transition_sm(struct rstp_port *p)
> >         p->forward = true;
> >         p->fd_while = 0;
> >         p->agreed = p->send_rstp;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_DESIGNATED)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT_EXEC;
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_DESIGNATED_LEARN_EXEC:
> >         p->learn = true;
> >         p->fd_while = forward_delay(p);
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_DESIGNATED)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT_EXEC;
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_DESIGNATED_DISCARD_EXEC:
> >         p->learn = p->forward = p->disputed = false;
> >         p->fd_while = forward_delay(p);
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_DESIGNATED)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_DESIGNATED_PORT_EXEC;
> >         break;
> > @@ -1656,6 +1763,7 @@ port_role_transition_sm(struct rstp_port *p)
> >             PORT_ROLE_TRANSITION_SM_ALTERNATE_PORT;
> >         /* no break */
> >     case PORT_ROLE_TRANSITION_SM_ALTERNATE_PORT:
> > +        /* Global transition. */
> >         if (check_selected_role_change(p, ROLE_ALTERNATE)) {
> >             break;
> >         } else if (p->selected && !p->updt_info) {
> > @@ -1681,12 +1789,20 @@ port_role_transition_sm(struct rstp_port *p)
> >         p->proposed = false;
> >         p->agree = true;
> >         p->new_info = true;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ALTERNATE)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_ALTERNATE_PORT_EXEC;
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_ALTERNATE_PROPOSED_EXEC:
> >         set_sync_tree(p);
> >         p->proposed = false;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ALTERNATE)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_ALTERNATE_PORT_EXEC;
> >         break;
> > @@ -1696,6 +1812,7 @@ port_role_transition_sm(struct rstp_port *p)
> >         p->port_role_transition_sm_state =
> PORT_ROLE_TRANSITION_SM_BLOCK_PORT;
> >         /* no break */
> >     case PORT_ROLE_TRANSITION_SM_BLOCK_PORT:
> > +        /* Global transition. */
> >         if (check_selected_role_change(p, ROLE_ALTERNATE)) {
> >             break;
> >         } else if (p->selected && !p->updt_info && !p->learning &&
> > @@ -1706,6 +1823,10 @@ port_role_transition_sm(struct rstp_port *p)
> >         break;
> >     case PORT_ROLE_TRANSITION_SM_BACKUP_PORT_EXEC:
> >         p->rb_while = 2 * p->designated_times.hello_time;
> > +        /* Global transition. */
> > +        if (check_selected_role_change(p, ROLE_ALTERNATE)) {
> > +            break;
> > +        }
> >         p->port_role_transition_sm_state =
> >             PORT_ROLE_TRANSITION_SM_ALTERNATE_PORT_EXEC;
> >         break;
> > --
> > 1.8.1.2
> >
>
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to