[ovs-dev] [PATCH 16/17] rstp-state-machines: fix proposal reception behaviour.

Jarno Rajahalme jrajahalme at nicira.com
Fri Nov 14 00:20:17 UTC 2014


Acked-by: Jarno Rajahalme <jrajahalme at nicira.com>

Thanks!

  Jarno

On Nov 6, 2014, at 7:31 AM, Daniele Venturino <daniele.venturino at m3s.it> wrote:

>      Other ports should stop forwarding and learning when a port receives a
>      superior BPDU carrying a Proposal flag.
>      Without this patch this does not happen and other ports keep executing
>      the learning and forwarding processes.
>      This patch contains some fixes reported in the 802.1q-2008 standard.
> 
> Signed-off-by: Daniele Venturino <daniele.venturino at m3s.it>
> ---
> lib/rstp-state-machines.c | 27 +++++++++++++++++++++++++--
> 1 file changed, 25 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/rstp-state-machines.c b/lib/rstp-state-machines.c
> index dc25b00..31909a5 100644
> --- a/lib/rstp-state-machines.c
> +++ b/lib/rstp-state-machines.c
> @@ -754,8 +754,11 @@ record_dispute(struct rstp_port *p)
>     OVS_REQUIRES(rstp_mutex)
> {
>     if ((p->received_bpdu_buffer.flags & BPDU_FLAG_LEARNING) != 0) {
> -        p->agreed = true;
> -        p->proposing = false;
> +        /* 802.1D-2004 says to set the agreed flag and to clear the proposing
> +         * flag. 802.1q-2008 instead says to set the disputed variable and to
> +         * clear the agreed variable. */
> +        p->disputed = true;
> +        p->agreed = false;
>     }
> }
> 
> @@ -1133,6 +1136,7 @@ port_information_sm(struct rstp_port *p)
> {
>     enum port_information_state_machine old_state;
>     struct rstp *r;
> +    struct rstp_port *p1;
> 
>     old_state = p->port_information_sm_state;
>     r = p->rstp;
> @@ -1236,6 +1240,18 @@ port_information_sm(struct rstp_port *p)
>         }
>         switch (p->rcvd_info) {
>         case SUPERIOR_DESIGNATED_INFO:
> +            /* 802.1q-2008 has a checkBPDUConsistency() function, called on a
> +             * BPDU reception. checkBPDUConsistency() clears the agreed
> +             * variable if the received message priority vector is superior to
> +             * the port priority vector, the BPDU is an ST BPDU or an RST BPDU,
> +             * its port role is Designated and its Learning flag is set. */
> +            if ((p->received_bpdu_buffer.flags & BPDU_FLAG_LEARNING) != 0) {
> +                HMAP_FOR_EACH (p1, node, &r->ports) {
> +                    if (p1->port_number != p->port_number) {
> +                        p1->agreed = false;
> +                    }
> +                }
> +            }
>             p->port_information_sm_state =
>                 PORT_INFORMATION_SM_SUPERIOR_DESIGNATED_EXEC;
>             break;
> @@ -1301,6 +1317,9 @@ port_information_sm(struct rstp_port *p)
>     case PORT_INFORMATION_SM_REPEATED_DESIGNATED_EXEC:
>         record_proposal(p);
>         set_tc_flags(p);
> +        /* This record_agreement() is missing in 802.1D-2004, but it's present
> +         * in 802.1q-2008. */
> +        record_agreement(p);
>         updt_rcvd_info_while(p);
>         p->rcvd_msg = false;
>         p->port_information_sm_state = PORT_INFORMATION_SM_REPEATED_DESIGNATED;
> @@ -1319,6 +1338,10 @@ port_information_sm(struct rstp_port *p)
>         set_tc_flags(p);
>         /* RECEIVED is not specified in Standard 802.1D-2004. */
>         p->agree = p->agree && better_or_same_info(p, RECEIVED);
> +        /* This record_agreement() and the synced assignment are  missing in
> +         * 802.1D-2004, but they're present in 802.1q-2008. */
> +        record_agreement(p);
> +        p->synced = p->synced && p->agreed;
>         record_priority(p);
>         record_times(p);
>         updt_rcvd_info_while(p);
> -- 
> 1.8.1.2
> 




More information about the dev mailing list