void issueDelayReq(PtpClock *ptpClock) { TimeInternal internalTime; TimeRepresentation originTimestamp; ptpClock->sentDelayReq = TRUE; ptpClock->sentDelayReqSequenceId = ++ptpClock->last_sync_event_sequence_number; /* try to predict outgoing time stamp */ getTime(&internalTime, ptpClock); fromInternalTime(&internalTime, &originTimestamp, ptpClock->halfEpoch); msgPackDelayReq(ptpClock->msgObuf, FALSE, FALSE, &originTimestamp, ptpClock); if(!netSendEvent(ptpClock->msgObuf, DELAY_REQ_PACKET_LENGTH, ptpClock->delayedTiming ? &internalTime : NULL, ptpClock)) toState(PTP_FAULTY, ptpClock); else { DBGV("sent delay request message\n"); if(ptpClock->delayedTiming) { if (internalTime.seconds || internalTime.nanoseconds) { /* compensate with configurable latency, then store for later use */ addTime(&internalTime, &internalTime, &ptpClock->runTimeOpts.outboundLatency); ptpClock->delay_req_send_time = internalTime; } else { NOTIFY("WARNING: delay request message without hardware time stamp, will skip response\n"); ptpClock->sentDelayReq = FALSE; } } } }
/*Pack and send on event multicast ip adress a DelayReq message*/ static void issueDelayReq(PtpClock *ptpClock) { Timestamp originTimestamp; TimeInternal internalTime; getTime(&internalTime); fromInternalTime(&internalTime, &originTimestamp); msgPackDelayReq(ptpClock, ptpClock->msgObuf, &originTimestamp); if (!netSendEvent(&ptpClock->netPath, ptpClock->msgObuf, DELAY_REQ_LENGTH, &internalTime)) { ERROR("issueDelayReq: can't sent\n"); toState(ptpClock, PTP_FAULTY); } else { DBGV("issueDelayReq\n"); ptpClock->sentDelayReqSequenceId++; /* Delay req TX timestamp is valid */ if (internalTime.seconds != 0) { addTime(&internalTime, &internalTime, &ptpClock->outboundLatency); ptpClock->timestamp_delayReqSend = internalTime; } } }
void issueDelayReq(RunTimeOpts *rtOpts, PtpClock *ptpClock) { TimeInternal internalTime; TimeRepresentation originTimestamp; ptpClock->sentDelayReq = TRUE; ptpClock->sentDelayReqSequenceId = ++ptpClock->last_sync_event_sequence_number; getTime(&internalTime); fromInternalTime(&internalTime, &originTimestamp, ptpClock->halfEpoch); msgPackDelayReq(ptpClock->msgObuf, FALSE, &originTimestamp, ptpClock); if(!netSendEvent(ptpClock->msgObuf, DELAY_REQ_PACKET_LENGTH, &ptpClock->netPath)) toState(PTP_FAULTY, rtOpts, ptpClock); else DBGV("sent delay request message\n"); }
/*Pack and send on event multicast ip adress a DelayReq message*/ void issueDelayReq(RunTimeOpts *rtOpts,PtpClock *ptpClock) { Timestamp originTimestamp; TimeInternal internalTime; DBG("==> Issue DelayReq (%d)\n", ptpClock->sentDelayReqSequenceId ); /* call GTOD. This time is later replaced on handle_delayreq, to get the actual send timestamp from the OS */ getTime(&internalTime); fromInternalTime(&internalTime,&originTimestamp); // uses current sentDelayReqSequenceId msgPackDelayReq(ptpClock->msgObuf,&originTimestamp,ptpClock); Integer32 dst = 0; #ifdef PTP_EXPERIMENTAL if (rtOpts->do_hybrid_mode) { dst = ptpClock->MasterAddr; } #endif if (!netSendEvent(ptpClock->msgObuf,DELAY_REQ_LENGTH, &ptpClock->netPath, dst)) { toState(PTP_FAULTY,rtOpts,ptpClock); DBGV("delayReq message can't be sent -> FAULTY state \n"); } else { DBGV("DelayReq MSG sent ! \n"); ptpClock->sentDelayReqSequenceId++; /* From now on, we will only accept delayreq and delayresp of (sentDelayReqSequenceId - 1) */ /* Explicitelly re-arm timer for sending the next delayReq */ timerStart_random(DELAYREQ_INTERVAL_TIMER, pow(2,ptpClock->logMinDelayReqInterval), ptpClock->itimer); } }