On Fri, Dec 02, 2022 at 03:33:42PM -0500, [email protected] 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
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel