diff --git a/makefile b/makefile index 9c29c50..c559288 100644 --- a/makefile +++ b/makefile @@ -25,7 +25,7 @@ LDFLAGS = LDLIBS = -lm -lrt PRG = linuxptp OBJ = bmc.o clock.o fsm.o linuxptp.o msg.o phc.o pi.o port.o print.o \ - servo.o transport.o udp.o util.o + servo.o tmtab.o transport.o udp.o util.o SRC = $(OBJ:.o=.c) DEPEND = $(OBJ:.o=.d) diff --git a/tmtab.c b/tmtab.c new file mode 100644 index 0000000..7fa9f50 --- /dev/null +++ b/tmtab.c @@ -0,0 +1,54 @@ +/** + * @file tmtab.c + * @note Copyright (C) 2011 Richard Cochran + * + * 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 new file mode 100644 index 0000000..9b80cc6 --- /dev/null +++ b/tmtab.h @@ -0,0 +1,56 @@ +/** + * @file tmtab.h + * @brief Implements a table of time out values. + * @note Copyright (C) 2011 Richard Cochran + * + * 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 + +/* + * 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