On Sep 19, 2014, at 8:26 AM, Daniele Venturino <daniele.ventur...@m3s.it> wrote:

> 
> Il giorno 11/set/2014, alle ore 19:09, Jarno Rajahalme 
> <jrajaha...@nicira.com> ha scritto:
> 
>> 
>> On Sep 11, 2014, at 5:49 AM, Daniele Venturino <daniele.ventur...@m3s.it> 
>> wrote:
>> 
>>> 
>>> Il giorno 09/set/2014, alle ore 22:04, Daniele Venturino 
>>> <daniele.ventur...@m3s.it> ha scritto:
>>> 
>>>> 
>>>> Il giorno 09/set/2014, alle ore 20:07, Jarno Rajahalme 
>>>> <jrajaha...@nicira.com> ha scritto:
>>>> 
>>>>> 
>>>>> On Sep 9, 2014, at 3:53 AM, Daniele Venturino 
>>>>> <venturino.dani...@gmail.com> wrote:
>>>>> 
>>>>>> 
>>>>>> Thanks for the review!
>>>>>> It would be nice to have an Acked-by from you to the series. However, I 
>>>>>> plan to squash trivial CodingStyle fixes in before pushing the series to 
>>>>>> master. Also, I’ll add a News item stating that experimental RSTP is 
>>>>>> added, and more compliance and interoperability testing is needed.
>>>>>> Responses below,
>>>>>>   Jarno
>>>>>> 
>>>>>> Ok. I sent my acks.
>>>>> 
>>>>> Thanks!
>>>>> 
>>>>>> 
>>>>>> I did some minor changes from June to August, that you can see here: 
>>>>>> https://github.com/M3S/ovs-rstp/compare/b946221...c910081
>>>>>> 
>>>>>> About the compliance and interoperability testing, I've been working 
>>>>>> with an IXIA validation software for a couple of weeks now, and I 
>>>>>> already have some patches.
>>>>>> I'm still solving some problems and I expect to have some more fixes. 
>>>>>> This should take a couple of weeks to obtain a compliant version, so 
>>>>>> maybe it would be better to wait for a compliant version of the protocol 
>>>>>> before merging it to the master. Anyway, if you still want to merge it 
>>>>>> and mark it as experimental is still fine by me, since I'll be able to 
>>>>>> rebase my patches on your version.
>>>>>> 
>>>>> 
>>>>> Nice to hear about the IXIA validation work. I’ll merge the series to 
>>>>> master soon, so that we have less different versions around.
>>>> 
>>>> Thanks to you for your reviews! I’ll let you have my other patches soon.
>>>> 
>>>>> 
>>>>>> 
>>>>>> On Sep 3, 2014, at 7:44 AM, Daniele Venturino 
>>>>>> <venturino.dani...@gmail.com> wrote:
>>>>>> I looked and applied the patches. They’re good to me, I just have some 
>>>>>> notes on patch 13/18 and 16/18.
>>>>>> 
>>>>> 
>>>>> (snip)
>>>>> 
>>>>>> +    rstp_set_bridge_ageing_time__(rstp, RSTP_DEFAULT_AGEING_TIME);
>>>>>> +    rstp_set_bridge_forward_delay__(rstp, 
>>>>>> RSTP_DEFAULT_BRIDGE_FORWARD_DELAY);
>>>>>> +    rstp_set_bridge_hello_time__(rstp);
>>>>>> +    rstp_set_bridge_max_age__(rstp, RSTP_DEFAULT_BRIDGE_MAX_AGE);
>>>>>> +    rstp_set_bridge_migrate_time__(rstp);
>>>>>> +    rstp_set_bridge_transmit_hold_count__(rstp,
>>>>>> +                                          
>>>>>> RSTP_DEFAULT_TRANSMIT_HOLD_COUNT);
>>>>>> +    rstp_set_bridge_times__(rstp, RSTP_DEFAULT_BRIDGE_FORWARD_DELAY,
>>>>>> +                            RSTP_BRIDGE_HELLO_TIME,
>>>>>> +                            RSTP_DEFAULT_BRIDGE_MAX_AGE, 0);
>>>>>> 
>>>>>> These setters are the same in rstp_create() and reinitialize_rstp__(). 
>>>>>> We could define a funcion like rstp_initialize_port_defaults__() for the 
>>>>>> bridge.
>>>>>>  
>>>>>> I will look into this.
>>>>> 
>>>>> Later.
>>>>> 
>>>>> (snip)
>>>>> 
>>>>>>  xlate_xport_set(struct xport *xport, odp_port_t odp_port,
>>>>>>                  const struct netdev *netdev, const struct cfm *cfm,
>>>>>> -                const struct bfd *bfd, int stp_port_no, int 
>>>>>> rstp_port_no,
>>>>>> +                const struct bfd *bfd, int stp_port_no,
>>>>>> +                const struct rstp_port* rstp_port,
>>>>>>                  enum ofputil_port_config config, enum 
>>>>>> ofputil_port_state state,
>>>>>>                  bool is_tunnel, bool may_enable)
>>>>>>  {
>>>>>>      xport->config = config;
>>>>>>      xport->state = state;
>>>>>>      xport->stp_port_no = stp_port_no;
>>>>>> -    xport->rstp_port_no = rstp_port_no;
>>>>>> I get a segfault when removing a port from a bridge. I don't if I add 
>>>>>> here this line:
>>>>>> xport->rstp_port = rstp_port;
>>>>>> 
>>>>>> I don’t seem to be able to reproduce the segfault. I tried this by 
>>>>>> adding ovs-vsctl del-br and del-port commands to the new test cases, and 
>>>>>> they succeed just fine.
>>>>>> The code right below will set the rstp_port member, if the new value is 
>>>>>> different from the old value. So all the line you added above does is 
>>>>>> circumvent the unref of the old pointer, and the ref of the new pointer. 
>>>>>> I see that I missed the unref in xlate_xport_remove():
>>>>>> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
>>>>>> index dd9536c..425b171 100644
>>>>>> --- a/ofproto/ofproto-dpif-xlate.c
>>>>>> +++ b/ofproto/ofproto-dpif-xlate.c
>>>>>> @@ -932,6 +932,7 @@ xlate_xport_remove(struct xlate_cfg *xcfg, struct 
>>>>>> xport *xport)
>>>>>>      hmap_remove(&xport->xbridge->xports, &xport->ofp_node);
>>>>>>  
>>>>>>      netdev_close(xport->netdev);
>>>>>> +    rstp_port_unref(xport->rstp_port);
>>>>>>      cfm_unref(xport->cfm);
>>>>>>      bfd_unref(xport->bfd);
>>>>>>      free(xport);
>>>>>> Could you check if this resolves the segfault you get?
>>>>>> 
>>>>>> It appears to be solved.
>>>>> 
>>>>> Good :-)
>>>>> 
>>>>>>  
>>>>>>> @@ -108,9 +121,9 @@  process_received_bpdu(struct rstp_port *p, const 
>>>>>>> void *bpdu, size_t bpdu_size)
>>>>>>>         /* Each RSTP port poits back to struct rstp without holding a
>>>>>>>  +    rstp_set_bridge_priority__(rstp, RSTP_DEFAULT_PRIORITY);
>>>>>>> +static void
>>>>>>> static void
>>>>>>> 
>>>>>>> 
>>>>>>>      xport->may_enable = may_enable;
>>>>>>>      xport->odp_port = odp_port;
>>>>>>> +    if (xport->rstp_port != rstp_port) {
>>>>>>> +        rstp_port_unref(xport->rstp_port);
>>>>>>> +        xport->rstp_port = rstp_port_ref(rstp_port);
>>>>>>> +    }
>>>>>>> @@ -3133,16 +3088,15 @@  port_run(struct ofport_dpif *ofport)
>>>>>>>      if (ofport->may_enable != enable) {
>>>>>>>          struct ofproto_dpif *ofproto = 
>>>>>>> ofproto_dpif_cast(ofport->up.ofproto);
>>>>>>> -        ofproto->backer->need_revalidate = REV_PORT_TOGGLED;
>>>>>>> -    }
>>>>>>> -    ofport->may_enable = enable;
>>>>>>> +        ofproto->backer->need_revalidate = REV_PORT_TOGGLED;
>>>>>>> -    if (ofport->rstp_port) {
>>>>>>> -        if (rstp_port_get_mac_operational(ofport->rstp_port) != 
>>>>>>> enable) {
>>>>>>> +        if (ofport->rstp_port) {
>>>>>>>              rstp_port_set_mac_operational(ofport->rstp_port, enable);
>>>>>>>          }
>>>>>>>      }
>>>>>>> +
>>>>>>> +    ofport->may_enable = enable;
>>>>>>>  }
>>>>>>> rstp_port_set_mac_operational(ofport->rstp_port, enable) should be 
>>>>>>> outside  if (ofport->may_enable != enable) otherwise ports remain 
>>>>>>> disabled when added.
>>>>>>> I decided to initialize the of port->may_enable to false instead.
>>>>>>>      xport->is_tunnel = is_tunnel;
>>>>>> 
>>>>>> I applied this and have the impression that this is ok if ports are 
>>>>>> added to a bridge after rstp is turned on. Otherwise, if a bridge 
>>>>>> already has some ports and rstp is enabled, ports remain disabled.
>>>>> 
>>>>> I changed the test case at the end of tests/rstp.at to exercise this, and 
>>>>> could not see what you expected. Maybe you check this out when the code 
>>>>> is merged to master?
>>>> 
>>>> I’ll test the merged version as soon as I can.
>>> 
>>> I still have this problem with the merged version. If a bridge has already 
>>> some ports and I enable rstp, those ports remain in ROLE_DISABLED.
>>> My guess is that when I enable rstp ofport->may_enable and enable have the 
>>> same value, so rstp_port_set_mac_operational() is not executed.
>>> 
>>> Maybe the tests in tests/rstp.at don’t show this behavior because they use 
>>> dummy interfaces?
>>> 
>> 
>> It would be really nice if you could modify the rstp.at to show this 
>> behavior. Dummy interfaces are special in that they start up as admin down, 
>> but they forward packets anyway. RSTP explicitly asks for the carrier 
>> status, so the dummy interface status must be changed for RSTP to work on 
>> them.
> 
> 
> 
>> #                                                                            
>>   
>> # Turn RSTP on in br1 after the ports have been added.                       
>>   
>> #                                                                            
>>   
>> AT_CHECK([ovs-vsctl set bridge br1 rstp_enable=true])  
> 
> I see you already enable RSTP after adding some ports in rstp.at.
> 
>> 
>> You could also test if this helps:
>> 
>> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
>> index d3e527a..d3973e5 100644
>> --- a/ofproto/ofproto-dpif.c
>> +++ b/ofproto/ofproto-dpif.c
>> @@ -2386,6 +2386,8 @@ set_rstp_port(struct ofport *ofport_,
>>      rstp_port_set(rp, s->port_num, s->priority, s->path_cost,
>>                    s->admin_edge_port, s->auto_edge, s->mcheck, ofport);
>>      update_rstp_port_state(ofport);
>> +    /* Synchronize operational status. */
>> +    rstp_port_set_mac_operational(rp, ofport->may_enable);
>>  }
>>  
>>  static void
> 
> This helps, physical interfaces are no longer blocked in role disabled if 
> RSTP is enabled after they are added to a bridge.
> I’ll test this more thoroughly soon.
> 

I’ll merge this when I get your “Acked-by:”,

  Jarno

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

Reply via email to