Instead of maintaining a table of precalculated values, use the
newly added set_tmo_random() function to set the delay request timeout.
It saves some memory and improves the timeout granularity, but has a
higher computational cost. It follows the requirements from section
9.5.11.2 of the spec.
Signed-off-by: Miroslav Lichvar <***@redhat.com>
---
makefile | 2 +-
port.c | 15 +++------------
tmtab.c | 54 ------------------------------------------------------
tmtab.h | 56 --------------------------------------------------------
4 files changed, 4 insertions(+), 123 deletions(-)
delete mode 100644 tmtab.c
delete mode 100644 tmtab.h
diff --git a/makefile b/makefile
index d79a1df..f5fcc7b 100644
--- a/makefile
+++ b/makefile
@@ -33,7 +33,7 @@ CFLAGS = -Wall $(VER) $(INC) $(DEBUG) $(FEAT_CFLAGS) $(EXTRA_CFLAGS)
LDLIBS = -lm -lrt $(EXTRA_LDFLAGS)
PRG = ptp4l pmc phc2sys hwstamp_ctl
OBJ = bmc.o clock.o clockadj.o config.o fault.o fsm.o ptp4l.o mave.o \
- msg.o phc.o pi.o port.o print.o raw.o servo.o sk.o stats.o tlv.o tmtab.o \
+ msg.o phc.o pi.o port.o print.o raw.o servo.o sk.o stats.o tlv.o \
transport.o udp.o udp6.o uds.o util.o version.o
OBJECTS = $(OBJ) hwstamp_ctl.o phc2sys.o pmc.o pmc_common.o sysoff.o
diff --git a/port.c b/port.c
index e2f319d..39c285d 100644
--- a/port.c
+++ b/port.c
@@ -32,7 +32,6 @@
#include "print.h"
#include "sk.h"
#include "tlv.h"
-#include "tmtab.h"
#include "tmv.h"
#include "util.h"
@@ -80,7 +79,6 @@ struct port {
UInteger16 delayreq;
UInteger16 sync;
} seqnum;
- struct tmtab tmtab;
tmv_t peer_delay;
struct mave *avg_delay;
int log_sync_interval;
@@ -815,17 +813,13 @@ static int port_set_announce_tmo(struct port *p)
static int port_set_delay_tmo(struct port *p)
{
- struct itimerspec tmo = {
- {0, 0}, {0, 0}
- };
- int index;
if (p->delayMechanism == DM_P2P) {
return set_tmo_log(p->fda.fd[FD_DELAY_TIMER], 1,
p->logMinPdelayReqInterval);
+ } else {
+ return set_tmo_random(p->fda.fd[FD_DELAY_TIMER], 0, 2,
+ p->logMinDelayReqInterval);
}
- index = random() % TMTAB_MAX;
- tmo.it_value = p->tmtab.ts[index];
- return timerfd_settime(p->fda.fd[FD_DELAY_TIMER], 0, &tmo, NULL);
}
static int port_set_manno_tmo(struct port *p)
@@ -1327,8 +1321,6 @@ static int port_initialize(struct port *p)
p->logMinPdelayReqInterval = p->pod.logMinPdelayReqInterval;
p->neighborPropDelayThresh = p->pod.neighborPropDelayThresh;
- tmtab_init(&p->tmtab, 1 + p->logMinDelayReqInterval);
-
for (i = 0; i < N_TIMER_FDS; i++) {
fd[i] = -1;
}
@@ -1534,7 +1526,6 @@ static void process_delay_resp(struct port *p, struct ptp_message *m)
p->logMinDelayReqInterval = rsp->hdr.logMessageInterval;
pr_notice("port %hu: minimum delay request interval 2^%d",
portnum(p), p->logMinDelayReqInterval);
- tmtab_init(&p->tmtab, 1 + p->logMinDelayReqInterval);
}
}
diff --git a/tmtab.c b/tmtab.c
deleted file mode 100644
index 7fa9f50..0000000
--- a/tmtab.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * @file tmtab.c
- * @note Copyright (C) 2011 Richard Cochran <***@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#include "tmtab.h"
-#include "tmv.h"
-
-void tmtab_init(struct tmtab *tt, int log_seconds)
-{
- int i;
- struct timespec incr, ts = {0, 0};
- uint64_t max, min;
-
- if (log_seconds < 0) {
- log_seconds *= -1;
- for (i = 1, max = 500000000ULL; i < log_seconds; i++) {
- max >>= 1;
- }
- } else {
- for (i = 0, max = 1000000000ULL; i < log_seconds; i++) {
- max <<= 1;
- }
- }
-
- min = max / (TMTAB_MAX - 1ULL);
-
- incr.tv_sec = min / 1000000000ULL;
- incr.tv_nsec = min % 1000000000ULL;
-
- for (i = 0; i < TMTAB_MAX; i++) {
- ts.tv_sec += incr.tv_sec;
- ts.tv_nsec += incr.tv_nsec;
- while (ts.tv_nsec >= NS_PER_SEC) {
- ts.tv_nsec -= NS_PER_SEC;
- ts.tv_sec++;
- }
- tt->ts[i] = ts;
- }
-}
-
diff --git a/tmtab.h b/tmtab.h
deleted file mode 100644
index 9b80cc6..0000000
--- a/tmtab.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * @file tmtab.h
- * @brief Implements a table of time out values.
- * @note Copyright (C) 2011 Richard Cochran <***@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#ifndef HAVE_TMTAB_H
-#define HAVE_TMTAB_H
-
-#include <time.h>
-
-/*
- * Let 'D' be the logMinDelayReqInterval
- * and 'S' be the logSyncInterval.
- *
- * The delay request interval ranges from zero to 2^{D+1} seconds.
- * The standard requires that
- *
- * S <= D <= S+5
- *
- * and the timeout granularity not more than 2^{S-4} seconds.
- * Thus, the minimum required number of grains is given by
- *
- * 2^{D+1} / 2^{S-4} = 2^{D-S+5}
- *
- * and finds a minimum of 2^5 and a maximum of 2^10.
- *
- * The timeout table allows for the maximum number of grains required.
- *
- * Note that the table is made to be biased so that when sampling the
- * table randomly, the average delay value will be slightly larger
- * than logMinDelayReqInterval, in order to satisfy the wording of the
- * standard.
- */
-#define TMTAB_MAX 1024
-
-struct tmtab {
- struct timespec ts[TMTAB_MAX];
-};
-
-void tmtab_init(struct tmtab *tt, int log_seconds);
-
-#endif
--
1.8.3.1