On Thu, Dec 08, 2022 at 10:36:57AM EST, Richard Cochran wrote: >On Fri, Dec 02, 2022 at 03:33:42PM -0500, vincent.cheng...@renesas.com wrote: > >> @@ -2015,6 +2027,8 @@ static void handle_state_decision_event(struct clock >> *c) >> c->best = best; >> c->best_id = best_id; >> >> + clock_update_parent_identity(c); > >Calling this unconditionally, regardless of port state transitions, >will update the parentPortIdentity incorrectly in some cases. > >According the 1588, the update should only occur when a port enters >one of two specific states. > >> LIST_FOREACH(piter, &c->ports, list) { >> enum port_state ps; >> enum fsm_event event; > >Let me suggest another way that avoids the incorrect >parentPortIdentity update: > >In port_state_update() don't call unicast_client_state_changed(). > >Instead, set a flag in the port that means "unicast state dirty". > > 3417 int port_state_update(struct port *p, enum fsm_event event, int mdiff) > 3418 { > ... > 3447 if (mdiff) { > 3448 - unicast_client_state_changed(p); > + p->unicast_state_dirty = true; > 3449 } > 3450 if (next != p->state) { > 3451 port_show_transition(p, next, event); > 3452 p->state = next; > 3453 port_notify_event(p, NOTIFY_PORT_STATE); > 3454 - unicast_client_state_changed(p); > + p->unicast_state_dirty = true; > 3455 return 1; > 3456 } > >Then, in handle_state_decision_event(), after the big >LIST_FOREACH(piter, &c->ports, list) loop, iterate once again over the >ports: > > LIST_FOREACH(piter, &c->ports, list) { > port_update_unicast_state(piter); > } > >where port_update_unicast_state() calls unicast_client_state_changed() >and clears the flag. > >Thanks, >Richard
Thank-you for the feedback. Implemented above suggestions in PATCH v2. Thanks, Vincent _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel