Signed-off-by: Richard Cochran <richardcoch...@gmail.com> --- clock.c | 21 +++++++++++++++++++- pmc.c | 9 +++++++++ pmc_common.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++- tlv.c | 11 +++++++++++ tlv.h | 5 +++++ 5 files changed, 100 insertions(+), 2 deletions(-)
diff --git a/clock.c b/clock.c index cc85081..67c0044 100644 --- a/clock.c +++ b/clock.c @@ -381,6 +381,7 @@ static int clock_management_fill_response(struct clock *c, struct port *p, struct ptp_message *rsp, int id) { struct alternate_time_offset_properties *atop; + struct alternate_time_offset_name *aton; struct grandmaster_settings_np *gsn; struct management_tlv_datum *mtd; struct subscribe_events_np *sen; @@ -461,6 +462,16 @@ static int clock_management_fill_response(struct clock *c, struct port *p, mtd->val = c->tds.flags & PTP_TIMESCALE; datalen = sizeof(*mtd); break; + case MID_ALTERNATE_TIME_OFFSET_NAME: + key = clock_alttime_offset_get_key(req); + if (key >= MAX_TIME_ZONES) { + break; + } + aton = (struct alternate_time_offset_name *) tlv->data; + aton->keyField = key; + ptp_text_copy(&aton->displayName, &c->tz[key].display_name); + datalen = sizeof(*aton) + aton->displayName.length; + break; case MID_ALTERNATE_TIME_OFFSET_PROPERTIES: key = clock_alttime_offset_get_key(req); if (key >= MAX_TIME_ZONES) { @@ -558,6 +569,7 @@ static int clock_management_set(struct clock *c, struct port *p, int id, struct ptp_message *req, int *changed) { struct alternate_time_offset_properties *atop; + struct alternate_time_offset_name *aton; struct grandmaster_settings_np *gsn; struct management_tlv_datum *mtd; struct subscribe_events_np *sen; @@ -579,6 +591,14 @@ static int clock_management_set(struct clock *c, struct port *p, *changed = 1; respond = 1; break; + case MID_ALTERNATE_TIME_OFFSET_NAME: + aton = (struct alternate_time_offset_name *) tlv->data; + key = aton->keyField; + if (key < MAX_TIME_ZONES && + !static_ptp_text_copy(&c->tz[key].display_name, &aton->displayName)) { + respond = 1; + } + break; case MID_ALTERNATE_TIME_OFFSET_PROPERTIES: atop = (struct alternate_time_offset_properties *) tlv->data; key = atop->keyField; @@ -1594,7 +1614,6 @@ int clock_manage(struct clock *c, struct port *p, struct ptp_message *msg) case MID_ACCEPTABLE_MASTER_TABLE: case MID_ACCEPTABLE_MASTER_MAX_TABLE_SIZE: case MID_ALTERNATE_TIME_OFFSET_ENABLE: - case MID_ALTERNATE_TIME_OFFSET_NAME: case MID_ALTERNATE_TIME_OFFSET_MAX_KEY: case MID_TRANSPARENT_CLOCK_DEFAULT_DATA_SET: case MID_PRIMARY_DOMAIN: diff --git a/pmc.c b/pmc.c index fd8b978..35dddba 100644 --- a/pmc.c +++ b/pmc.c @@ -158,6 +158,7 @@ static void pmc_show_signaling(struct ptp_message *msg, FILE *fp) static void pmc_show(struct ptp_message *msg, FILE *fp) { struct alternate_time_offset_properties *atop; + struct alternate_time_offset_name *aton; struct ieee_c37_238_settings_np *pwr; struct unicast_master_table_np *umtn; struct grandmaster_settings_np *gsn; @@ -361,6 +362,14 @@ static void pmc_show(struct ptp_message *msg, FILE *fp) fprintf(fp, "TIMESCALE_PROPERTIES " IFMT "ptpTimescale %d", mtd->val & PTP_TIMESCALE ? 1 : 0); break; + case MID_ALTERNATE_TIME_OFFSET_NAME: + aton = (struct alternate_time_offset_name *) mgt->data; + fprintf(fp, "ALTERNATE_TIME_OFFSET_NAME " + IFMT "keyField %hhu" + IFMT "displayName %s", + aton->keyField, + text2str(&aton->displayName)); + break; case MID_ALTERNATE_TIME_OFFSET_PROPERTIES: atop = (struct alternate_time_offset_properties *) mgt->data; next_jump = atop->timeOfNextJump.seconds_msb; diff --git a/pmc_common.c b/pmc_common.c index 7ab73aa..20f7b22 100644 --- a/pmc_common.c +++ b/pmc_common.c @@ -79,6 +79,7 @@ static void do_get_action(struct pmc *pmc, int action, int index, char *str); static void do_set_action(struct pmc *pmc, int action, int index, char *str); static void not_supported(struct pmc *pmc, int action, int index, char *str); static void null_management(struct pmc *pmc, int action, int index, char *str); +static int send_set_aton(struct pmc *pmc, int id, uint8_t key, const char *name); static const char *action_string[] = { "GET", @@ -121,7 +122,7 @@ struct management_id idtab[] = { { "ACCEPTABLE_MASTER_TABLE", MID_ACCEPTABLE_MASTER_TABLE, not_supported }, { "ACCEPTABLE_MASTER_MAX_TABLE_SIZE", MID_ACCEPTABLE_MASTER_MAX_TABLE_SIZE, not_supported }, { "ALTERNATE_TIME_OFFSET_ENABLE", MID_ALTERNATE_TIME_OFFSET_ENABLE, not_supported }, - { "ALTERNATE_TIME_OFFSET_NAME", MID_ALTERNATE_TIME_OFFSET_NAME, not_supported }, + { "ALTERNATE_TIME_OFFSET_NAME", MID_ALTERNATE_TIME_OFFSET_NAME, do_set_action }, { "ALTERNATE_TIME_OFFSET_MAX_KEY", MID_ALTERNATE_TIME_OFFSET_MAX_KEY, not_supported }, { "ALTERNATE_TIME_OFFSET_PROPERTIES", MID_ALTERNATE_TIME_OFFSET_PROPERTIES, do_set_action }, { "MASTER_ONLY", MID_MASTER_ONLY, do_get_action }, @@ -178,7 +179,9 @@ static void do_set_action(struct pmc *pmc, int action, int index, char *str) struct port_ds_np pnp; char onoff_port_state[4] = "off"; char onoff_time_status[4] = "off"; + char display_name[11] = {0}; uint64_t jump; + uint8_t key; mtd.reserved = 0; @@ -207,6 +210,19 @@ static void do_set_action(struct pmc *pmc, int action, int index, char *str) } pmc_send_set_action(pmc, code, &mtd, sizeof(mtd)); break; + case MID_ALTERNATE_TIME_OFFSET_NAME: + cnt = sscanf(str, " %*s %*s " + "keyField %hhu " + "displayName %10s ", + &key, + display_name); + if (cnt != 2) { + fprintf(stderr, "%s SET needs 2 values\n", + idtab[index].name); + break; + } + send_set_aton(pmc, code, key, display_name); + break; case MID_ALTERNATE_TIME_OFFSET_PROPERTIES: memset(&atop, 0, sizeof(atop)); cnt = sscanf(str, " %*s %*s " @@ -597,6 +613,9 @@ static int pmc_tlv_datalen(struct pmc *pmc, int id) case MID_TIME_STATUS_NP: len += sizeof(struct time_status_np); break; + case MID_ALTERNATE_TIME_OFFSET_NAME: + len += sizeof(struct alternate_time_offset_name); + break; case MID_ALTERNATE_TIME_OFFSET_PROPERTIES: len += sizeof(struct alternate_time_offset_properties); break; @@ -728,6 +747,41 @@ int pmc_send_set_action(struct pmc *pmc, int id, void *data, int datasize) return 0; } +static int send_set_aton(struct pmc *pmc, int id, uint8_t key, const char *name) +{ + struct alternate_time_offset_name *aton; + struct management_tlv *mgt; + struct ptp_message *msg; + struct tlv_extra *extra; + int datasize; + + datasize = sizeof(*aton) + strlen(name); + if (datasize % 2) { + datasize++; + } + msg = pmc_message(pmc, SET); + if (!msg) { + return -1; + } + extra = msg_tlv_append(msg, sizeof(*mgt) + datasize); + if (!extra) { + msg_put(msg); + return -ENOMEM; + } + mgt = (struct management_tlv *) extra->tlv; + mgt->type = TLV_MANAGEMENT; + mgt->length = 2 + datasize; + mgt->id = id; + aton = (struct alternate_time_offset_name *) mgt->data; + aton->keyField = key; + ptp_text_set(&aton->displayName, name); + + pmc_send(pmc, msg); + msg_put(msg); + + return 0; +} + struct ptp_message *pmc_recv(struct pmc *pmc) { struct ptp_message *msg; diff --git a/tlv.c b/tlv.c index c9c97ba..1d08560 100644 --- a/tlv.c +++ b/tlv.c @@ -169,6 +169,7 @@ static int mgt_post_recv(struct management_tlv *m, uint16_t data_len, struct tlv_extra *extra) { struct alternate_time_offset_properties *atop; + struct alternate_time_offset_name *aton; struct ieee_c37_238_settings_np *pwr; struct unicast_master_table_np *umtn; struct grandmaster_settings_np *gsn; @@ -339,6 +340,14 @@ static int mgt_post_recv(struct management_tlv *m, uint16_t data_len, p->portIdentity.portNumber = ntohs(p->portIdentity.portNumber); p->peerMeanPathDelay = net2host64(p->peerMeanPathDelay); break; + case MID_ALTERNATE_TIME_OFFSET_NAME: + aton = (struct alternate_time_offset_name *) m->data; + if (data_len < sizeof(*aton)) { + goto bad_length; + } + extra_len = sizeof(*aton); + extra_len += aton->displayName.length; + break; case MID_ALTERNATE_TIME_OFFSET_PROPERTIES: atop = (struct alternate_time_offset_properties *) m->data; if (data_len != sizeof(*atop)) { @@ -562,6 +571,8 @@ static void mgt_pre_send(struct management_tlv *m, struct tlv_extra *extra) p->portIdentity.portNumber = htons(p->portIdentity.portNumber); p->peerMeanPathDelay = host2net64(p->peerMeanPathDelay); break; + case MID_ALTERNATE_TIME_OFFSET_NAME: + break; case MID_ALTERNATE_TIME_OFFSET_PROPERTIES: atop = (struct alternate_time_offset_properties *) m->data; /* Message alignment broken by design. */ diff --git a/tlv.h b/tlv.h index 15df2bb..8b51ffd 100644 --- a/tlv.h +++ b/tlv.h @@ -189,6 +189,11 @@ struct alternate_time_offset_indicator_tlv { struct PTPText displayName; } PACKED; +struct alternate_time_offset_name { + UInteger8 keyField; + struct PTPText displayName; +} PACKED; + struct alternate_time_offset_properties { UInteger8 keyField; /* Message alignment broken by design. */ -- 2.30.2 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel