/* Pack Announce message into out buffer of ppi */ static int msg_pack_announce(struct pp_instance *ppi) { void *buf; buf = ppi->tx_ptp; /* changes in header */ *(char *)(buf + 0) = *(char *)(buf + 0) & 0xF0; /* RAZ messageType */ *(char *)(buf + 0) = *(char *)(buf + 0) | 0x0B; /* Table 19 */ *(UInteger16 *) (buf + 2) = htons(PP_ANNOUNCE_LENGTH); ppi->sent_seq[PPM_ANNOUNCE]++; *(UInteger16 *) (buf + 30) = htons(ppi->sent_seq[PPM_ANNOUNCE]); *(UInteger8 *) (buf + 32) = 0x05; /* Table 23 */ *(Integer8 *) (buf + 33) = DSPOR(ppi)->logAnnounceInterval; /* Announce message */ memset((buf + 34), 0, 10); *(Integer16 *) (buf + 44) = htons(DSPRO(ppi)->currentUtcOffset); *(UInteger8 *) (buf + 47) = DSPAR(ppi)->grandmasterPriority1; *(UInteger8 *) (buf + 48) = DSDEF(ppi)->clockQuality.clockClass; *(Enumeration8 *) (buf + 49) = DSDEF(ppi)->clockQuality.clockAccuracy; *(UInteger16 *) (buf + 50) = htons(DSDEF(ppi)->clockQuality.offsetScaledLogVariance); *(UInteger8 *) (buf + 52) = DSPAR(ppi)->grandmasterPriority2; memcpy((buf + 53), &DSPAR(ppi)->grandmasterIdentity, PP_CLOCK_IDENTITY_LENGTH); *(UInteger16 *) (buf + 61) = htons(DSCUR(ppi)->stepsRemoved); *(Enumeration8 *) (buf + 63) = DSPRO(ppi)->timeSource; if (pp_hooks.pack_announce) return pp_hooks.pack_announce(ppi); return PP_ANNOUNCE_LENGTH; }
/* ppi->port_idx port is synchronized to Ebest Table 16 (9.3.5) of the spec. */ static void s1(struct pp_instance *ppi, MsgHeader *hdr, MsgAnnounce *ann) { struct DSParent *parent = DSPAR(ppi); struct DSTimeProperties *prop = DSPRO(ppi); /* Current DS */ DSCUR(ppi)->stepsRemoved = ann->stepsRemoved + 1; /* Parent DS */ parent->parentPortIdentity = hdr->sourcePortIdentity; parent->grandmasterIdentity = ann->grandmasterIdentity; parent->grandmasterClockQuality = ann->grandmasterClockQuality; parent->grandmasterPriority1 = ann->grandmasterPriority1; parent->grandmasterPriority2 = ann->grandmasterPriority2; /* Timeproperties DS */ prop->timeSource = ann->timeSource; if (prop->currentUtcOffset != ann->currentUtcOffset) { pp_diag(ppi, bmc, 1, "New UTC offset: %i\n", ann->currentUtcOffset); prop->currentUtcOffset = ann->currentUtcOffset; ppi->t_ops->set(ppi, NULL); } /* FIXME: can't we just copy the bit keeping values? */ prop->currentUtcOffsetValid = ((hdr->flagField[1] & FFB_UTCV) != 0); prop->leap59 = ((hdr->flagField[1] & FFB_LI59) != 0); prop->leap61 = ((hdr->flagField[1] & FFB_LI61) != 0); prop->timeTraceable = ((hdr->flagField[1] & FFB_TTRA) != 0); prop->frequencyTraceable = ((hdr->flagField[1] & FFB_FTRA) != 0); prop->ptpTimescale = ((hdr->flagField[1] & FFB_PTP) != 0); if (pp_hooks.s1) pp_hooks.s1(ppi, hdr, ann); }
/* ppi->port_idx port is becoming Master. Table 13 (9.3.5) of the spec. */ void m1(struct pp_instance *ppi) { struct DSParent *parent = DSPAR(ppi); struct DSDefault *defds = DSDEF(ppi); /* Current data set update */ DSCUR(ppi)->stepsRemoved = 0; clear_TimeInternal(&DSCUR(ppi)->offsetFromMaster); clear_TimeInternal(&DSCUR(ppi)->meanPathDelay); /* Parent data set: we are the parent */ memset(parent, 0, sizeof(*parent)); parent->parentPortIdentity.clockIdentity = defds->clockIdentity; /* FIXME: the port? */ /* Copy grandmaster params from our defds (FIXME: is ir right?) */ parent->grandmasterIdentity = defds->clockIdentity; parent->grandmasterClockQuality = defds->clockQuality; parent->grandmasterPriority1 = defds->priority1; parent->grandmasterPriority2 = defds->priority2; /* Time Properties data set */ DSPRO(ppi)->timeSource = INTERNAL_OSCILLATOR; }