Delio Brignoli
2013-01-30 15:28:54 UTC
A timeout of 15 seconds is not always acceptable, make it configurable.
Signed-off-by: Delio Brignoli <***@audioscience.com>
---
clock.c | 15 +++++++++------
config.c | 5 +++++
default.cfg | 1 +
ds.h | 1 +
gPTP.cfg | 1 +
ptp4l.8 | 5 +++++
ptp4l.c | 1 +
7 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/clock.c b/clock.c
index 5d5ccbf..b2f40e6 100644
--- a/clock.c
+++ b/clock.c
@@ -37,7 +37,6 @@
#include "util.h"
#define CLK_N_PORTS (MAX_PORTS + 1) /* plus one for the UDS interface */
-#define FAULT_RESET_SECONDS 15
#define N_CLOCK_PFD (N_POLLFD + 1) /* one extra per port, for the fault timer */
#define MAVE_LENGTH 10
#define POW2_41 ((double)(1ULL << 41))
@@ -65,7 +64,7 @@ struct clock {
struct port *port[CLK_N_PORTS];
struct pollfd pollfd[CLK_N_PORTS*N_CLOCK_PFD];
int fault_fd[CLK_N_PORTS];
- time_t fault_timeout;
+ time_t fault_timeout[CLK_N_PORTS];
int nports; /* does not include the UDS port */
int free_running;
int freq_est_interval;
@@ -115,8 +114,8 @@ static int clock_fault_timeout(struct clock *c, int index, int set)
};
if (set) {
pr_debug("waiting %d seconds to clear fault on port %d",
- c->fault_timeout, index);
- tmo.it_value.tv_sec = c->fault_timeout;
+ c->fault_timeout[index], index);
+ tmo.it_value.tv_sec = c->fault_timeout[index];
} else {
pr_debug("clearing fault on port %d", index);
}
@@ -479,10 +478,10 @@ struct clock *clock_create(int phc_index, struct interface *iface, int count,
c->pollfd[i].events = 0;
}
- c->fault_timeout = FAULT_RESET_SECONDS;
c->fest.max_count = 2;
for (i = 0; i < count; i++) {
+ c->fault_timeout[i] = iface[i].pod.fault_reset_seconds;
c->port[i] = port_open(phc_index, timestamping, 1+i, &iface[i], c);
if (!c->port[i]) {
pr_err("failed to open port %s", iface[i].name);
@@ -721,7 +720,11 @@ int clock_poll(struct clock *c)
port_dispatch(c->port[i], event, 0);
/* Clear any fault after a little while. */
if (PS_FAULTY == port_state(c->port[i])) {
- clock_fault_timeout(c, i, 1);
+ if (c->fault_timeout[i] == 0)
+ port_dispatch(c->port[i],
+ EV_FAULT_CLEARED, 0);
+ else
+ clock_fault_timeout(c, i, 1);
}
}
}
diff --git a/config.c b/config.c
index a4a6261..379733f 100644
--- a/config.c
+++ b/config.c
@@ -106,6 +106,11 @@ static enum parser_result parse_pod_setting(const char *option,
return BAD_VALUE;
pod->follow_up_info = val ? 1 : 0;
+ } else if (!strcmp(option, "fault_reset_seconds")) {
+ if (1 != sscanf(value, "%u", &val))
+ return BAD_VALUE;
+ pod->fault_reset_seconds = val;
+
} else
return NOT_PARSED;
diff --git a/default.cfg b/default.cfg
index ee2700d..87ace08 100644
--- a/default.cfg
+++ b/default.cfg
@@ -21,6 +21,7 @@ logMinDelayReqInterval 0
logMinPdelayReqInterval 0
announceReceiptTimeout 3
delayAsymmetry 0
+fault_reset_seconds 15
#
# Run time options
#
diff --git a/ds.h b/ds.h
index 514679b..43cd4a6 100644
--- a/ds.h
+++ b/ds.h
@@ -112,6 +112,7 @@ struct port_defaults {
int path_trace_enabled;
int follow_up_info;
int freq_est_interval; /*log seconds*/
+ int fault_reset_seconds;
};
#endif
diff --git a/gPTP.cfg b/gPTP.cfg
index f186e78..90a55ac 100644
--- a/gPTP.cfg
+++ b/gPTP.cfg
@@ -20,6 +20,7 @@ logSyncInterval -3
logMinPdelayReqInterval 0
announceReceiptTimeout 3
delayAsymmetry 0
+fault_reset_seconds 15
#
# Run time options
#
diff --git a/ptp4l.8 b/ptp4l.8
index fadf854..791236c 100644
--- a/ptp4l.8
+++ b/ptp4l.8
@@ -181,6 +181,11 @@ The default is 0 (disabled).
Include the 802.1AS data in the Follow_Up messages if enabled.
The default is 0 (disabled).
.TP
+.B fault_reset_seconds
+The time in seconds between the detection of a port's fault and the fault
+being reset.
+The default is 15 (15 seconds).
+.TP
.B delay_mechanism
Select the delay mechanism. Possible values are E2E, P2P and Auto.
The default is E2E.
diff --git a/ptp4l.c b/ptp4l.c
index 4fc0c88..0ce6a5c 100644
--- a/ptp4l.c
+++ b/ptp4l.c
@@ -64,6 +64,7 @@ static struct config cfg_settings = {
.path_trace_enabled = 0,
.follow_up_info = 0,
.freq_est_interval = 1,
+ .fault_reset_seconds = 15,
},
.timestamping = TS_HARDWARE,
Signed-off-by: Delio Brignoli <***@audioscience.com>
---
clock.c | 15 +++++++++------
config.c | 5 +++++
default.cfg | 1 +
ds.h | 1 +
gPTP.cfg | 1 +
ptp4l.8 | 5 +++++
ptp4l.c | 1 +
7 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/clock.c b/clock.c
index 5d5ccbf..b2f40e6 100644
--- a/clock.c
+++ b/clock.c
@@ -37,7 +37,6 @@
#include "util.h"
#define CLK_N_PORTS (MAX_PORTS + 1) /* plus one for the UDS interface */
-#define FAULT_RESET_SECONDS 15
#define N_CLOCK_PFD (N_POLLFD + 1) /* one extra per port, for the fault timer */
#define MAVE_LENGTH 10
#define POW2_41 ((double)(1ULL << 41))
@@ -65,7 +64,7 @@ struct clock {
struct port *port[CLK_N_PORTS];
struct pollfd pollfd[CLK_N_PORTS*N_CLOCK_PFD];
int fault_fd[CLK_N_PORTS];
- time_t fault_timeout;
+ time_t fault_timeout[CLK_N_PORTS];
int nports; /* does not include the UDS port */
int free_running;
int freq_est_interval;
@@ -115,8 +114,8 @@ static int clock_fault_timeout(struct clock *c, int index, int set)
};
if (set) {
pr_debug("waiting %d seconds to clear fault on port %d",
- c->fault_timeout, index);
- tmo.it_value.tv_sec = c->fault_timeout;
+ c->fault_timeout[index], index);
+ tmo.it_value.tv_sec = c->fault_timeout[index];
} else {
pr_debug("clearing fault on port %d", index);
}
@@ -479,10 +478,10 @@ struct clock *clock_create(int phc_index, struct interface *iface, int count,
c->pollfd[i].events = 0;
}
- c->fault_timeout = FAULT_RESET_SECONDS;
c->fest.max_count = 2;
for (i = 0; i < count; i++) {
+ c->fault_timeout[i] = iface[i].pod.fault_reset_seconds;
c->port[i] = port_open(phc_index, timestamping, 1+i, &iface[i], c);
if (!c->port[i]) {
pr_err("failed to open port %s", iface[i].name);
@@ -721,7 +720,11 @@ int clock_poll(struct clock *c)
port_dispatch(c->port[i], event, 0);
/* Clear any fault after a little while. */
if (PS_FAULTY == port_state(c->port[i])) {
- clock_fault_timeout(c, i, 1);
+ if (c->fault_timeout[i] == 0)
+ port_dispatch(c->port[i],
+ EV_FAULT_CLEARED, 0);
+ else
+ clock_fault_timeout(c, i, 1);
}
}
}
diff --git a/config.c b/config.c
index a4a6261..379733f 100644
--- a/config.c
+++ b/config.c
@@ -106,6 +106,11 @@ static enum parser_result parse_pod_setting(const char *option,
return BAD_VALUE;
pod->follow_up_info = val ? 1 : 0;
+ } else if (!strcmp(option, "fault_reset_seconds")) {
+ if (1 != sscanf(value, "%u", &val))
+ return BAD_VALUE;
+ pod->fault_reset_seconds = val;
+
} else
return NOT_PARSED;
diff --git a/default.cfg b/default.cfg
index ee2700d..87ace08 100644
--- a/default.cfg
+++ b/default.cfg
@@ -21,6 +21,7 @@ logMinDelayReqInterval 0
logMinPdelayReqInterval 0
announceReceiptTimeout 3
delayAsymmetry 0
+fault_reset_seconds 15
#
# Run time options
#
diff --git a/ds.h b/ds.h
index 514679b..43cd4a6 100644
--- a/ds.h
+++ b/ds.h
@@ -112,6 +112,7 @@ struct port_defaults {
int path_trace_enabled;
int follow_up_info;
int freq_est_interval; /*log seconds*/
+ int fault_reset_seconds;
};
#endif
diff --git a/gPTP.cfg b/gPTP.cfg
index f186e78..90a55ac 100644
--- a/gPTP.cfg
+++ b/gPTP.cfg
@@ -20,6 +20,7 @@ logSyncInterval -3
logMinPdelayReqInterval 0
announceReceiptTimeout 3
delayAsymmetry 0
+fault_reset_seconds 15
#
# Run time options
#
diff --git a/ptp4l.8 b/ptp4l.8
index fadf854..791236c 100644
--- a/ptp4l.8
+++ b/ptp4l.8
@@ -181,6 +181,11 @@ The default is 0 (disabled).
Include the 802.1AS data in the Follow_Up messages if enabled.
The default is 0 (disabled).
.TP
+.B fault_reset_seconds
+The time in seconds between the detection of a port's fault and the fault
+being reset.
+The default is 15 (15 seconds).
+.TP
.B delay_mechanism
Select the delay mechanism. Possible values are E2E, P2P and Auto.
The default is E2E.
diff --git a/ptp4l.c b/ptp4l.c
index 4fc0c88..0ce6a5c 100644
--- a/ptp4l.c
+++ b/ptp4l.c
@@ -64,6 +64,7 @@ static struct config cfg_settings = {
.path_trace_enabled = 0,
.follow_up_info = 0,
.freq_est_interval = 1,
+ .fault_reset_seconds = 15,
},
.timestamping = TS_HARDWARE,
--
1.7.0.4
1.7.0.4