Hi Richard,
On Wed, Aug 16, 2017 at 09:32:09PM +0800, Hangbin Liu wrote:
> @@ -2240,6 +2243,35 @@ static void port_link_status(void *ctx, int linkup, 
> int ts_index)
>               pr_notice("port %hu: link %s", portnum(p), linkup ? "up" : 
> "down");
>       }
>  
> +     /* ts_label changed */
> +     if (if_indextoname(ts_index, ts_label) && strcmp(p->iface->ts_label, 
> ts_label)) {
> +             strncpy(p->iface->ts_label, ts_label, MAX_IFNAME_SIZE);
> +             sk_get_ts_info(p->iface->ts_label, &p->iface->ts_info);
> +
> +             p->link_status |= TS_LABEL_CHANGED;
> +             pr_notice("port %hu: ts label changed to %s", portnum(p), 
> ts_label);
> +     }
> +
> +     /* We set the link status to down by force if its timestamp not
> +      * support required mode. But the link's status is actually up.
> +      *
> +      * So the next time we receive this link's rtnl message, we need
> +      * to check the required_modes again. If still not support
> +      * required_modes, then keep the link status down.
> +      */
> +     if (p->iface->ts_info.valid) {
> +             required_modes = clock_required_modes(p->clock);
> +             if ((p->iface->ts_info.so_timestamping & required_modes) != 
> required_modes) {
> +                     pr_err("interface '%s' does not support requested "
> +                            "timestamping mode, set link status down by 
> force.",
> +                            p->iface->ts_label);
> +                     p->link_status = LINK_DOWN | LINK_STATE_CHANGED;
> +             } else if (p->link_status & TS_LABEL_CHANGED) {
> +                     p->phc_index = p->iface->ts_info.phc_index;
> +                     clock_switch_phc(p->clock, p->phc_index);
> +             }
> +     }
> +

FYI, I will changed this part with new version like:

+       /* ts_label changed */
+       if (if_indextoname(ts_index, ts_label) && strcmp(p->iface->ts_label, 
ts_label)) {
+               strncpy(p->iface->ts_label, ts_label, MAX_IFNAME_SIZE);
+               p->link_status |= TS_LABEL_CHANGED;
+               pr_notice("port %hu: ts label changed to %s", portnum(p), 
ts_label);
+       }
+
+       /* Both link down/up and change ts_label may change phc index. */
+       if (p->link_status & LINK_UP &&
+           (p->link_status & LINK_STATE_CHANGED || p->link_status & 
TS_LABEL_CHANGED)) {
+               sk_get_ts_info(p->iface->ts_label, &p->iface->ts_info);
+
+               if (p->iface->ts_info.valid) {
+                       required_modes = clock_required_modes(p->clock);
+                       if ((p->iface->ts_info.so_timestamping & 
required_modes) != required_modes) {
+                               pr_err("interface '%s' does not support 
requested "
+                                      "timestamping mode, set link status down 
by force.",
+                                      p->iface->ts_label);
+                               p->link_status = LINK_DOWN | LINK_STATE_CHANGED;
+                       } else if (p->phc_index != p->iface->ts_info.phc_index) 
{
+                               p->phc_index = p->iface->ts_info.phc_index;
+
+                               if (clock_switch_phc(p->clock, p->phc_index)) {
+                                       p->last_fault_type = FT_SWITCH_PHC;
+                                       port_dispatch(p, EV_FAULT_DETECTED, 0);
+                                       return;
+                               }
+                               clock_sync_interval(p->clock, 
p->log_sync_interval);
+                       }
+               }
+       }
+

Thanks
Hangbin

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to