> On Sep 28, 2015, at 9:13 PM, Ben Pfaff <b...@nicira.com> wrote:
> 
> On Wed, Sep 23, 2015 at 11:31:31AM +0000, Daniel Swahn wrote:
>> (gdb) frame 0
>> #0  0x00000000004291ca in rstp_run (ofproto=<optimized out>, 
>> ofproto=<optimized out>) at ofproto/ofproto-dpif.c:2278
>> 2278                bundle_move(((struct ofport_dpif 
>> *)rstp_get_old_root_aux(ofproto->rstp))->bundle,
> 
> Thanks for the report.
> 
> Jarno and Daniele, the code around line 2278 in v2.4.0 is this:
> 
>        if (rstp_shift_root_learned_address(ofproto->rstp)) {
>            bundle_move(((struct ofport_dpif 
> *)rstp_get_old_root_aux(ofproto->rstp))->bundle,
>                        ((struct ofport_dpif 
> *)rstp_get_new_root_aux(ofproto->rstp))->bundle);
>            rstp_reset_root_changed(ofproto->rstp);
>        }
> 
> Looking at lib/rstp*.[ch], I see some code that sets 'old_root_aux' and
> 'new_root_aux'.  I don't see any code that clears them or updates them
> if something happens to invalidate them (that is, if a port gets deleted
> or if its aux gets updated).  I suspect that this may be the problem
> here.
> 
> Jarno or Daniele, can you confirm this?

I looked into this, and it may be that we fail to move the RSTP state machine 
when removing a port. In rstp_port_unref(), we are setting the port state to 
RSTP_DISABLED, but are then removing and freeing the port without triggering 
any change in the RSTP state machine, so if this port was the root, the root 
aux would still point to the deleted ofport.

Maybe this would help:

Attachment: 0001-rstp-Properly-disable-an-RSTP-port-before-deleting-i.patch
Description: Binary data


However, it seems curious that the code in rstp_run() is executed at all, as 
RSTP is not configured so ofproto->rest should be NULL, and no RSTP code should 
be run?

  Jarno
_______________________________________________
discuss mailing list
discuss@openvswitch.org
http://openvswitch.org/mailman/listinfo/discuss

Reply via email to