adding TLV support for PORT_PTSF_UNUSABLE
Signed-off-by: Greg Armstrong <[email protected]>
Signed-off-by: Leon Goldin <[email protected]>
Signed-off-by: Devasish Dey <[email protected]>
Signed-off-by: Vipin Sharma <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel