Signed-off-by: Martin Pecka <[email protected]>
---
clock.c | 7 +++++++
pmc.c | 6 ++++++
pmc_common.c | 1 +
tlv.h | 5 +++++
util.c | 16 ++++++++++++++++
util.h | 8 ++++++++
6 files changed, 43 insertions(+)
diff --git a/clock.c b/clock.c
index bbfd1a8..cd46b06 100644
--- a/clock.c
+++ b/clock.c
@@ -346,6 +346,7 @@ static int clock_management_fill_response(struct clock *c,
struct port *p,
struct grandmaster_settings_np *gsn;
struct management_tlv_datum *mtd;
struct subscribe_events_np *sen;
+ struct servo_state_np *servo;
struct management_tlv *tlv;
struct time_status_np *tsn;
struct tlv_extra *extra;
@@ -462,6 +463,11 @@ static int clock_management_fill_response(struct clock *c,
struct port *p,
mtd->val = c->local_sync_uncertain;
datalen = sizeof(*mtd);
break;
+ case MID_SERVO_STATE_NP:
+ servo = (struct servo_state_np *) tlv->data;
+ servo->state = c->servo_state;
+ datalen = sizeof(*servo);
+ break;
default:
/* The caller should *not* respond to this message. */
tlv_extra_recycle(extra);
@@ -1524,6 +1530,7 @@ int clock_manage(struct clock *c, struct port *p, struct
ptp_message *msg)
case MID_GRANDMASTER_SETTINGS_NP:
case MID_SUBSCRIBE_EVENTS_NP:
case MID_SYNCHRONIZATION_UNCERTAIN_NP:
+ case MID_SERVO_STATE_NP:
clock_management_send_error(p, msg, MID_NOT_SUPPORTED);
break;
default:
diff --git a/pmc.c b/pmc.c
index 7916153..a3dcf44 100644
--- a/pmc.c
+++ b/pmc.c
@@ -165,6 +165,7 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
struct unicast_master_entry *ume;
struct subscribe_events_np *sen;
struct port_properties_np *ppn;
+ struct servo_state_np *servo;
struct timePropertiesDS *tp;
struct management_tlv *mgt;
struct time_status_np *tsn;
@@ -425,6 +426,11 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
fprintf(fp, "SYNCHRONIZATION_UNCERTAIN_NP "
IFMT "uncertain %hhu", mtd->val);
break;
+ case MID_SERVO_STATE_NP:
+ servo = (struct servo_state_np *) mgt->data;
+ fprintf(fp, "SERVO_STATE_NP "
+ IFMT "state %s", servo_state2str(servo->state));
+ break;
case MID_PORT_DATA_SET:
p = (struct portDS *) mgt->data;
if (p->portState > PS_SLAVE) {
diff --git a/pmc_common.c b/pmc_common.c
index 017a4f7..a2fee8b 100644
--- a/pmc_common.c
+++ b/pmc_common.c
@@ -111,6 +111,7 @@ struct management_id idtab[] = {
{ "GRANDMASTER_SETTINGS_NP", MID_GRANDMASTER_SETTINGS_NP, do_set_action
},
{ "SUBSCRIBE_EVENTS_NP", MID_SUBSCRIBE_EVENTS_NP, do_set_action },
{ "SYNCHRONIZATION_UNCERTAIN_NP", MID_SYNCHRONIZATION_UNCERTAIN_NP,
do_set_action },
+ { "SERVO_STATE_NP", MID_SERVO_STATE_NP, do_get_action },
/* Port management ID values */
{ "NULL_MANAGEMENT", MID_NULL_MANAGEMENT, null_management },
{ "CLOCK_DESCRIPTION", MID_CLOCK_DESCRIPTION, do_get_action },
diff --git a/tlv.h b/tlv.h
index 915b9fc..fe7b1f8 100644
--- a/tlv.h
+++ b/tlv.h
@@ -100,6 +100,7 @@ enum management_action {
#define MID_GRANDMASTER_SETTINGS_NP 0xC001
#define MID_SUBSCRIBE_EVENTS_NP 0xC003
#define MID_SYNCHRONIZATION_UNCERTAIN_NP 0xC006
+#define MID_SERVO_STATE_NP 0xC009
/* Port management ID values */
#define MID_NULL_MANAGEMENT 0x0000
@@ -331,6 +332,10 @@ struct port_ds_np {
Integer32 asCapable;
} PACKED;
+struct servo_state_np {
+ uint8_t state;
+} PACKED;
+
#define EVENT_BITMASK_CNT 64
diff --git a/util.c b/util.c
index a59b559..f045543 100644
--- a/util.c
+++ b/util.c
@@ -207,6 +207,22 @@ const char *ustate2str(enum unicast_state ustate)
return "???";
}
+const char *servo_state2str(enum servo_state sstate)
+{
+ switch (sstate) {
+ case SERVO_UNLOCKED:
+ return "UNLOCKED";
+ case SERVO_JUMP:
+ return "JUMP";
+ case SERVO_LOCKED:
+ return "LOCKED";
+ case SERVO_LOCKED_STABLE:
+ return "LOCKED_STABLE";
+ }
+
+ return "???";
+}
+
void posix_clock_close(clockid_t clock)
{
if (clock == CLOCK_REALTIME) {
diff --git a/util.h b/util.h
index 558a675..6e7abe4 100644
--- a/util.h
+++ b/util.h
@@ -26,6 +26,7 @@
#include "address.h"
#include "ddt.h"
#include "ether.h"
+#include "servo.h"
#include "transport.h"
#include "unicast_fsm.h"
@@ -113,6 +114,13 @@ char *portaddr2str(struct PortAddress *addr);
const char *ustate2str(enum unicast_state ustate);
+/**
+ * Convert servo state to a human readable string.
+ * @param sstate The state to show.
+ * @return The string representing the state.
+ */
+const char *servo_state2str(enum servo_state sstate);
+
/**
* Closes a dynamic posix clock.
* @param clock A clock ID obtained via posix_clock_close().
--
2.17.1
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel