The first half of the telecom algorithm differs from the one in 1588,
making use of profile specific "localPriority" attributes.

Signed-off-by: Richard Cochran <richardcoch...@gmail.com>
---
 bmc.h     | 12 +++++++++++
 makefile  |  2 +-
 telecom.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 86 insertions(+), 1 deletion(-)
 create mode 100644 telecom.c

diff --git a/bmc.h b/bmc.h
index 30fd443..b15bbc9 100644
--- a/bmc.h
+++ b/bmc.h
@@ -55,4 +55,16 @@ int dscmp(struct dataset *a, struct dataset *b);
  */
 int dscmp2(struct dataset *a, struct dataset *b);
 
+/**
+ * Compare two data sets using the algorithm defined in the Telecom
+ * Profile according to ITU-T G.8275.1.
+ *
+ * @param a A dataset to compare.
+ * @param b A dataset to compare.
+ * @return An integer less than, equal to, or greater than zero
+ *         if the dataset @a a is found, respectively, to be
+ *         less than, to match, or be greater than @a b.
+ */
+int telecom_dscmp(struct dataset *a, struct dataset *b);
+
 #endif
diff --git a/makefile b/makefile
index f898336..7e870ab 100644
--- a/makefile
+++ b/makefile
@@ -25,7 +25,7 @@ LDLIBS        = -lm -lrt $(EXTRA_LDFLAGS)
 PRG    = ptp4l pmc phc2sys hwstamp_ctl phc_ctl timemaster
 OBJ     = bmc.o clock.o clockadj.o clockcheck.o config.o fault.o \
  filter.o fsm.o hash.o linreg.o mave.o mmedian.o msg.o ntpshm.o nullf.o phc.o \
- pi.o port.o print.o ptp4l.o raw.o rtnl.o servo.o sk.o stats.o tlv.o \
+ pi.o port.o print.o ptp4l.o raw.o rtnl.o servo.o sk.o stats.o telecom.o tlv.o 
\
  transport.o tsproc.o udp.o udp6.o uds.o util.o version.o
 
 OBJECTS        = $(OBJ) hwstamp_ctl.o phc2sys.o phc_ctl.o pmc.o pmc_common.o \
diff --git a/telecom.c b/telecom.c
new file mode 100644
index 0000000..505ce2f
--- /dev/null
+++ b/telecom.c
@@ -0,0 +1,73 @@
+/**
+ * @file telecom.c
+ * @note Copyright (C) 2017 Richard Cochran <richardcoch...@gmail.com>
+ *
+ * Derived from code in bmc.c.
+ *
+ * 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 <string.h>
+
+#include "bmc.h"
+#include "ds.h"
+
+int telecom_dscmp(struct dataset *a, struct dataset *b)
+{
+       int diff;
+
+       if (a == b)
+               return 0;
+       if (a && !b)
+               return A_BETTER;
+       if (b && !a)
+               return B_BETTER;
+
+       if (a->quality.clockClass < b->quality.clockClass)
+               return A_BETTER;
+       if (a->quality.clockClass > b->quality.clockClass)
+               return B_BETTER;
+
+       if (a->quality.clockAccuracy < b->quality.clockAccuracy)
+               return A_BETTER;
+       if (a->quality.clockAccuracy > b->quality.clockAccuracy)
+               return B_BETTER;
+
+       if (a->quality.offsetScaledLogVariance <
+           b->quality.offsetScaledLogVariance)
+               return A_BETTER;
+       if (a->quality.offsetScaledLogVariance >
+           b->quality.offsetScaledLogVariance)
+               return B_BETTER;
+
+       if (a->priority2 < b->priority2)
+               return A_BETTER;
+       if (a->priority2 > b->priority2)
+               return B_BETTER;
+
+       if (a->localPriority < b->localPriority)
+               return A_BETTER;
+       if (a->localPriority > b->localPriority)
+               return B_BETTER;
+
+       if (a->quality.clockClass <= 127)
+               return dscmp2(a, b);
+
+       diff = memcmp(&a->identity, &b->identity, sizeof(a->identity));
+
+       if (!diff)
+               return dscmp2(a, b);
+
+       return diff < 0 ? A_BETTER : B_BETTER;
+}
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to