IEEE 1588-2019 specified new UInteger4 type minorVersionPTP field in header, and minorVersionNumber data in portDS. It has the value 1 for IEEE 1588-2019, and has the value 0 for IEEE 1588-2008.
This patch is to make versionNumber and minorVersionNumber configurable, rather than using hard-coded IEEE 1588-2008 version, for PTP packets. This is just preparation for future features support and profiles support based on IEEE 1588-2019. It seems IEEE 1588-2019 specified minorVersionNumber in portDS, but not in PORT_DATA_SET management TLV data field. It's confusing. So this patch hasn't added the minorVersionNumber in portDS making this as a TODO thing. Signed-off-by: Yangbo Lu <yangbo...@nxp.com> --- config.c | 2 ++ configs/default.cfg | 2 ++ msg.c | 5 +---- msg.h | 5 +++-- port.c | 23 +++++++++++++---------- port_private.h | 3 ++- port_signaling.c | 2 +- ptp4l.8 | 8 ++++++++ 8 files changed, 32 insertions(+), 18 deletions(-) diff --git a/config.c b/config.c index 341f887..69cfb10 100644 --- a/config.c +++ b/config.c @@ -273,6 +273,7 @@ struct config_item config_tab[] = { GLOB_ITEM_STR("manufacturerIdentity", "00:00:00"), GLOB_ITEM_INT("max_frequency", 900000000, 0, INT_MAX), PORT_ITEM_INT("min_neighbor_prop_delay", -20000000, INT_MIN, -1), + PORT_ITEM_INT("minorVersionNumber", 0, 0, 1), PORT_ITEM_INT("msg_interval_request", 0, 0, 1), PORT_ITEM_INT("neighborPropDelayThresh", 20000000, 0, INT_MAX), PORT_ITEM_INT("net_sync_monitor", 0, 0, 1), @@ -332,6 +333,7 @@ struct config_item config_tab[] = { GLOB_ITEM_STR("userDescription", ""), GLOB_ITEM_INT("utc_offset", CURRENT_UTC_OFFSET, 0, INT_MAX), GLOB_ITEM_INT("verbose", 0, 0, 1), + PORT_ITEM_INT("versionNumber", 2, 2, 2), GLOB_ITEM_INT("write_phase_mode", 0, 0, 1), }; diff --git a/configs/default.cfg b/configs/default.cfg index 9604219..139ace0 100644 --- a/configs/default.cfg +++ b/configs/default.cfg @@ -40,6 +40,8 @@ BMCA ptp inhibit_announce 0 inhibit_delay_req 0 ignore_source_id 0 +versionNumber 2 +minorVersionNumber 0 # # Run time options # diff --git a/msg.c b/msg.c index d1619d4..a2f0567 100644 --- a/msg.c +++ b/msg.c @@ -27,9 +27,6 @@ #include "print.h" #include "tlv.h" -#define VERSION_MASK 0x0f -#define VERSION 0x02 - int assume_two_step = 0; /* @@ -80,7 +77,7 @@ static void announce_post_recv(struct announce_msg *m) static int hdr_post_recv(struct ptp_header *m) { - if ((m->ver & VERSION_MASK) != VERSION) + if ((m->ver & VERSION_MASK) != PTP_VERSION) return -EPROTO; m->messageLength = ntohs(m->messageLength); m->correction = net2host64(m->correction); diff --git a/msg.h b/msg.h index a71df16..469f2ac 100644 --- a/msg.h +++ b/msg.h @@ -30,7 +30,8 @@ #include "tlv.h" #include "tmv.h" -#define PTP_VERSION 2 +#define PTP_VERSION 2 /* This is major revision */ +#define VERSION_MASK 0x0f /* Values for the messageType field */ #define SYNC 0x0 @@ -89,7 +90,7 @@ enum controlField { struct ptp_header { uint8_t tsmt; /* transportSpecific | messageType */ - uint8_t ver; /* reserved | versionPTP */ + uint8_t ver; /* minorVersionPTP | versionPTP */ UInteger16 messageLength; UInteger8 domainNumber; Octet reserved1; diff --git a/port.c b/port.c index 2bb974c..6423484 100644 --- a/port.c +++ b/port.c @@ -1353,7 +1353,7 @@ static int port_pdelay_request(struct port *p) msg->hwts.type = p->timestamping; msg->header.tsmt = PDELAY_REQ | p->transportSpecific; - msg->header.ver = PTP_VERSION; + msg->header.ver = p->minorVersionNumber << 4 | p->versionNumber; msg->header.messageLength = sizeof(struct pdelay_req_msg); msg->header.domainNumber = clock_domain_number(p->clock); msg->header.correction = -p->asymmetry; @@ -1417,7 +1417,7 @@ int port_delay_request(struct port *p) msg->hwts.type = p->timestamping; msg->header.tsmt = DELAY_REQ | p->transportSpecific; - msg->header.ver = PTP_VERSION; + msg->header.ver = p->minorVersionNumber << 4 | p->versionNumber; msg->header.messageLength = sizeof(struct delay_req_msg); msg->header.domainNumber = clock_domain_number(p->clock); msg->header.correction = -p->asymmetry; @@ -1470,7 +1470,7 @@ int port_tx_announce(struct port *p, struct address *dst) msg->hwts.type = p->timestamping; msg->header.tsmt = ANNOUNCE | p->transportSpecific; - msg->header.ver = PTP_VERSION; + msg->header.ver = p->minorVersionNumber << 4 | p->versionNumber; msg->header.messageLength = sizeof(struct announce_msg); msg->header.domainNumber = clock_domain_number(p->clock); msg->header.sourcePortIdentity = p->portIdentity; @@ -1547,7 +1547,7 @@ int port_tx_sync(struct port *p, struct address *dst) msg->hwts.type = p->timestamping; msg->header.tsmt = SYNC | p->transportSpecific; - msg->header.ver = PTP_VERSION; + msg->header.ver = p->minorVersionNumber << 4 | p->versionNumber; msg->header.messageLength = sizeof(struct sync_msg); msg->header.domainNumber = clock_domain_number(p->clock); msg->header.sourcePortIdentity = p->portIdentity; @@ -1583,7 +1583,7 @@ int port_tx_sync(struct port *p, struct address *dst) fup->hwts.type = p->timestamping; fup->header.tsmt = FOLLOW_UP | p->transportSpecific; - fup->header.ver = PTP_VERSION; + fup->header.ver = p->minorVersionNumber << 4 | p->versionNumber; fup->header.messageLength = sizeof(struct follow_up_msg); fup->header.domainNumber = clock_domain_number(p->clock); fup->header.sourcePortIdentity = p->portIdentity; @@ -1914,7 +1914,7 @@ static int process_delay_req(struct port *p, struct ptp_message *m) msg->hwts.type = p->timestamping; msg->header.tsmt = DELAY_RESP | p->transportSpecific; - msg->header.ver = PTP_VERSION; + msg->header.ver = p->minorVersionNumber << 4 | p->versionNumber; msg->header.messageLength = sizeof(struct delay_resp_msg); msg->header.domainNumber = m->header.domainNumber; msg->header.correction = m->header.correction; @@ -2106,7 +2106,7 @@ int process_pdelay_req(struct port *p, struct ptp_message *m) rsp->hwts.type = p->timestamping; rsp->header.tsmt = PDELAY_RESP | p->transportSpecific; - rsp->header.ver = PTP_VERSION; + rsp->header.ver = p->minorVersionNumber << 4 | p->versionNumber; rsp->header.messageLength = sizeof(struct pdelay_resp_msg); rsp->header.domainNumber = m->header.domainNumber; rsp->header.sourcePortIdentity = p->portIdentity; @@ -2153,7 +2153,7 @@ int process_pdelay_req(struct port *p, struct ptp_message *m) fup->hwts.type = p->timestamping; fup->header.tsmt = PDELAY_RESP_FOLLOW_UP | p->transportSpecific; - fup->header.ver = PTP_VERSION; + fup->header.ver = p->minorVersionNumber << 4 | p->versionNumber; fup->header.messageLength = sizeof(struct pdelay_resp_fup_msg); fup->header.domainNumber = m->header.domainNumber; fup->header.correction = m->header.correction; @@ -2941,7 +2941,7 @@ port_management_construct(struct PortIdentity pid, struct port *ingress, msg->hwts.type = ingress->timestamping; msg->header.tsmt = MANAGEMENT | ingress->transportSpecific; - msg->header.ver = PTP_VERSION; + msg->header.ver = ingress->minorVersionNumber << 4 | ingress->versionNumber; msg->header.messageLength = sizeof(struct management_msg); msg->header.domainNumber = clock_domain_number(ingress->clock); msg->header.sourcePortIdentity = pid; @@ -3124,7 +3124,10 @@ struct port *port_open(const char *phc_device, p->portIdentity.portNumber = number; p->state = PS_INITIALIZING; p->delayMechanism = config_get_int(cfg, p->name, "delay_mechanism"); - p->versionNumber = PTP_VERSION; + + p->versionNumber = config_get_int(cfg, p->name, "versionNumber"); + p->minorVersionNumber = config_get_int(cfg, p->name, "minorVersionNumber"); + p->slave_event_monitor = clock_slave_monitor(clock); if (!port_is_uds(p) && unicast_client_initialize(p)) { diff --git a/port_private.h b/port_private.h index 842ee06..a76a3ab 100644 --- a/port_private.h +++ b/port_private.h @@ -142,7 +142,8 @@ struct port { enum link_state link_status; struct fault_interval flt_interval_pertype[FT_CNT]; enum fault_type last_fault_type; - unsigned int versionNumber; /*UInteger4*/ + UInteger8 versionNumber; /* UInteger4 */ + UInteger8 minorVersionNumber; /* UInteger4 */ struct PortStats stats; /* foreignMasterDS */ LIST_HEAD(fm, foreign_clock) foreign_masters; diff --git a/port_signaling.c b/port_signaling.c index ed217c0..864a04d 100644 --- a/port_signaling.c +++ b/port_signaling.c @@ -41,7 +41,7 @@ struct ptp_message *port_signaling_construct(struct port *p, } msg->hwts.type = p->timestamping; msg->header.tsmt = SIGNALING | p->transportSpecific; - msg->header.ver = PTP_VERSION; + msg->header.ver = p->minorVersionNumber << 4 | p->versionNumber; msg->header.messageLength = sizeof(struct signaling_msg); msg->header.domainNumber = clock_domain_number(p->clock); msg->header.sourcePortIdentity = p->portIdentity; diff --git a/ptp4l.8 b/ptp4l.8 index 0d19171..24e5e49 100644 --- a/ptp4l.8 +++ b/ptp4l.8 @@ -371,6 +371,14 @@ limit for IPv6 multicast messages. This option is only relevant with the IPv4 and IPv6 UDP transports. The default is 1 to restrict the messages sent by .B ptp4l to the same subnet. +.TP +.B versionNumber +Major revision of IEEE 1588. Only support value 2 (IEEE 1588-2008, IEEE 1588-2019). +The default is 2. (IEEE 1588-2008, IEEE 1588-2019) +.TP +.B minorVersionNumber +Minor revision of IEEE 1588. Value 1 for IEEE 1588-2019, and value 0 for IEEE 1588-2008. +The default is 0. .SH PROGRAM AND CLOCK OPTIONS -- 2.25.1 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel