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.

Regards,

Daniele


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

Reply via email to