After some testing, here’s my ack.

Acked-by: Daniele Venturino <daniele.ventur...@m3s.it

Il giorno 20/set/2014, alle ore 02:11, Jarno Rajahalme <jrajaha...@nicira.com> 
ha scritto:

> 
> 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