Signed-off-by: Richard Cochran <richardcoch...@gmail.com>
---
 pmc.c        | 15 +++++++++++++++
 pmc_common.c | 39 ++++++++++++++++++++++++++++++++++++++-
 port.c       | 20 +++++++++++++++++++-
 tlv.c        | 20 ++++++++++++++++++++
 tlv.h        |  1 +
 5 files changed, 93 insertions(+), 2 deletions(-)

diff --git a/pmc.c b/pmc.c
index a1ee787..28d96a8 100644
--- a/pmc.c
+++ b/pmc.c
@@ -139,6 +139,7 @@ static void pmc_show_signaling(struct ptp_message *msg, 
FILE *fp)
 
 static void pmc_show(struct ptp_message *msg, FILE *fp)
 {
+       struct ieee_c37_238_settings_np *pwr;
        struct grandmaster_settings_np *gsn;
        struct mgmt_clock_description *cd;
        struct subscribe_events_np *sen;
@@ -495,6 +496,20 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
                        pcp->stats.txMsgType[SIGNALING],
                        pcp->stats.txMsgType[MANAGEMENT]);
                break;
+       case MID_POWER_PROFILE_SETTINGS_NP:
+               pwr = (struct ieee_c37_238_settings_np *) mgt->data;
+               fprintf(fp, "POWER_PROFILE_SETTINGS_NP "
+                       IFMT "version                   %hu"
+                       IFMT "grandmasterID             0x%04hx"
+                       IFMT "grandmasterTimeInaccuracy %u"
+                       IFMT "networkTimeInaccuracy     %u"
+                       IFMT "totalTimeInaccuracy       %u",
+                       pwr->version,
+                       pwr->grandmasterID,
+                       pwr->grandmasterTimeInaccuracy,
+                       pwr->networkTimeInaccuracy,
+                       pwr->totalTimeInaccuracy);
+               break;
        case MID_LOG_ANNOUNCE_INTERVAL:
                mtd = (struct management_tlv_datum *) mgt->data;
                fprintf(fp, "LOG_ANNOUNCE_INTERVAL "
diff --git a/pmc_common.c b/pmc_common.c
index 7a1dbb4..e40c3d8 100644
--- a/pmc_common.c
+++ b/pmc_common.c
@@ -28,6 +28,7 @@
 #include "tlv.h"
 #include "transport.h"
 #include "pmc_common.h"
+#include "power_profile.h"
 
 #define BAD_ACTION   -1
 #define BAD_ID       -1
@@ -130,8 +131,9 @@ struct management_id idtab[] = {
        { "DELAY_MECHANISM", MID_DELAY_MECHANISM, do_get_action },
        { "LOG_MIN_PDELAY_REQ_INTERVAL", MID_LOG_MIN_PDELAY_REQ_INTERVAL, 
do_get_action },
        { "PORT_DATA_SET_NP", MID_PORT_DATA_SET_NP, do_set_action },
-       { "PORT_STATS_NP", MID_PORT_STATS_NP, do_get_action },
        { "PORT_PROPERTIES_NP", MID_PORT_PROPERTIES_NP, do_get_action },
+       { "PORT_STATS_NP", MID_PORT_STATS_NP, do_get_action },
+       { "POWER_PROFILE_SETTINGS_NP", MID_POWER_PROFILE_SETTINGS_NP, 
do_set_action },
 };
 
 static void do_get_action(struct pmc *pmc, int action, int index, char *str)
@@ -146,6 +148,7 @@ static void do_set_action(struct pmc *pmc, int action, int 
index, char *str)
 {
        int cnt, code = idtab[index].code, freq_traceable, leap_59, leap_61,
                ptp_timescale, time_traceable, utc_off_valid;
+       struct ieee_c37_238_settings_np pwr;
        struct grandmaster_settings_np gsn;
        struct management_tlv_datum mtd;
        struct subscribe_events_np sen;
@@ -278,6 +281,37 @@ 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_POWER_PROFILE_SETTINGS_NP:
+               cnt = sscanf(str, " %*s %*s "
+                            "version                   %hu "
+                            "grandmasterID             %hx "
+                            "grandmasterTimeInaccuracy %u "
+                            "networkTimeInaccuracy     %u "
+                            "totalTimeInaccuracy       %u ",
+                            &pwr.version,
+                            &pwr.grandmasterID,
+                            &pwr.grandmasterTimeInaccuracy,
+                            &pwr.networkTimeInaccuracy,
+                            &pwr.totalTimeInaccuracy);
+               if (cnt != 5) {
+                       fprintf(stderr, "%s SET needs 5 values\n",
+                               idtab[index].name);
+                       break;
+               }
+               switch (pwr.version) {
+               case IEEE_C37_238_VERSION_NONE:
+               case IEEE_C37_238_VERSION_2011:
+               case IEEE_C37_238_VERSION_2017:
+                       pmc_send_set_action(pmc, code, &pwr, sizeof(pwr));
+                       break;
+               default:
+                       fprintf(stderr, "\nusage: set PROFILE_SETTINGS_NP 
version "
+                               "%hu (none), %hu (2011), or %hu (2017)\n\n",
+                               IEEE_C37_238_VERSION_NONE,
+                               IEEE_C37_238_VERSION_2011,
+                               IEEE_C37_238_VERSION_2017);
+               }
+               break;
        }
 }
 
@@ -531,6 +565,9 @@ static int pmc_tlv_datalen(struct pmc *pmc, int id)
        case MID_PORT_DATA_SET_NP:
                len += sizeof(struct port_ds_np);
                break;
+       case MID_POWER_PROFILE_SETTINGS_NP:
+               len += sizeof(struct ieee_c37_238_settings_np);
+               break;
        case MID_LOG_ANNOUNCE_INTERVAL:
        case MID_ANNOUNCE_RECEIPT_TIMEOUT:
        case MID_LOG_SYNC_INTERVAL:
diff --git a/port.c b/port.c
index acd142f..d204dab 100644
--- a/port.c
+++ b/port.c
@@ -833,6 +833,7 @@ static const Octet profile_id_p2p[] = {0x00, 0x1B, 0x19, 
0x00, 0x02, 0x00};
 static int port_management_fill_response(struct port *target,
                                         struct ptp_message *rsp, int id)
 {
+       struct ieee_c37_238_settings_np *pwr;
        struct mgmt_clock_description *cd;
        struct management_tlv_datum *mtd;
        struct clock_description *desc;
@@ -1006,6 +1007,11 @@ static int port_management_fill_response(struct port 
*target,
                psn->stats = target->stats;
                datalen = sizeof(*psn);
                break;
+       case MID_POWER_PROFILE_SETTINGS_NP:
+               pwr = (struct ieee_c37_238_settings_np *)tlv->data;
+               memcpy(pwr, &target->pwr, sizeof(*pwr));
+               datalen = sizeof(*pwr);
+               break;
        default:
                /* The caller should *not* respond to this message. */
                tlv_extra_recycle(extra);
@@ -1047,9 +1053,10 @@ static int port_management_set(struct port *target,
                               struct port *ingress, int id,
                               struct ptp_message *req)
 {
-       int respond = 0;
+       struct ieee_c37_238_settings_np *pwr;
        struct management_tlv *tlv;
        struct port_ds_np *pdsnp;
+       int respond = 0;
 
        tlv = (struct management_tlv *) req->management.suffix;
 
@@ -1059,6 +1066,17 @@ static int port_management_set(struct port *target,
                target->neighborPropDelayThresh = 
pdsnp->neighborPropDelayThresh;
                respond = 1;
                break;
+       case MID_POWER_PROFILE_SETTINGS_NP:
+               pwr = (struct ieee_c37_238_settings_np *) tlv->data;
+               switch (pwr->version) {
+               case IEEE_C37_238_VERSION_NONE:
+               case IEEE_C37_238_VERSION_2011:
+               case IEEE_C37_238_VERSION_2017:
+                       target->pwr = *pwr;
+                       respond = 1;
+                       break;
+               }
+               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 aadfe0a..d9d2846 100644
--- a/tlv.c
+++ b/tlv.c
@@ -114,6 +114,7 @@ static bool tlv_array_invalid(struct TLV *tlv, size_t 
base_size, size_t item_siz
 static int mgt_post_recv(struct management_tlv *m, uint16_t data_len,
                         struct tlv_extra *extra)
 {
+       struct ieee_c37_238_settings_np *pwr;
        struct grandmaster_settings_np *gsn;
        struct mgmt_clock_description *cd;
        struct subscribe_events_np *sen;
@@ -332,6 +333,16 @@ static int mgt_post_recv(struct management_tlv *m, 
uint16_t data_len,
                }
                extra_len = sizeof(struct port_stats_np);
                break;
+       case MID_POWER_PROFILE_SETTINGS_NP:
+               if (data_len < sizeof(struct ieee_c37_238_settings_np))
+                       goto bad_length;
+               pwr = (struct ieee_c37_238_settings_np *)m->data;
+               NTOHS(pwr->version);
+               NTOHS(pwr->grandmasterID);
+               NTOHL(pwr->grandmasterTimeInaccuracy);
+               NTOHL(pwr->networkTimeInaccuracy);
+               NTOHL(pwr->totalTimeInaccuracy);
+               break;
        case MID_SAVE_IN_NON_VOLATILE_STORAGE:
        case MID_RESET_NON_VOLATILE_STORAGE:
        case MID_INITIALIZE:
@@ -355,6 +366,7 @@ bad_length:
 
 static void mgt_pre_send(struct management_tlv *m, struct tlv_extra *extra)
 {
+       struct ieee_c37_238_settings_np *pwr;
        struct grandmaster_settings_np *gsn;
        struct mgmt_clock_description *cd;
        struct subscribe_events_np *sen;
@@ -449,6 +461,14 @@ static void mgt_pre_send(struct management_tlv *m, struct 
tlv_extra *extra)
                        psn->stats.txMsgType[i] = 
__cpu_to_le64(psn->stats.txMsgType[i]);
                }
                break;
+       case MID_POWER_PROFILE_SETTINGS_NP:
+               pwr = (struct ieee_c37_238_settings_np *)m->data;
+               HTONS(pwr->version);
+               HTONS(pwr->grandmasterID);
+               HTONL(pwr->grandmasterTimeInaccuracy);
+               HTONL(pwr->networkTimeInaccuracy);
+               HTONL(pwr->totalTimeInaccuracy);
+               break;
        }
 }
 
diff --git a/tlv.h b/tlv.h
index c15c49b..e7d2a2d 100644
--- a/tlv.h
+++ b/tlv.h
@@ -125,6 +125,7 @@ enum management_action {
 #define MID_PORT_DATA_SET_NP                           0xC002
 #define MID_PORT_PROPERTIES_NP                         0xC004
 #define MID_PORT_STATS_NP                              0xC005
+#define MID_POWER_PROFILE_SETTINGS_NP                  0xC007
 
 /* Management error ID values */
 #define MID_RESPONSE_TOO_BIG                           0x0001
-- 
2.20.1



_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to