adding TLV support for PORT_PTSF_UNUSABLE 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