From: Mike Brady <4265913+mikebrady@users.noreply.github.com> Date: Sat, 5 Jun 2021 06:54:29 +0000 (+0100) Subject: Clock ID now stored following an announce rather than a follow_up. Require a clock... X-Git-Tag: 1.2~125 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2916f965e4bc40dd6e70bfef38593b1c83cdee1c;p=thirdparty%2Fnqptp.git Clock ID now stored following an announce rather than a follow_up. Require a clock to be valid before begin considered for mastership. Identification of a new master speeded up by one sample interval -- 125 ms. --- diff --git a/nqptp-clock-sources.c b/nqptp-clock-sources.c index a12119a..fbe5573 100644 --- a/nqptp-clock-sources.c +++ b/nqptp-clock-sources.c @@ -163,7 +163,7 @@ void update_master() { int best_so_far = -1; int timing_peer_count = 0; - uint32_t acceptance_mask = (1 << clock_is_qualified) | (1 << clock_is_a_timing_peer); + uint32_t acceptance_mask = (1 << clock_is_qualified) | (1 << clock_is_a_timing_peer) | (1 << clock_is_valid); for (i = 0; i < MAX_CLOCKS; i++) { if ((clocks_private[i].flags & acceptance_mask) == acceptance_mask) { // found a possible clock candidate diff --git a/nqptp-message-handlers.c b/nqptp-message-handlers.c index 2f06273..7417839 100644 --- a/nqptp-message-handlers.c +++ b/nqptp-message-handlers.c @@ -83,6 +83,12 @@ void handle_announce(char *buf, ssize_t recv_len, clock_source_private_data *clo if ((size_t)recv_len >= sizeof(struct ptp_announce_message)) { struct ptp_announce_message *msg = (struct ptp_announce_message *)buf; + uint64_t packet_clock_id = nctohl(&msg->header.clockIdentity[0]); + uint64_t packet_clock_id_low = nctohl(&msg->header.clockIdentity[4]); + packet_clock_id = packet_clock_id << 32; + packet_clock_id = packet_clock_id + packet_clock_id_low; + clock_private_info->clock_id = packet_clock_id; + int i; // number of elements in the array is 4, hence the 4-1 stuff for (i = 4 - 1; i > 1 - 1; i--) { @@ -212,15 +218,18 @@ void handle_announce(char *buf, ssize_t recv_len, clock_source_private_data *clo void handle_follow_up(char *buf, __attribute__((unused)) ssize_t recv_len, clock_source_private_data *clock_private_info, uint64_t reception_time) { + clock_private_info->flags |= (1 << clock_is_valid); if ((clock_private_info->flags & (1 << clock_is_master)) != 0) { debug(2, "FOLLOWUP from %" PRIx64 ", %s.", clock_private_info->clock_id, &clock_private_info->ip); struct ptp_follow_up_message *msg = (struct ptp_follow_up_message *)buf; +/* uint64_t packet_clock_id = nctohl(&msg->header.clockIdentity[0]); uint64_t packet_clock_id_low = nctohl(&msg->header.clockIdentity[4]); packet_clock_id = packet_clock_id << 32; packet_clock_id = packet_clock_id + packet_clock_id_low; +*/ uint16_t seconds_hi = nctohs(&msg->follow_up.preciseOriginTimestamp[0]); uint32_t seconds_low = nctohl(&msg->follow_up.preciseOriginTimestamp[2]); @@ -290,11 +299,11 @@ void handle_follow_up(char *buf, __attribute__((unused)) ssize_t recv_len, uint32_t old_flags = clock_private_info->flags; - if ((clock_private_info->flags & (1 << clock_is_valid)) == 0) { - debug(1, "clock %" PRIx64 " is now valid at: %s", packet_clock_id, clock_private_info->ip); - } - clock_private_info->clock_id = packet_clock_id; - clock_private_info->flags |= (1 << clock_is_valid); + //if ((clock_private_info->flags & (1 << clock_is_valid)) == 0) { + // debug(1, "clock %" PRIx64 " is now valid at: %s", packet_clock_id, clock_private_info->ip); + //} + + // clock_private_info->clock_id = packet_clock_id; clock_private_info->local_time = reception_time; clock_private_info->origin_time = preciseOriginTimestamp; clock_private_info->local_to_source_time_offset = offset;