Discussion:
[Linuxptp-devel] [PATCH RFC 0/7] Sync message timeouts for gPTP mode
Richard Cochran
2013-09-04 17:50:32 UTC
Permalink
The IEEE 802.1AS-2011 standard has a timeout for sync messages in
addition to the announce timeout. These two timeouts are used in
exactly the same way, that is, either one will trigger a BMC election.
This patch series adds support the timeout, which is only on by
default for normal gPTP applications.


Richard Cochran (7):
Enforce the absolute lower limit for the announce receipt timeout.
Rename the timer for sending sync messages.
Add a timer implementing the sync receive timeout.
Add a configuration file option for the sync receive timeout.
Announce master ambitions right away.
Add an optional extra check on sync and follow up message ordering.
Add a configuration file option for the extra sync-fup check.

config.c | 14 +++++++++++++-
config.h | 1 +
default.cfg | 2 ++
ds.h | 1 +
fd.h | 5 +++--
gPTP.cfg | 2 ++
port.c | 54 +++++++++++++++++++++++++++++++++++++++++++-----------
ptp4l.8 | 19 +++++++++++++++++++
ptp4l.c | 2 ++
raw.c | 3 +++
sk.c | 27 +++++++++++++++++++++++++--
sk.h | 14 ++++++++++++++
transport.h | 1 +
udp.c | 3 +++
udp6.c | 3 +++
15 files changed, 135 insertions(+), 16 deletions(-)
--
1.7.10.4
Richard Cochran
2013-09-04 17:50:33 UTC
Permalink
Signed-off-by: Richard Cochran <***@gmail.com>
---
config.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/config.c b/config.c
index d914afa..cec0922 100644
--- a/config.c
+++ b/config.c
@@ -90,7 +90,7 @@ static enum parser_result parse_pod_setting(const char *option,
pod->logMinPdelayReqInterval = val;

} else if (!strcmp(option, "announceReceiptTimeout")) {
- r = get_ranged_uint(value, &uval, 0, UINT8_MAX);
+ r = get_ranged_uint(value, &uval, 2, UINT8_MAX);
if (r != PARSED_OK)
return r;
pod->announceReceiptTimeout = uval;
--
1.7.10.4
Richard Cochran
2013-09-04 17:50:34 UTC
Permalink
This patch renames the per-port timer in order to make room in the
namespace for a timer that detects a sync message input timeout.

Signed-off-by: Richard Cochran <***@gmail.com>
---
fd.h | 2 +-
port.c | 16 ++++++++--------
2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/fd.h b/fd.h
index f6d6cff..88f3903 100644
--- a/fd.h
+++ b/fd.h
@@ -29,7 +29,7 @@ enum {
FD_DELAY_TIMER,
FD_QUALIFICATION_TIMER,
FD_MANNO_TIMER,
- FD_SYNC_TIMER,
+ FD_SYNC_TX_TIMER,
N_POLLFD,
};

diff --git a/port.c b/port.c
index 04174b6..18197c2 100644
--- a/port.c
+++ b/port.c
@@ -800,9 +800,9 @@ static int port_set_qualification_tmo(struct port *p)
1+clock_steps_removed(p->clock), p->logAnnounceInterval);
}

-static int port_set_sync_tmo(struct port *p)
+static int port_set_sync_tx_tmo(struct port *p)
{
- return set_tmo_log(p->fda.fd[FD_SYNC_TIMER], 1, p->logSyncInterval);
+ return set_tmo_log(p->fda.fd[FD_SYNC_TX_TIMER], 1, p->logSyncInterval);
}

static void port_show_transition(struct port *p,
@@ -1854,7 +1854,7 @@ static void port_e2e_transition(struct port *p, enum port_state next)
port_clr_tmo(p->fda.fd[FD_DELAY_TIMER]);
port_clr_tmo(p->fda.fd[FD_QUALIFICATION_TIMER]);
port_clr_tmo(p->fda.fd[FD_MANNO_TIMER]);
- port_clr_tmo(p->fda.fd[FD_SYNC_TIMER]);
+ port_clr_tmo(p->fda.fd[FD_SYNC_TX_TIMER]);

switch (next) {
case PS_INITIALIZING:
@@ -1872,7 +1872,7 @@ static void port_e2e_transition(struct port *p, enum port_state next)
case PS_MASTER:
case PS_GRAND_MASTER:
port_set_manno_tmo(p);
- port_set_sync_tmo(p);
+ port_set_sync_tx_tmo(p);
break;
case PS_PASSIVE:
port_set_announce_tmo(p);
@@ -1894,7 +1894,7 @@ static void port_p2p_transition(struct port *p, enum port_state next)
/* Leave FD_DELAY_TIMER running. */
port_clr_tmo(p->fda.fd[FD_QUALIFICATION_TIMER]);
port_clr_tmo(p->fda.fd[FD_MANNO_TIMER]);
- port_clr_tmo(p->fda.fd[FD_SYNC_TIMER]);
+ port_clr_tmo(p->fda.fd[FD_SYNC_TX_TIMER]);

switch (next) {
case PS_INITIALIZING:
@@ -1912,7 +1912,7 @@ static void port_p2p_transition(struct port *p, enum port_state next)
case PS_MASTER:
case PS_GRAND_MASTER:
port_set_manno_tmo(p);
- port_set_sync_tmo(p);
+ port_set_sync_tx_tmo(p);
break;
case PS_PASSIVE:
port_set_announce_tmo(p);
@@ -2011,9 +2011,9 @@ enum fsm_event port_event(struct port *p, int fd_index)
port_set_manno_tmo(p);
return port_tx_announce(p) ? EV_FAULT_DETECTED : EV_NONE;

- case FD_SYNC_TIMER:
+ case FD_SYNC_TX_TIMER:
pr_debug("port %hu: master sync timeout", portnum(p));
- port_set_sync_tmo(p);
+ port_set_sync_tx_tmo(p);
return port_tx_sync(p) ? EV_FAULT_DETECTED : EV_NONE;
}
--
1.7.10.4
Richard Cochran
2013-09-04 17:50:35 UTC
Permalink
This patch adds a new timer for use in 802.1AS-2011 applications. When
running as a slave in gPTP mode, the program must monitor both announce
and sync messages from the master. If either one goes missing, then we
trigger a BMC election. The sync timeout is actually reset by a valid
sync/follow up pair of messages.

Signed-off-by: Richard Cochran <***@gmail.com>
---
fd.h | 3 ++-
port.c | 17 ++++++++++++++++-
2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/fd.h b/fd.h
index 88f3903..e328e98 100644
--- a/fd.h
+++ b/fd.h
@@ -20,12 +20,13 @@
#ifndef HAVE_FD_H
#define HAVE_FD_H

-#define N_TIMER_FDS 5
+#define N_TIMER_FDS 6

enum {
FD_EVENT,
FD_GENERAL,
FD_ANNOUNCE_TIMER,
+ FD_SYNC_RX_TIMER,
FD_DELAY_TIMER,
FD_QUALIFICATION_TIMER,
FD_MANNO_TIMER,
diff --git a/port.c b/port.c
index 18197c2..2276ea5 100644
--- a/port.c
+++ b/port.c
@@ -97,6 +97,7 @@ struct port {
TimeInterval peerMeanPathDelay;
Integer8 logAnnounceInterval;
UInteger8 announceReceiptTimeout;
+ UInteger8 syncReceiptTimeout;
UInteger8 transportSpecific;
Integer8 logSyncInterval;
Enumeration8 delayMechanism;
@@ -800,6 +801,12 @@ static int port_set_qualification_tmo(struct port *p)
1+clock_steps_removed(p->clock), p->logAnnounceInterval);
}

+static int port_set_sync_rx_tmo(struct port *p)
+{
+ return set_tmo_log(p->fda.fd[FD_SYNC_RX_TIMER],
+ p->syncReceiptTimeout, p->logSyncInterval);
+}
+
static int port_set_sync_tx_tmo(struct port *p)
{
return set_tmo_log(p->fda.fd[FD_SYNC_TX_TIMER], 1, p->logSyncInterval);
@@ -832,6 +839,8 @@ static void port_synchronize(struct port *p,
{
enum servo_state state;

+ port_set_sync_rx_tmo(p);
+
state = clock_synchronize(p->clock, ingress_ts, origin_ts,
correction1, correction2);
switch (state) {
@@ -1851,6 +1860,7 @@ struct foreign_clock *port_compute_best(struct port *p)
static void port_e2e_transition(struct port *p, enum port_state next)
{
port_clr_tmo(p->fda.fd[FD_ANNOUNCE_TIMER]);
+ port_clr_tmo(p->fda.fd[FD_SYNC_RX_TIMER]);
port_clr_tmo(p->fda.fd[FD_DELAY_TIMER]);
port_clr_tmo(p->fda.fd[FD_QUALIFICATION_TIMER]);
port_clr_tmo(p->fda.fd[FD_MANNO_TIMER]);
@@ -1883,6 +1893,7 @@ static void port_e2e_transition(struct port *p, enum port_state next)
/* fall through */
case PS_SLAVE:
port_set_announce_tmo(p);
+ port_set_sync_rx_tmo(p);
port_set_delay_tmo(p);
break;
};
@@ -1891,6 +1902,7 @@ static void port_e2e_transition(struct port *p, enum port_state next)
static void port_p2p_transition(struct port *p, enum port_state next)
{
port_clr_tmo(p->fda.fd[FD_ANNOUNCE_TIMER]);
+ port_clr_tmo(p->fda.fd[FD_SYNC_RX_TIMER]);
/* Leave FD_DELAY_TIMER running. */
port_clr_tmo(p->fda.fd[FD_QUALIFICATION_TIMER]);
port_clr_tmo(p->fda.fd[FD_MANNO_TIMER]);
@@ -1923,6 +1935,7 @@ static void port_p2p_transition(struct port *p, enum port_state next)
/* fall through */
case PS_SLAVE:
port_set_announce_tmo(p);
+ port_set_sync_rx_tmo(p);
break;
};
}
@@ -1987,7 +2000,9 @@ enum fsm_event port_event(struct port *p, int fd_index)

switch (fd_index) {
case FD_ANNOUNCE_TIMER:
- pr_debug("port %hu: announce timeout", portnum(p));
+ case FD_SYNC_RX_TIMER:
+ pr_debug("port %hu: %s timeout", portnum(p),
+ fd_index == FD_SYNC_RX_TIMER ? "rx sync" : "announce");
if (p->best)
fc_clear(p->best);
port_set_announce_tmo(p);
--
1.7.10.4
Richard Cochran
2013-09-04 17:50:37 UTC
Permalink
This patch lets a port send the first announce message one millisecond
after the port state transition, rather than waiting one announce interval.
This change is needed because it is desirable to reconfigure the time
network without delay, especially in P2P mode.

Signed-off-by: Richard Cochran <***@gmail.com>
---
port.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/port.c b/port.c
index 4cfcdef..e5c079e 100644
--- a/port.c
+++ b/port.c
@@ -1882,7 +1882,7 @@ static void port_e2e_transition(struct port *p, enum port_state next)
break;
case PS_MASTER:
case PS_GRAND_MASTER:
- port_set_manno_tmo(p);
+ set_tmo_log(p->fda.fd[FD_MANNO_TIMER], 1, -10); /*~1ms*/
port_set_sync_tx_tmo(p);
break;
case PS_PASSIVE:
@@ -1924,7 +1924,7 @@ static void port_p2p_transition(struct port *p, enum port_state next)
break;
case PS_MASTER:
case PS_GRAND_MASTER:
- port_set_manno_tmo(p);
+ set_tmo_log(p->fda.fd[FD_MANNO_TIMER], 1, -10); /*~1ms*/
port_set_sync_tx_tmo(p);
break;
case PS_PASSIVE:
--
1.7.10.4
Richard Cochran
2013-09-04 17:50:36 UTC
Permalink
Signed-off-by: Richard Cochran <***@gmail.com>
---
config.c | 6 ++++++
default.cfg | 1 +
ds.h | 1 +
gPTP.cfg | 1 +
port.c | 1 +
ptp4l.8 | 7 +++++++
ptp4l.c | 1 +
7 files changed, 18 insertions(+)

diff --git a/config.c b/config.c
index cec0922..ebb19c9 100644
--- a/config.c
+++ b/config.c
@@ -95,6 +95,12 @@ static enum parser_result parse_pod_setting(const char *option,
return r;
pod->announceReceiptTimeout = uval;

+ } else if (!strcmp(option, "syncReceiptTimeout")) {
+ r = get_ranged_uint(value, &uval, 0, UINT8_MAX);
+ if (r != PARSED_OK)
+ return r;
+ pod->syncReceiptTimeout = uval;
+
} else if (!strcmp(option, "transportSpecific")) {
r = get_ranged_uint(value, &uval, 0, 0x0F);
if (r != PARSED_OK)
diff --git a/default.cfg b/default.cfg
index c5493d6..efdd0f2 100644
--- a/default.cfg
+++ b/default.cfg
@@ -20,6 +20,7 @@ logSyncInterval 0
logMinDelayReqInterval 0
logMinPdelayReqInterval 0
announceReceiptTimeout 3
+syncReceiptTimeout 0
delayAsymmetry 0
fault_reset_interval 4
neighborPropDelayThresh 20000000
diff --git a/ds.h b/ds.h
index 9977e40..55ad043 100644
--- a/ds.h
+++ b/ds.h
@@ -123,6 +123,7 @@ struct port_defaults {
Integer8 logMinDelayReqInterval;
Integer8 logMinPdelayReqInterval;
UInteger8 announceReceiptTimeout;
+ UInteger8 syncReceiptTimeout;
UInteger8 transportSpecific;
int path_trace_enabled;
int follow_up_info;
diff --git a/gPTP.cfg b/gPTP.cfg
index 00215b4..85865bc 100644
--- a/gPTP.cfg
+++ b/gPTP.cfg
@@ -19,6 +19,7 @@ logAnnounceInterval 1
logSyncInterval -3
logMinPdelayReqInterval 0
announceReceiptTimeout 3
+syncReceiptTimeout 3
delayAsymmetry 0
fault_reset_interval 4
neighborPropDelayThresh 800
diff --git a/port.c b/port.c
index 2276ea5..4cfcdef 100644
--- a/port.c
+++ b/port.c
@@ -1283,6 +1283,7 @@ static int port_initialize(struct port *p)
p->peerMeanPathDelay = 0;
p->logAnnounceInterval = p->pod.logAnnounceInterval;
p->announceReceiptTimeout = p->pod.announceReceiptTimeout;
+ p->syncReceiptTimeout = p->pod.syncReceiptTimeout;
p->transportSpecific = p->pod.transportSpecific;
p->logSyncInterval = p->pod.logSyncInterval;
p->logMinPdelayReqInterval = p->pod.logMinPdelayReqInterval;
diff --git a/ptp4l.8 b/ptp4l.8
index 6f42c1c..c68d01d 100644
--- a/ptp4l.8
+++ b/ptp4l.8
@@ -148,6 +148,13 @@ The number of missed Announce messages before the last Announce messages
expires.
The default is 3.
.TP
+.B syncReceiptTimeout
+The number of sync/follow up messages that may go missing before
+triggering a Best Master Clock election. This option is used for
+running in gPTP mode according to the 802.1AS-2011 standard. Setting
+this option to zero will disable the sync message timeout.
+The default is 0 or disabled.
+.TP
.B transportSpecific
The transport specific field. Must be in the range 0 to 255.
The default is 0.
diff --git a/ptp4l.c b/ptp4l.c
index a83e3fe..9577250 100644
--- a/ptp4l.c
+++ b/ptp4l.c
@@ -77,6 +77,7 @@ static struct config cfg_settings = {
.logMinDelayReqInterval = 0,
.logMinPdelayReqInterval = 0,
.announceReceiptTimeout = 3,
+ .syncReceiptTimeout = 0,
.transportSpecific = 0,
.path_trace_enabled = 0,
.follow_up_info = 0,
--
1.7.10.4
Richard Cochran
2013-09-04 17:50:38 UTC
Permalink
This post might be inappropriate. Click to display it.
Jiri Benc
2013-09-04 18:49:48 UTC
Permalink
Post by Richard Cochran
Because of packet reordering that can occur in the network, in the
hardware, or in the networking stack, a follow up message can appear
to arrive in the application before the matching sync message. As this
is a normal occurrence, and the sequenceID message field ensures
proper matching, the ptp4l program accepts out of order packets.
This patch adds an additional check using the software time stamps
from the networking stack to verify that the sync message did arrive
first. This check is only useful if the sequence IDs generated by
the master might possibly be incorrect.
Maybe I'm missing something but it looks to me it's the same as just
not caching reordered follow ups. Packets reordered by the network or
the hardware will have also reordered software time stamps. And how
could be packets reordered by the networking stack when they are read
in a single thread?

Jiri
--
Jiri Benc
Richard Cochran
2013-09-05 08:17:47 UTC
Permalink
Post by Jiri Benc
Maybe I'm missing something but it looks to me it's the same as just
not caching reordered follow ups.
It is not quite the same. This option will accept reordered sync/fup
as long as the network stack timestamps are in order. This can and
does happen when using PHY timestamping, for example.
Post by Jiri Benc
Packets reordered by the network or
the hardware will have also reordered software time stamps.
Yes, and these would be rejected by the option. The gPTP standard
forbids the network (and hardware) from reordering.
Post by Jiri Benc
And how
could be packets reordered by the networking stack when they are read
in a single thread?
I think napi drivers will not reorder (but maybe QoS could still). For
non-napi interrupt-driven drivers, the two packets might end up on
different cores.

Thanks,
Richard
Jiri Benc
2013-09-05 08:46:22 UTC
Permalink
Post by Richard Cochran
It is not quite the same. This option will accept reordered sync/fup
as long as the network stack timestamps are in order. This can and
does happen when using PHY timestamping, for example.
I don't see how PHY differs here, the software time stamps will still
be out of order, won't they?
Post by Richard Cochran
I think napi drivers will not reorder (but maybe QoS could still). For
non-napi interrupt-driven drivers, the two packets might end up on
different cores.
Are there any non-napi drivers supporting hardware time stamping out
there? ;-) (And if there are, are they using a single workqueue to
process packets, or a workqueue per cpu?)

Basically, my question is, couldn't this be simplified by just
discarding out of order packets, regardless of how they got out of
order?

Jiri
--
Jiri Benc
Richard Cochran
2013-09-05 09:21:15 UTC
Permalink
Post by Jiri Benc
Post by Richard Cochran
It is not quite the same. This option will accept reordered sync/fup
as long as the network stack timestamps are in order. This can and
does happen when using PHY timestamping, for example.
I don't see how PHY differs here, the software time stamps will still
be out of order, won't they?
Not for napi drivers, because netif_receive_skb() calls
net_timestamp_check() before calling skb_defer_rx_timestamp().
Post by Jiri Benc
Post by Richard Cochran
I think napi drivers will not reorder (but maybe QoS could still). For
non-napi interrupt-driven drivers, the two packets might end up on
different cores.
Are there any non-napi drivers supporting hardware time stamping out
there? ;-) (And if there are, are they using a single workqueue to
process packets, or a workqueue per cpu?)
There is blackfin (bfin_mac), and those are not multicore, but you
never know what might appear next. The fec driver was until just
recently non-napi, and I just noticed that the i.mx287 added time
stamping to that MAC.
Post by Jiri Benc
Basically, my question is, couldn't this be simplified by just
discarding out of order packets, regardless of how they got out of
order?
Once in a while, the phyter driver delivers the Fup after the Sync,
and I would bet that any other PHY drivers would do the same. So it is
important for ptp4l to accept the packets out of order.

This option would let you accept PHY reordering while rejecting
reordering from an external switch, for example.

Thanks,
Richard
Jiri Benc
2013-09-05 09:33:03 UTC
Permalink
Post by Richard Cochran
Post by Jiri Benc
I don't see how PHY differs here, the software time stamps will still
be out of order, won't they?
Not for napi drivers, because netif_receive_skb() calls
net_timestamp_check() before calling skb_defer_rx_timestamp().
Ah, I see. I don't deal with PHY drivers so often. Thanks for the
explanation.

Jiri
--
Jiri Benc
Richard Cochran
2013-09-04 17:50:39 UTC
Permalink
Signed-off-by: Richard Cochran <***@gmail.com>
---
config.c | 6 ++++++
config.h | 1 +
default.cfg | 1 +
gPTP.cfg | 1 +
ptp4l.8 | 12 ++++++++++++
ptp4l.c | 1 +
6 files changed, 22 insertions(+)

diff --git a/config.c b/config.c
index ebb19c9..8cae57f 100644
--- a/config.c
+++ b/config.c
@@ -301,6 +301,12 @@ static enum parser_result parse_global_setting(const char *option,
return r;
*cfg->tx_timestamp_timeout = val;

+ } else if (!strcmp(option, "check_fup_sync")) {
+ r = get_ranged_int(value, &val, 0, 1);
+ if (r != PARSED_OK)
+ return r;
+ *cfg->check_fup_sync = val;
+
} else if (!strcmp(option, "pi_proportional_const")) {
r = get_ranged_double(value, &df, 0.0, DBL_MAX);
if (r != PARSED_OK)
diff --git a/config.h b/config.h
index b014d7e..94704a4 100644
--- a/config.h
+++ b/config.h
@@ -70,6 +70,7 @@ struct config {
struct port_defaults pod;
int *assume_two_step;
int *tx_timestamp_timeout;
+ int *check_fup_sync;

enum servo_type clock_servo;

diff --git a/default.cfg b/default.cfg
index efdd0f2..72665a6 100644
--- a/default.cfg
+++ b/default.cfg
@@ -36,6 +36,7 @@ use_syslog 1
verbose 0
summary_interval 0
kernel_leap 1
+check_fup_sync 0
#
# Servo Options
#
diff --git a/gPTP.cfg b/gPTP.cfg
index 85865bc..30719b6 100644
--- a/gPTP.cfg
+++ b/gPTP.cfg
@@ -35,6 +35,7 @@ use_syslog 1
verbose 0
summary_interval 0
kernel_leap 1
+check_fup_sync 0
#
# Servo options
#
diff --git a/ptp4l.8 b/ptp4l.8
index c68d01d..493626d 100644
--- a/ptp4l.8
+++ b/ptp4l.8
@@ -255,6 +255,18 @@ The number of milliseconds to poll waiting for the tx time stamp from the kernel
when a message has recently been sent.
The default is 1.
.TP
+.B check_fup_sync
+Because of packet reordering that can occur in the network, in the
+hardware, or in the networking stack, a follow up message can appear
+to arrive in the application before the matching sync message. As this
+is a normal occurrence, and the sequenceID message field ensures
+proper matching, the ptp4l program accepts out of order packets. This
+option adds an additional check using the software time stamps from
+the networking stack to verify that the sync message did arrive
+first. This option is only useful if you do not trust the sequence IDs
+generated by the master.
+The default is 0 (disabled).
+.TP
.B clock_servo
The servo which is used to synchronize the local clock. Currently only one
servo is implemented, a PI controller.
diff --git a/ptp4l.c b/ptp4l.c
index 9577250..b0d1c9c 100644
--- a/ptp4l.c
+++ b/ptp4l.c
@@ -92,6 +92,7 @@ static struct config cfg_settings = {

.assume_two_step = &assume_two_step,
.tx_timestamp_timeout = &sk_tx_timeout,
+ .check_fup_sync = &sk_check_fupsync,

.clock_servo = CLOCK_SERVO_PI,
--
1.7.10.4
Keller, Jacob E
2013-09-04 18:04:31 UTC
Permalink
Post by Richard Cochran
The IEEE 802.1AS-2011 standard has a timeout for sync messages in
addition to the announce timeout. These two timeouts are used in
exactly the same way, that is, either one will trigger a BMC election.
This patch series adds support the timeout, which is only on by
default for normal gPTP applications.
Enforce the absolute lower limit for the announce receipt timeout.
Rename the timer for sending sync messages.
Add a timer implementing the sync receive timeout.
Add a configuration file option for the sync receive timeout.
Announce master ambitions right away.
Curious what these last patches have to do with this series?

Thanks,
Jake
Post by Richard Cochran
Add an optional extra check on sync and follow up message ordering.
Add a configuration file option for the extra sync-fup check.
config.c | 14 +++++++++++++-
config.h | 1 +
default.cfg | 2 ++
ds.h | 1 +
fd.h | 5 +++--
gPTP.cfg | 2 ++
port.c | 54 +++++++++++++++++++++++++++++++++++++++++++-----------
ptp4l.8 | 19 +++++++++++++++++++
ptp4l.c | 2 ++
raw.c | 3 +++
sk.c | 27 +++++++++++++++++++++++++--
sk.h | 14 ++++++++++++++
transport.h | 1 +
udp.c | 3 +++
udp6.c | 3 +++
15 files changed, 135 insertions(+), 16 del
Richard Cochran
2013-09-04 18:47:25 UTC
Permalink
Post by Keller, Jacob E
Curious what these last patches have to do with this series?
...
Post by Keller, Jacob E
Post by Richard Cochran
Add an optional extra check on sync and follow up message ordering.
Add a configuration file option for the extra sync-fup check.
This option is only there so that we can conform to the letter of
IEEE 802.1AS-2011. The MDSyncReceiveSM state machine (Figure 11-6)
does not allow for the possibility that the FollowUp arrives first
(as our state machine does), and so this new option makes sure that
this is the case.

Thanks,
Richard
Keller, Jacob E
2013-09-04 20:16:10 UTC
Permalink
Post by Richard Cochran
Post by Keller, Jacob E
Curious what these last patches have to do with this series?
...
Post by Keller, Jacob E
Post by Richard Cochran
Add an optional extra check on sync and follow up message ordering.
Add a configuration file option for the extra sync-fup check.
This option is only there so that we can conform to the letter of
IEEE 802.1AS-2011. The MDSyncReceiveSM state machine (Figure 11-6)
does not allow for the possibility that the FollowUp arrives first
(as our state machine does), and so this new option makes sure that
this is the case.
Thanks,
Richard
Ok, thanks. This explains the reason for having
Loading...