void handlePDelayRespFollowUp(MsgHeader *header, Octet *msgIbuf, ssize_t length, Boolean isFromSelf, RunTimeOpts *rtOpts, PtpClock *ptpClock){ if (ptpClock->delayMechanism == P2P) { TimeInternal responseOriginTimestamp; TimeInternal correctionField; DBGV("PdelayRespfollowup message received : \n"); if(length < PDELAY_RESP_FOLLOW_UP_LENGTH) { ERROR("short PDelayRespfollowup message\n"); toState(PTP_FAULTY, rtOpts, ptpClock); return; } switch(ptpClock->portState) { case PTP_INITIALIZING: case PTP_FAULTY: case PTP_DISABLED: case PTP_UNCALIBRATED: DBGV("HandlePdelayResp : disregard\n"); return; case PTP_SLAVE: case PTP_MASTER: if ((header->sequenceId == ptpClock->sentPDelayReqSequenceId-1) && (header->sequenceId == ptpClock->recvPDelayRespSequenceId)) { msgUnpackPDelayRespFollowUp( ptpClock->msgIbuf, &ptpClock->msgTmp.prespfollow); toInternalTime( &responseOriginTimestamp, &ptpClock->msgTmp.prespfollow.responseOriginTimestamp); ptpClock->pdelay_resp_send_time.seconds = responseOriginTimestamp.seconds; ptpClock->pdelay_resp_send_time.nanoseconds = responseOriginTimestamp.nanoseconds; integer64_to_internalTime( ptpClock->msgTmpHeader.correctionfield, &correctionField); addTime(&correctionField,&correctionField, &ptpClock->lastPdelayRespCorrectionField); updatePeerDelay (&ptpClock->owd_filt, rtOpts, ptpClock, &correctionField,TRUE); break; } default: DBGV("Disregard PdelayRespFollowUp message \n"); } } else { /* (End to End mode..) */ ERROR("Peer Delay messages are disregarded in End to End " "mode \n"); } }
static void handlePDelayRespFollowUp(PtpClock *ptpClock, Boolean isFromSelf) { TimeInternal responseOriginTimestamp; TimeInternal correctionField; switch (ptpClock->portDS.delayMechanism) { case E2E: ERROR("handlePDelayRespFollowUp: disreguard in E2E mode\n"); break; case P2P: DBGV("handlePDelayRespFollowUp: received\n"); if (ptpClock->msgIbufLength < PDELAY_RESP_FOLLOW_UP_LENGTH) { ERROR("handlePDelayRespFollowUp: short message\n"); toState(ptpClock, PTP_FAULTY); return; } switch (ptpClock->portDS.portState) { case PTP_INITIALIZING: case PTP_FAULTY: case PTP_DISABLED: case PTP_UNCALIBRATED: DBGV("handlePDelayRespFollowUp: disreguard\n"); return; case PTP_SLAVE: case PTP_MASTER: if (!ptpClock->waitingForPDelayRespFollowUp) { DBG("handlePDelayRespFollowUp: not waiting a message\n"); break; } if (ptpClock->msgTmpHeader.sequenceId == ptpClock->sentPDelayReqSequenceId - 1) { msgUnpackPDelayRespFollowUp(ptpClock->msgIbuf, &ptpClock->msgTmp.prespfollow); toInternalTime(&responseOriginTimestamp, &ptpClock->msgTmp.prespfollow.responseOriginTimestamp); ptpClock->pdelay_t3 = responseOriginTimestamp; scaledNanosecondsToInternalTime(&ptpClock->msgTmpHeader.correctionfield, &correctionField); addTime(&correctionField, &correctionField, &ptpClock->correctionField_pDelayResp); updatePeerDelay(ptpClock, &correctionField, TRUE); ptpClock->waitingForPDelayRespFollowUp = FALSE; break; } default: DBGV("handlePDelayRespFollowUp: unrecognized state\n"); } break; default: /* nothing */ break; } }