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

diff --git a/pmc.c b/pmc.c
index e218ca4..793a790 100644
--- a/pmc.c
+++ b/pmc.c
@@ -157,6 +157,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 unicast_master_table_np *umtn;
        struct grandmaster_settings_np *gsn;
        struct port_service_stats_np *pssp;
@@ -572,6 +573,20 @@ static void pmc_show(struct ptp_message *msg, FILE *fp)
                        phn->phc_index,
                        phn->flags);
                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 1dd89f6..bb7d087 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
@@ -154,6 +155,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 },
+       { "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)
@@ -168,6 +170,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;
@@ -302,6 +305,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;
        }
 }
 
@@ -573,6 +607,9 @@ static int pmc_tlv_datalen(struct pmc *pmc, int id)
        case MID_PORT_HWCLOCK_NP:
                len += sizeof(struct port_hwclock_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 23697a5..f2aabfb 100644
--- a/port.c
+++ b/port.c
@@ -877,6 +877,7 @@ static const Octet profile_id_8275_2[] = {0x00, 0x19, 0xA7, 
0x02, 0x01, 0x02};
 static int port_management_fill_response(struct port *target,
                                         struct ptp_message *rsp, int id)
 {
+       struct ieee_c37_238_settings_np *pwr;
        struct unicast_master_table_np *umtn;
        struct unicast_master_address *ucma;
        struct port_service_stats_np *pssn;
@@ -1123,6 +1124,11 @@ static int port_management_fill_response(struct port 
*target,
                        PORT_HWCLOCK_VCLOCK : 0;
                datalen = sizeof(*phn);
                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);
@@ -1164,9 +1170,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;
 
@@ -1176,6 +1183,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 fb807e8..66d797a 100644
--- a/tlv.c
+++ b/tlv.c
@@ -115,6 +115,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 unicast_master_table_np *umtn;
        struct grandmaster_settings_np *gsn;
        struct port_service_stats_np *pssn;
@@ -400,6 +401,16 @@ static int mgt_post_recv(struct management_tlv *m, 
uint16_t data_len,
                phn->phc_index = ntohl(phn->phc_index);
                extra_len = sizeof(struct port_hwclock_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:
@@ -423,6 +434,7 @@ bad_length:
 
 static void mgt_pre_send(struct management_tlv *m, struct tlv_extra *extra)
 {
+       struct ieee_c37_238_settings_np *pwr;
        struct unicast_master_table_np *umtn;
        struct grandmaster_settings_np *gsn;
        struct port_service_stats_np *pssn;
@@ -571,6 +583,14 @@ 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_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 b973295..a08c74a 100644
--- a/tlv.h
+++ b/tlv.h
@@ -128,6 +128,7 @@ enum management_action {
 #define MID_PORT_SERVICE_STATS_NP                      0xC007
 #define MID_UNICAST_MASTER_TABLE_NP                    0xC008
 #define MID_PORT_HWCLOCK_NP                            0xC009
+#define MID_POWER_PROFILE_SETTINGS_NP                  0xC00A
 
 /* Management error ID values */
 #define MID_RESPONSE_TOO_BIG                           0x0001
-- 
2.30.2



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

Reply via email to