void handleFollowUp(MsgHeader *header, Octet *msgIbuf, ssize_t length, Boolean isFromSelf, PtpClock *ptpClock) { MsgFollowUp *follow; TimeInternal preciseOriginTimestamp; if(length < FOLLOW_UP_PACKET_LENGTH) { ERROR("short folow up message\n"); toState(PTP_FAULTY, ptpClock); return; } switch(ptpClock->port_state) { case PTP_SLAVE: if(isFromSelf) { DBG("handleFollowUp: ignore from self\n"); return; } if(getFlag(header->flags, PTP_SYNC_BURST) && !ptpClock->burst_enabled) return; DBGV("handleFollowUp: looking for uuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", ptpClock->parent_uuid[0], ptpClock->parent_uuid[1], ptpClock->parent_uuid[2], ptpClock->parent_uuid[3], ptpClock->parent_uuid[4], ptpClock->parent_uuid[5]); follow = &ptpClock->msgTmp.follow; msgUnpackFollowUp(ptpClock->msgIbuf, follow); if( ptpClock->waitingForFollow && follow->associatedSequenceId == ptpClock->parent_last_sync_sequence_number && header->sourceCommunicationTechnology == ptpClock->parent_communication_technology && header->sourcePortId == ptpClock->parent_port_id && !memcmp(header->sourceUuid, ptpClock->parent_uuid, PTP_UUID_LENGTH) ) { ptpClock->waitingForFollow = FALSE; toInternalTime(&preciseOriginTimestamp, &follow->preciseOriginTimestamp, &ptpClock->halfEpoch); updateOffset(&preciseOriginTimestamp, &ptpClock->sync_receive_time, &ptpClock->ofm_filt, ptpClock); updateClock(ptpClock); } else { DBGV("handleFollowUp: unwanted\n"); } break; default: DBGV("handleFollowUp: disreguard\n"); return; } }
static void handleFollowUp(PtpClock *ptpClock, Boolean isFromSelf) { TimeInternal preciseOriginTimestamp; TimeInternal correctionField; Boolean isFromCurrentParent = FALSE; DBGV("handleFollowup: received\n"); if (ptpClock->msgIbufLength < FOLLOW_UP_LENGTH) { ERROR("handleFollowup: short message\n"); toState(ptpClock, PTP_FAULTY); return; } if (isFromSelf) { DBGV("handleFollowup: ignore from self\n"); return; } switch (ptpClock->portDS.portState) { case PTP_INITIALIZING: case PTP_FAULTY: case PTP_DISABLED: case PTP_LISTENING: DBGV("handleFollowup: disreguard\n"); break; case PTP_UNCALIBRATED: case PTP_SLAVE: isFromCurrentParent = isSamePortIdentity( &ptpClock->parentDS.parentPortIdentity, &ptpClock->msgTmpHeader.sourcePortIdentity); if (!ptpClock->waitingForFollowUp) { DBGV("handleFollowup: not waiting a message\n"); break; } if (!isFromCurrentParent) { DBGV("handleFollowup: not from current parent\n"); break; } if (ptpClock->recvSyncSequenceId != ptpClock->msgTmpHeader.sequenceId) { DBGV("handleFollowup: SequenceID doesn't match with last Sync message\n"); break; } msgUnpackFollowUp(ptpClock->msgIbuf, &ptpClock->msgTmp.follow); ptpClock->waitingForFollowUp = FALSE; /* synchronize local clock */ toInternalTime(&preciseOriginTimestamp, &ptpClock->msgTmp.follow.preciseOriginTimestamp); scaledNanosecondsToInternalTime(&ptpClock->msgTmpHeader.correctionfield, &correctionField); addTime(&correctionField, &correctionField, &ptpClock->correctionField_sync); updateOffset(ptpClock, &ptpClock->timestamp_syncRecieve, &preciseOriginTimestamp, &correctionField); updateClock(ptpClock); issueDelayReqTimerExpired(ptpClock); break; case PTP_MASTER: DBGV("handleFollowup: from another master\n"); break; case PTP_PASSIVE: issueDelayReqTimerExpired(ptpClock); DBGV("handleFollowup: disreguard\n"); break; default: DBG("handleFollowup: unrecognized state\n"); break; }//Switch on (port_state) }
void handleFollowUp(MsgHeader *header, Octet *msgIbuf, ssize_t length, Boolean isFromSelf, RunTimeOpts *rtOpts, PtpClock *ptpClock) { DBGV("Handlefollowup : Follow up message received \n"); TimeInternal preciseOriginTimestamp; TimeInternal correctionField; Boolean isFromCurrentParent = FALSE; if (length < FOLLOW_UP_LENGTH) { ERROR("short Follow up message\n"); toState(PTP_FAULTY, rtOpts, ptpClock); return; } if (isFromSelf) { DBGV("Handlefollowup : Ignore message from self \n"); return; } switch (ptpClock->portState) { case PTP_INITIALIZING: case PTP_FAULTY: case PTP_DISABLED: case PTP_LISTENING: DBGV("Handfollowup : disregard\n"); return; case PTP_UNCALIBRATED: case PTP_SLAVE: isFromCurrentParent = !memcmp(ptpClock->parentPortIdentity.clockIdentity, header->sourcePortIdentity.clockIdentity, CLOCK_IDENTITY_LENGTH) && (ptpClock->parentPortIdentity.portNumber == header->sourcePortIdentity.portNumber); if (isFromCurrentParent) { if (ptpClock->waitingForFollow) { if ((ptpClock->recvSyncSequenceId == header->sequenceId)) { msgUnpackFollowUp(ptpClock->msgIbuf, &ptpClock->msgTmp.follow); ptpClock->waitingForFollow = FALSE; toInternalTime(&preciseOriginTimestamp, &ptpClock->msgTmp.follow.preciseOriginTimestamp); integer64_to_internalTime(ptpClock->msgTmpHeader.correctionfield, &correctionField); addTime(&correctionField,&correctionField, &ptpClock->lastSyncCorrectionField); /* send_time = preciseOriginTimestamp (received inside followup) recv_time = sync_receive_time (received as CMSG in handleEvent) */ updateOffset(&preciseOriginTimestamp, &ptpClock->sync_receive_time,&ptpClock->ofm_filt, rtOpts,ptpClock, &correctionField); updateClock(rtOpts,ptpClock); break; } else INFO("Ignored followup, SequenceID doesn't match with " "last Sync message \n"); } else DBG2("Ignored followup, Slave was not waiting a follow up " "message \n"); } else DBG2("Ignored, Follow up message is not from current parent \n"); case PTP_MASTER: case PTP_PASSIVE: DBGV("Ignored, Follow up message received from another master \n"); break; default: DBG("do unrecognized state1\n"); break; } /* Switch on (port_state) */ }