static void handlePDelayReq(PtpClock *ptpClock, TimeInternal *time, Boolean isFromSelf) { switch (ptpClock->portDS.delayMechanism) { case E2E: ERROR("handlePDelayReq: disreguard in E2E mode\n"); break; case P2P: DBGV("handlePDelayReq: recieved\n"); if (ptpClock->msgIbufLength < PDELAY_REQ_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_PASSIVE: case PTP_SLAVE: case PTP_MASTER: if (isFromSelf) { DBGV("handlePDelayReq: ignore from self\n"); break; } // if (isFromSelf) /* && loopback mode */ // { // /* Get sending timestamp from IP stack with So_TIMESTAMP*/ // ptpClock->pdelay_req_send_time = *time; // // /*Add latency*/ // addTime(&ptpClock->pdelay_req_send_time, &ptpClock->pdelay_req_send_time, &rtOpts->outboundLatency); // break; // } // else // { //ptpClock->PdelayReqHeader = ptpClock->msgTmpHeader; issuePDelayResp(ptpClock, time, &ptpClock->msgTmpHeader); if ((time->seconds != 0) && getFlag(ptpClock->msgTmpHeader.flagField[0], FLAG0_TWO_STEP)) /* not loopback mode */ { issuePDelayRespFollowUp(ptpClock, time, &ptpClock->msgTmpHeader); } 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"); } }