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? Daniele _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev