Pushed, thanks! Jarno
On Nov 13, 2014, at 4:20 PM, Jarno Rajahalme <jrajaha...@nicira.com> wrote: > Acked-by: Jarno Rajahalme <jrajaha...@nicira.com> > > Thanks! > > Jarno > > On Nov 6, 2014, at 7:31 AM, Daniele Venturino <daniele.ventur...@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.ventur...@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 >> > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev