On Wed, 24 Aug 2022 at 12:37, SyncMonk Technologies <servi...@syncmonk.net>
wrote:

> adding TLV support for PORT_PTSF_UNUSABLE
>

You already add MID_PORT_PTSF_DATA_NP.
Why do we need 2 management TLV messages?
Can't the user calculate the unstable state from data?


> Signed-off-by: Greg Armstrong <greg.armstrong...@renesas.com>
> Signed-off-by: Leon Goldin <leon.goldin...@renesas.com>
> Signed-off-by: Devasish Dey <devasish....@syncmonk.net>
> Signed-off-by: Vipin Sharma <vipin.sha...@syncmonk.net>
> ---
>  pmc.c        |  6 ++++++
>  pmc_common.c | 23 +++++++++++++++++++++++
>  port.c       | 23 +++++++++++++++++++++++
>  tlv.c        | 12 ++++++++++++
>  tlv.h        |  6 ++++++
>  5 files changed, 70 insertions(+)
>
> diff --git a/pmc.c b/pmc.c
> index 34c9609..35300b4 100644
> --- a/pmc.c
> +++ b/pmc.c
> @@ -176,6 +176,7 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
>         struct currentDS *cds;
>         struct parentDS *pds;
>         struct portDS *p;
> +       struct port_ptsf_unusable_np *ptsf;
>         struct port_ptsf_data_np *ptsf_data;
>         struct TLV *tlv;
>         uint8_t *buf;
> @@ -608,6 +609,11 @@ static void pmc_show(struct ptp_message *msg, FILE
> *fp)
>                 fprintf(fp, "LOG_MIN_PDELAY_REQ_INTERVAL "
>                         IFMT "logMinPdelayReqInterval %hhd", mtd->val);
>                 break;
> +       case MID_PORT_PTSF_UNUSABLE_NP:
> +               ptsf = (struct port_ptsf_unusable_np *) mgt->data;
> +               fprintf(fp, "PORT_PTSF_UNUSABLE_NP "
> +                       IFMT "unusable %hu", ptsf->ptsf_unusable);
> +               break;
>         case MID_PORT_PTSF_DATA_NP:
>                 ptsf_data = (struct port_ptsf_data_np *) mgt->data;
>                 fprintf(fp, "PORT_PTSF_DATA_NP "
> diff --git a/pmc_common.c b/pmc_common.c
> index 9570841..528bd43 100644
> --- a/pmc_common.c
> +++ b/pmc_common.c
> @@ -154,6 +154,7 @@ struct management_id idtab[] = {
>         { "PORT_SERVICE_STATS_NP", MID_PORT_SERVICE_STATS_NP,
> do_get_action },
>         { "UNICAST_MASTER_TABLE_NP", MID_UNICAST_MASTER_TABLE_NP,
> do_get_action },
>         { "PORT_HWCLOCK_NP", MID_PORT_HWCLOCK_NP, do_get_action },
> +       { "PORT_PTSF_UNUSABLE_NP", MID_PORT_PTSF_UNUSABLE_NP,
> do_set_action },
>         { "PORT_PTSF_DATA_NP", MID_PORT_PTSF_DATA_NP, do_get_action },
>  };
>
> @@ -173,6 +174,7 @@ static void do_set_action(struct pmc *pmc, int action,
> int index, char *str)
>         struct management_tlv_datum mtd;
>         struct subscribe_events_np sen;
>         struct port_ds_np pnp;
> +       struct port_ptsf_unusable_np ptsf;
>         char onoff_port_state[4] = "off";
>         char onoff_time_status[4] = "off";
>
> @@ -303,6 +305,27 @@ static void do_set_action(struct pmc *pmc, int
> action, int index, char *str)
>                 }
>                 pmc_send_set_action(pmc, code, &pnp, sizeof(pnp));
>                 break;
> +       case MID_PORT_PTSF_UNUSABLE_NP:
> +               cnt = sscanf(str, " %*s %*s %hu %hu",
> +                            &ptsf.ptsf_unusable,
> +                            &ptsf.portIdentity.portNumber);
> +               if (cnt != 2) {
> +                       fprintf(stderr, "%s SET needs 2 value\n",
> +                               idtab[index].name);
> +                       break;
> +               }
> +               switch (ptsf.ptsf_unusable) {
> +               case TRUE:
> +               case FALSE:
> +                       pmc_send_set_action(pmc, code, &ptsf,
> sizeof(ptsf));
> +                       break;
> +               default:
> +                       fprintf(stderr, "\nusage:"
> +                               "set PORT_PTSF_UNUSABLE_NP%hhu (false) or"
> +                               "%hhu (true) \n\n",
> +                               FALSE, TRUE);
> +               }
> +               break;
>         }
>  }
>
> diff --git a/port.c b/port.c
> index ff00e46..d0997f8 100644
> --- a/port.c
> +++ b/port.c
> @@ -852,6 +852,7 @@ static int port_management_fill_response(struct port
> *target,
>         struct PortIdentity pid;
>         const char *ts_label;
>         struct portDS *pds;
> +       struct port_ptsf_unusable_np *ptsf;
>         struct port_ptsf_data_np *ptsf_data;
>         uint16_t u16;
>         uint8_t *buf;
> @@ -1075,6 +1076,13 @@ static int port_management_fill_response(struct
> port *target,
>                         PORT_HWCLOCK_VCLOCK : 0;
>                 datalen = sizeof(*phn);
>                 break;
> +       case MID_PORT_PTSF_UNUSABLE_NP:
> +               ptsf = (struct port_ptsf_unusable_np *)tlv->data;
> +               ptsf->portIdentity = target->portIdentity;
> +               ptsf->ptsf_unusable =
> +                       (target->signalFail & PDS_PTSF_UNUSABLE) ? 1 : 0;
> +               datalen = sizeof(*ptsf);
> +               break;
>         case MID_PORT_PTSF_DATA_NP:
>                 ptsf_data = (struct port_ptsf_data_np *)tlv->data;
>                 ptsf_data->portIdentity = target->portIdentity;
> @@ -1125,6 +1133,8 @@ static int port_management_set(struct port *target,
>         int respond = 0;
>         struct management_tlv *tlv;
>         struct port_ds_np *pdsnp;
> +       struct port_ptsf_unusable_np *ptsf;
> +       UInteger16 signalFail;
>
>         tlv = (struct management_tlv *) req->management.suffix;
>
> @@ -1134,6 +1144,19 @@ static int port_management_set(struct port *target,
>                 target->neighborPropDelayThresh =
> pdsnp->neighborPropDelayThresh;
>                 respond = 1;
>                 break;
> +       case MID_PORT_PTSF_UNUSABLE_NP:
> +               ptsf = (struct port_ptsf_unusable_np *) tlv->data;
> +               signalFail = target->signalFail;
> +               if (ptsf->portIdentity.portNumber ==
> target->portIdentity.portNumber) {
> +                       if (ptsf->ptsf_unusable)
> +                               target->signalFail |= PDS_PTSF_UNUSABLE;
> +                       else
> +                               target->signalFail &= ~PDS_PTSF_UNUSABLE;
> +               }
> +               if (signalFail != target->signalFail)
> +                       clock_set_sde(target->clock, 1);
> +               respond = 1;
> +               break;
>         }
>         if (respond && !port_management_get_response(target, ingress, id,
> req))
>                 pr_err("%s: failed to send management set response",
> target->log_name);
> diff --git a/tlv.c b/tlv.c
> index 745c96a..2cfd61b 100644
> --- a/tlv.c
> +++ b/tlv.c
> @@ -130,6 +130,7 @@ static int mgt_post_recv(struct management_tlv *m,
> uint16_t data_len,
>         struct defaultDS *dds;
>         struct parentDS *pds;
>         struct portDS *p;
> +       struct port_ptsf_unusable_np *ptsf;
>         struct port_ptsf_data_np *ptsf_data;
>         uint8_t *buf;
>         uint16_t u16;
> @@ -408,6 +409,12 @@ static int mgt_post_recv(struct management_tlv *m,
> uint16_t data_len,
>                 if (data_len != 0)
>                         goto bad_length;
>                 break;
> +       case MID_PORT_PTSF_UNUSABLE_NP:
> +               if (data_len != sizeof(struct port_ptsf_unusable_np))
> +                       goto bad_length;
> +               ptsf = (struct port_ptsf_unusable_np *) m->data;
> +               ptsf->ptsf_unusable = ntohs(ptsf->ptsf_unusable);
> +               break;
>         case MID_PORT_PTSF_DATA_NP:
>                 ptsf_data = (struct port_ptsf_data_np *) m->data;
>                 ptsf_data->portIdentity.portNumber =
> ntohs(ptsf_data->portIdentity.portNumber);
> @@ -442,6 +449,7 @@ static void mgt_pre_send(struct management_tlv *m,
> struct tlv_extra *extra)
>         struct currentDS *cds;
>         struct parentDS *pds;
>         struct portDS *p;
> +       struct port_ptsf_unusable_np *ptsf;
>         struct port_ptsf_data_np *ptsf_data;
>         uint8_t *buf;
>         int i;
> @@ -575,6 +583,10 @@ static void mgt_pre_send(struct management_tlv *m,
> struct tlv_extra *extra)
>                 phn->portIdentity.portNumber =
> htons(phn->portIdentity.portNumber);
>                 phn->phc_index = htonl(phn->phc_index);
>                 break;
> +       case MID_PORT_PTSF_UNUSABLE_NP:
> +               ptsf = (struct port_ptsf_unusable_np *) m->data;
> +               ptsf->ptsf_unusable = htons(ptsf->ptsf_unusable);
> +               break;
>         case MID_PORT_PTSF_DATA_NP:
>                 ptsf_data = (struct port_ptsf_data_np *) m->data;
>                 ptsf_data->portIdentity.portNumber =
> diff --git a/tlv.h b/tlv.h
> index c29f5f2..36e9993 100644
> --- a/tlv.h
> +++ b/tlv.h
> @@ -129,6 +129,7 @@ enum management_action {
>  #define MID_UNICAST_MASTER_TABLE_NP                    0xC008
>  #define MID_PORT_HWCLOCK_NP                            0xC009
>  #define MID_PORT_PTSF_DATA_NP                          0xC00A
> +#define MID_PORT_PTSF_UNUSABLE_NP                      0xC00B
>
>  /* Management error ID values */
>  #define MID_RESPONSE_TOO_BIG                           0x0001
> @@ -368,6 +369,11 @@ struct port_service_stats_np {
>         struct PortServiceStats stats;
>  } PACKED;
>
> +struct port_ptsf_unusable_np {
> +       struct PortIdentity portIdentity;
> +       UInteger16 ptsf_unusable;
> +} PACKED;
> +
>  struct port_ptsf_data_np {
>         struct PortIdentity portIdentity;
>         UInteger8 signalFail;
> --
> 2.25.1
>
>
>
> _______________________________________________
> Linuxptp-devel mailing list
> Linuxptp-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linuxptp-devel
>
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to