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; } }
static void handlePDelayResp(PtpClock *ptpClock, TimeInternal *time, Boolean isFromSelf) { TimeInternal requestReceiptTimestamp; TimeInternal correctionField; Boolean isCurrentRequest; switch (ptpClock->portDS.delayMechanism) { case E2E: ERROR("handlePDelayReq: disreguard in E2E mode\n"); break; case P2P: DBGV("handlePDelayReq: received\n"); if (ptpClock->msgIbufLength < PDELAY_RESP_LENGTH) { ERROR("handlePDelayReq: short message\n"); toState(ptpClock, PTP_FAULTY); return; } switch (ptpClock->portDS.portState) { case PTP_INITIALIZING: case PTP_FAULTY: case PTP_DISABLED: case PTP_UNCALIBRATED: case PTP_LISTENING: DBGV("handlePDelayReq: disreguard\n"); return; case PTP_MASTER: case PTP_SLAVE: if (isFromSelf) { DBGV("handlePDelayReq: ignore from self\n"); break; } // if (isFromSelf) && loopback mode // { // addTime(time, time, &rtOpts->outboundLatency); // issuePDelayRespFollowUp(time, ptpClock); // break; // } msgUnpackPDelayResp(ptpClock->msgIbuf, &ptpClock->msgTmp.presp); isCurrentRequest = isSamePortIdentity( &ptpClock->portDS.portIdentity, &ptpClock->msgTmp.presp.requestingPortIdentity); if (((ptpClock->sentPDelayReqSequenceId - 1) == ptpClock->msgTmpHeader.sequenceId) && isCurrentRequest) { if (getFlag(ptpClock->msgTmpHeader.flagField[0], FLAG0_TWO_STEP)) { ptpClock->waitingForPDelayRespFollowUp = TRUE; /*Store t4 (Fig 35)*/ ptpClock->pdelay_t4 = *time; /*store t2 (Fig 35)*/ toInternalTime(&requestReceiptTimestamp, &ptpClock->msgTmp.presp.requestReceiptTimestamp); ptpClock->pdelay_t2 = requestReceiptTimestamp; scaledNanosecondsToInternalTime(&ptpClock->msgTmpHeader.correctionfield, &correctionField); ptpClock->correctionField_pDelayResp = correctionField; }//Two Step Clock else //One step Clock { ptpClock->waitingForPDelayRespFollowUp = FALSE; /*Store t4 (Fig 35)*/ ptpClock->pdelay_t4 = *time; scaledNanosecondsToInternalTime(&ptpClock->msgTmpHeader.correctionfield, &correctionField); updatePeerDelay(ptpClock, &correctionField, FALSE); } } else { DBGV("handlePDelayReq: PDelayResp doesn't match with the PDelayReq.\n"); } break; default: DBG("handlePDelayReq: unrecognized state\n"); break; } break; default: /* nothing */ break; } }
void handlePDelayResp(MsgHeader *header, Octet *msgIbuf, TimeInternal *time, ssize_t length, Boolean isFromSelf, RunTimeOpts *rtOpts, PtpClock *ptpClock) { if (ptpClock->delayMechanism == P2P) { /* Boolean isFromCurrentParent = FALSE; NOTE: This is never used in this function */ TimeInternal requestReceiptTimestamp; TimeInternal correctionField; DBGV("PdelayResp message received : \n"); if (length < PDELAY_RESP_LENGTH) { ERROR("short PDelayResp message\n"); toState(PTP_FAULTY, rtOpts, ptpClock); return; } switch (ptpClock->portState ) { case PTP_INITIALIZING: case PTP_FAULTY: case PTP_DISABLED: case PTP_UNCALIBRATED: case PTP_LISTENING: DBGV("HandlePdelayResp : disregard\n"); return; case PTP_SLAVE: case PTP_MASTER: if (ptpClock->twoStepFlag && isFromSelf) { addTime(time,time,&rtOpts->outboundLatency); issuePDelayRespFollowUp(time, &ptpClock->PdelayReqHeader, rtOpts,ptpClock); break; } msgUnpackPDelayResp(ptpClock->msgIbuf, &ptpClock->msgTmp.presp); #if 0 /* NOTE: This is never used in this function. Should it? */ isFromCurrentParent = !memcmp(ptpClock->parentPortIdentity.clockIdentity, header->sourcePortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH) && (ptpClock->parentPortIdentity.portNumber == header->sourcePortIdentity.portNumber); #endif if (!((ptpClock->sentPDelayReqSequenceId == header->sequenceId) && (!memcmp(ptpClock->portIdentity.clockIdentity,ptpClock->msgTmp.presp.requestingPortIdentity.clockIdentity,CLOCK_IDENTITY_LENGTH)) && ( ptpClock->portIdentity.portNumber == ptpClock->msgTmp.presp.requestingPortIdentity.portNumber))) { /* Two Step Clock */ if ((header->flagField[0] & PTP_TWO_STEP) == PTP_TWO_STEP) { /*Store t4 (Fig 35)*/ ptpClock->pdelay_resp_receive_time.seconds = time->seconds; ptpClock->pdelay_resp_receive_time.nanoseconds = time->nanoseconds; /*store t2 (Fig 35)*/ toInternalTime(&requestReceiptTimestamp, &ptpClock->msgTmp.presp.requestReceiptTimestamp); ptpClock->pdelay_req_receive_time.seconds = requestReceiptTimestamp.seconds; ptpClock->pdelay_req_receive_time.nanoseconds = requestReceiptTimestamp.nanoseconds; integer64_to_internalTime(header->correctionfield,&correctionField); ptpClock->lastPdelayRespCorrectionField.seconds = correctionField.seconds; ptpClock->lastPdelayRespCorrectionField.nanoseconds = correctionField.nanoseconds; break; } else { /* One step Clock */ /*Store t4 (Fig 35)*/ ptpClock->pdelay_resp_receive_time.seconds = time->seconds; ptpClock->pdelay_resp_receive_time.nanoseconds = time->nanoseconds; integer64_to_internalTime(header->correctionfield,&correctionField); updatePeerDelay (&ptpClock->owd_filt,rtOpts,ptpClock,&correctionField,FALSE); break; } ptpClock->recvPDelayRespSequenceId = header->sequenceId; } else { DBGV("HandlePdelayResp : Pdelayresp doesn't " "match with the PdelayReq. \n"); break; } break; /* XXX added by gnn for safety */ default: DBG("do unrecognized state4\n"); break; } } else { /* (End to End mode..) */ ERROR("Peer Delay messages are disregarded in End to End " "mode \n"); } }