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