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

Reply via email to