diff --git a/bmc.h b/bmc.h index 30fd443..3f4b5fa 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 + * Profiles according to ITU-T G.8275.1 and G.8275.2. + * + * @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 17189e6..d34eb6b 100644 --- a/makefile +++ b/makefile @@ -25,7 +25,7 @@ LDLIBS = -lm -lrt $(EXTRA_LDFLAGS) PRG = ptp4l hwstamp_ctl nsm phc2sys phc_ctl pmc 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 nsm.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..6119800 --- /dev/null +++ b/telecom.c @@ -0,0 +1,73 @@ +/** + * @file telecom.c + * @note Copyright (C) 2017 Richard Cochran + * + * 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-1335 USA. + */ +#include + +#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; +}