flexPTP 1.0
An IEEE 1588 PTP implementation designed for microcontrollers
Loading...
Searching...
No Matches
master.c
Go to the documentation of this file.
1#include "master.h"
2
3#include "common.h"
4#include "flexptp_options.h"
5#include "format_utils.h"
6#include "msg_utils.h"
7#include "ptp_core.h"
8#include "ptp_defs.h"
10#include "ptp_sync_cycle_data.h"
11#include "ptp_types.h"
12#include "task_ptp.h"
13#include "timeutils.h"
14#include "tlv.h"
15
16#include <inttypes.h>
17#include <string.h>
18
19#include "minmax.h"
20
22#define S (gPtpCoreState)
24
25/*
26 * Message headaers and compiled bodies. They can be statically
27 * allocated, since nothing depends on the Announce message
28 * and a Follow_Up is always triggered by the transmission of
29 * a Sync. TODO: Maybe Sync transmissions should be constrained,
30 * so that no new Sync transmission would be scheduled if the Follow_Up
31 * was in the queue.
32 */
39
43 announceHeader.transportSpecific = (uint8_t)S.profile.transportSpecific;
45 announceHeader.domainNumber = S.profile.domainNumber;
46 // announceHeader.flags.PTP_TWO_STEP = true;
50
51 memcpy(&announceHeader.clockIdentity, &S.hwoptions.clockIdentity, 8);
52
55 announceHeader.logMessagePeriod = S.profile.logAnnouncePeriod;
56
57 // insert TLVs from the profile
62
65}
66
67static void ptp_init_sync_header() {
69 syncHeader.transportSpecific = S.profile.transportSpecific;
71 syncHeader.transportSpecific = (uint8_t)S.profile.transportSpecific;
73 syncHeader.domainNumber = S.profile.domainNumber;
75 // syncHeader.flags.PTP_TIMESCALE = false;
78
79 memcpy(&syncHeader.clockIdentity, &S.hwoptions.clockIdentity, 8);
80
83 syncHeader.logMessagePeriod = S.profile.logSyncPeriod;
84
85 // insert TLVs from the profile
90
91 // save message sizes
92 sync_.size = PTP_PCKT_SIZE_SYNC + tlvSize;
94}
95
97 // insert TLVs from the profile
103}
104
106 // set sequence ID
107 announceHeader.sequenceID = S.master.messaging.announceSequenceID++;
108 announceHeader.transportSpecific = S.profile.transportSpecific;
109
110 // fill-in fields
112 ptp_write_binary_timestamps(announce.data, &zeroTs, 1); // insert an empty timestamp
113 ptp_construct_binary_announce_message(announce.data, &S.capabilities); // insert Announce body
114
115 // setup packet
117 announce.pTxCb = NULL;
118 announce.tx_dm = S.profile.delayMechanism;
122
123 // send message
125}
126
127static void ptp_send_follow_up(const RawPtpMessage *pMsg) {
128 // fetch header from preceding Sync
129 PtpHeader header;
130 ptp_extract_header(&header, pMsg->data);
131 TimestampI t1 = pMsg->ts;
132
133 // modify header fields
134 header.minorVersionPTP = 0;
135 header.transportSpecific = S.profile.transportSpecific;
137 header.messageLength = followUp.size;
138 header.control = PTP_CON_Follow_Up;
139 // ptp_clear_flags(&(header.flags));
140
141 // write fields
142 ptp_construct_binary_header(followUp.data, &header); // insert header
143 ptp_write_binary_timestamps(followUp.data, &t1, 1); // insert t1 timestamp
144
145 // setup packet
147 followUp.pTxCb = NULL;
148 followUp.tx_dm = S.profile.delayMechanism;
152
153 // transmit
155}
156
158 // set sequence ID
159 syncHeader.sequenceID = S.master.messaging.syncSequenceID++;
160
161 // fill-in fields
163 ptp_write_binary_timestamps(sync_.data, &zeroTs, 1); // insert an empty timestamp (TWO_STEP -> "reserved")
164
165 // setup packet
168 sync_.tx_dm = S.profile.delayMechanism;
171 sync_.ttl = FLEXPTP_RANDOM_TAGGED_MESSAGE_TTL_TICKS; // S.master.syncTickPeriod;
172
173 // send message
175}
176
177static void ptp_send_delay_resp_message(const RawPtpMessage *pRawMsg, const PtpHeader *pHeader) {
178 RawPtpMessage delRespMsg = {0};
179
180 PtpHeader header = *pHeader; // make a copy
181 header.minorVersionPTP = 0;
182 TimestampI t4 = pRawMsg->ts; // fetch t4 timestamp
183
184 // create requestingSourcePortIdentity based on clockId from the header
185 PtpDelay_RespIdentification reqDelRespId = {header.clockIdentity, header.sourcePortID};
186
187 // modify header fields
188 header.messageType = PTP_MT_Delay_Resp; // change message type
189 ptp_clear_flags(&header.flags); // clear flags
190 header.flags.PTP_TWO_STEP = true; // set TWO_STEP flag
191 header.sourcePortID = PTP_PORT_ID; // set source port number
192 header.messageLength = PTP_PCKT_SIZE_DELAY_RESP; // set appropriate size
193 header.clockIdentity = S.hwoptions.clockIdentity; // set our clock identity
195
196 // write fields
197 ptp_construct_binary_header(delRespMsg.data, &header); // HEADER
198 ptp_write_binary_timestamps(delRespMsg.data, &t4, 1); // t4 TIMESTAMP
199 ptp_write_delay_resp_id_data(delRespMsg.data, &reqDelRespId); // REQ.SRC.PORT.ID
200
201 // setup packet
202 delRespMsg.tag = RPMT_RANDOM;
203 delRespMsg.size = PTP_PCKT_SIZE_DELAY_RESP;
204 delRespMsg.pTxCb = NULL;
205 delRespMsg.tx_dm = PTP_DM_E2E;
206 delRespMsg.tx_mc = PTP_MC_GENERAL;
207 delRespMsg.tx_mt = PTP_MT_Delay_Resp;
209
210 // send packet
211 ptp_transmit_enqueue(&delRespMsg);
212}
213
214// ------------------------
215
216static char *P2P_SLAVE_STATE_HINTS[] = {
217 "NONE",
218 "CANDIDATE",
219 "ESTABLISHED"};
220
221#define PTP_MASTER_P2P_SLAVE_STATE_LOG() \
222 CLILOG(S.logging.logid && S.logging.def && (si->state != prevState), "[LOG-DEF:M:S] "); /* default log : master : slave state */ \
223 CLILOG(S.logging.def && (si->state != prevState), "%s -> %s\n", P2P_SLAVE_STATE_HINTS[prevState], P2P_SLAVE_STATE_HINTS[si->state])
224
230static void ptp_master_p2p_slave_reported(uint64_t slClockId) {
231 PtpP2PSlaveInfo *si = &(S.master.p2pSlave);
232 PtpP2PSlaveState prevState = si->state;
233
234 switch (si->state) {
235 case PTP_P2PSS_NONE:
236 si->reportCount = 0; // increase the report count
237 si->dropoutCntr = PTP_PDELAY_DROPOUT; // reload the dropout counter
238 si->identity = slClockId; // save the clock ID
239 si->state = PTP_P2PSS_CANDIDATE; // switch to candidate state
240 break;
243 if (si->identity == slClockId) { // if the slave candidate keep reporting in...
244 si->dropoutCntr = PTP_PDELAY_DROPOUT; // reload the counter
245 si->reportCount = MIN(PTP_PDELAY_SLAVE_QUALIFICATION + 1, si->reportCount + 1); // increase the report count
246 if (si->reportCount > PTP_PDELAY_SLAVE_QUALIFICATION) { // switch to ESTABLISHED if qualification has passed
248 }
249 } else { // if a different slave has also appeared, then it's either a fault, or the previous one had been replaced
250 si->state = PTP_P2PSS_NONE; // revert to NONE state
251 si->identity = 0; // clear the identity
252 si->dropoutCntr = 0; // clear the dropout counter
253 si->reportCount = 0; // clear the report counter
254 }
255 break;
256 }
257
259}
260
261// /**
262// * Calculate the mean path delay.
263// */
264// static void ptp_master_calculate_mean_path_delay() {
265// // fetch value arrays
266// TimestampI * pMPD = &S.network.meanPathDelay;
267// uint64_t * pCf = S.master.scd.cf;
268
269// // convert correction field values to timestamp objects
270// TimestampI * pTs = S.master.scd.t;
271// TimestampI cf = {0, 0}; // variable for accounting correction fields in
272// nsToTsI(&cf, pCf[T2] + pCf[T3]);
273
274// // compute difference between master and slave clock
275// subTime(pMPD, &pTs[T4], &pTs[T1]); // t4 - t1 ...
276// subTime(pMPD, pMPD, &pTs[T3]); // - t3 ...
277// addTime(pMPD, pMPD, &pTs[T2]); // + t2
278// subTime(pMPD, pMPD, &cf); // - CF of (PDelay_Resp + PDelay_Resp_Follow_Up)
279// divTime(pMPD, pMPD, 2); // division by 2
280// }
281
283 PtpSyncCycleData *scd = &S.master.scd;
284 TimestampI *mpd = &S.network.meanPathDelay;
285 ptp_compute_mean_path_delay_p2p(scd->t, scd->cf, mpd);
286
287 // prepare LOGID printing
288 const char * logIdStr = S.logging.logid ? "[LOG-TS:M] " : ""; // timestamp logging : master
289
290 CLILOG(S.logging.timestamps,
291 "%sseqID: %u\n"
292 "%sT1: %d.%09d <- PDelay_Req TX (master)\n"
293 "%sT2: %d.%09d <- PDelay_Req RX (slave) \n"
294 "%sT3: %d.%09d <- PDelay_Resp TX (slave) \n"
295 "%sT4: %d.%09d <- PDelay_Resp RX (master)\n"
296 "%s %09" __PRI64_PREFIX "u -- %09" __PRI64_PREFIX "u <- CF in PDelay_Resp and ..._Follow_Up\n\n",
297 logIdStr, (uint32_t)S.master.pdelay_reqSequenceID,
298 logIdStr, (int32_t)scd->t[T1].sec, scd->t[T1].nanosec,
299 logIdStr, (int32_t)scd->t[T2].sec, scd->t[T2].nanosec,
300 logIdStr, (int32_t)scd->t[T3].sec, scd->t[T3].nanosec,
301 logIdStr, (int32_t)scd->t[T4].sec, scd->t[T4].nanosec,
302 logIdStr, scd->cf[T2], scd->cf[T3]);
303
304 CLILOG(S.logging.logid && S.logging.def, "[LOG-DEF:M:M] "); // default log : master : mean path delay
305 CLILOG(S.logging.def, "%" __PRI64_PREFIX "d\n", nsI(mpd));
306}
307
309 PtpMessageType mt = pHeader->messageType;
310 PtpDelayMechanism dm = S.profile.delayMechanism;
311
312 if ((mt == PTP_MT_Delay_Req) && (dm == PTP_DM_E2E)) { // pass only Delay_Req through E2E delay mechanism
313 // dispatch DELAY_REQ_RECVED user event
315
316 // send Delay_Resp message
317 ptp_send_delay_resp_message(pRawMsg, pHeader);
318
319 // dispatch DELAY_RESP_SENT user event
321
322 } else if (((mt == PTP_MT_PDelay_Resp) || (mt == PTP_MT_PDelay_Resp_Follow_Up)) && (dm == PTP_DM_P2P)) { // let PDelay_Resp and PDelay_Resp_Follow_Up through in P2P mode
323
324 // try fetching PDelay_Req timestamp
325 if ((mt == PTP_MT_PDelay_Resp) && (!ptp_read_and_clear_transmit_timestamp(RPMT_DELAY_REQ, &S.master.scd.t[T1]))) {
326 return;
327 }
328
329 PtpDelay_RespIdentification delay_respID; // acquire PDelay_Resp(_Follow_Up) identification info
330 ptp_read_delay_resp_id_data(&delay_respID, pRawMsg->data);
331
332 if ((delay_respID.requestingSourceClockIdentity == S.hwoptions.clockIdentity) &&
333 (delay_respID.requestingSourcePortIdentity == PTP_PORT_ID) && (pHeader->sequenceID == S.master.pdelay_reqSequenceID)) {
334 PtpSyncCycleData *scd = &S.master.scd;
335
336 if (mt == PTP_MT_PDelay_Resp) {
337 if (S.master.p2pSlave.state != PTP_P2PSS_NONE) {
338 ptp_extract_timestamps(&(scd->t[T2]), pRawMsg->data, 1); // extract PDelay_Req reception time
339 scd->cf[T2] = pHeader->correction_ns; // correction field of the PDelay_Resp
340 scd->t[T4] = pRawMsg->ts; // save PDelay_Resp reception time
341 }
342
343 if (!pHeader->flags.PTP_TWO_STEP) {
345
346 // mean path delay calculation
347 if (S.master.p2pSlave.state != PTP_P2PSS_NONE) { // one-step mode responder
348 scd->t[T2] = scd->t[T3] = zeroTs;
349 scd->cf[T3] = 0;
351 }
352
353 // dispatch user event
355 } else { // expect a ...FollowUp coming in two-step mode
356 S.master.expectPDelRespFollowUp = true;
357 }
358 } else if (mt == PTP_MT_PDelay_Resp_Follow_Up) {
359 if (!S.master.expectPDelRespFollowUp) {
360 return;
361 }
362 S.master.expectPDelRespFollowUp = false;
363
364 if (S.master.p2pSlave.state != PTP_P2PSS_NONE) {
365 ptp_extract_timestamps(&(scd->t[T3]), pRawMsg->data, 1); // extract PDelay_Resp transmission time
366 scd->cf[T3] = pHeader->correction_ns; // correction field of the PDelay_Resp_Follow_Up
368 }
369
371
372 // dispatch user event
374 }
375 }
376 }
377}
378
379// ------------------------
380
382 // reset master module
384}
385
387 return;
388}
389
391 // load the TLV chain based on the profile
392 tlvChain = ptp_tlv_chain_preset_get(S.profile.tlvSet);
393
394 // initialize Announce message header
396
397 // initialize Sync message header
399
400 // initialze Follow_Up message
402
403 // disable the module
404 S.master.enabled = false;
405
406 // don't expect a PDelay_Req_Follow_Up coming
407 S.master.expectPDelRespFollowUp = false;
408
409 // clear the messaging state
410 memset(&S.master.messaging, 0, sizeof(PtpMasterMessagingState));
411}
412
414 // enable the module
415 S.master.enabled = true;
416
417 // calculate periods
418 S.master.syncTickPeriod = ptp_logi2ms(S.profile.logSyncPeriod) / PTP_HEARTBEAT_TICKRATE_MS;
419 S.master.announceTickPeriod = ptp_logi2ms(S.profile.logAnnouncePeriod) / PTP_HEARTBEAT_TICKRATE_MS;
420 S.master.pdelayReqTickPeriod = ptp_logi2ms((S.profile.logDelayReqPeriod == PTP_LOGPER_SYNCMATCHED) ? S.profile.logSyncPeriod : S.profile.logDelayReqPeriod) / PTP_HEARTBEAT_TICKRATE_MS;
421
422 // clear counters
423 S.master.syncTmr = 0;
424 S.master.announceTmr = 0;
425 S.master.pdelayReqTmr = 0;
426
427 // reset PDelay_Request's sequence ID
428 S.master.pdelay_reqSequenceID = 0;
429
430 // clear Sync cycle data
431 memset(&S.master.scd, 0, sizeof(PtpSyncCycleData));
432
433 // clear P2P slave information
434 memset(&S.master.p2pSlave, 0, sizeof(PtpP2PSlaveInfo));
435}
436
438 S.master.enabled = false;
439}
440
442 if (!S.master.enabled) {
443 return;
444 }
445
446 PtpDelayMechanism dm = S.profile.delayMechanism; // fetch Delay Mechanism
447
448 // gating signal for Sync and Announce transmission
449 bool infoEn = (dm == PTP_DM_E2E) || ((dm == PTP_DM_P2P) && ((S.master.p2pSlave.state == PTP_P2PSS_ESTABLISHED) || (!(S.profile.flags & PTP_PF_ISSUE_SYNC_FOR_COMPLIANT_SLAVE_ONLY_IN_P2P))));
450
451 // Sync transmission
452 if (++S.master.syncTmr >= S.master.syncTickPeriod) {
453 S.master.syncTmr = 0;
454
455 if (infoEn) {
458 }
459 }
460
461 // Announce transmission
462 if (++S.master.announceTmr >= S.master.announceTickPeriod) { // advance Announce timer
463 S.master.announceTmr = 0;
464 }
465
466 if (infoEn) {
467 // shift Announce transmission phase with 1 tick
468 if (S.master.announceTmr == 1) {
471 }
472 }
473
474 // issue PDelay_Req messages
475 if (dm == PTP_DM_P2P) {
476 if (++S.master.pdelayReqTmr >= S.master.pdelayReqTickPeriod) { // advance the PDelay_Req counter
477 S.master.pdelayReqTmr = 0;
478 }
479
480 // separate PDelay_Req transmission from the Sync-Follow_Up pair by shifting it's phase by one tick
481 if (S.master.pdelayReqTmr == 1) {
482 PtpP2PSlaveInfo *si = &(S.master.p2pSlave);
483 PtpP2PSlaveState prevState = si->state;
484 si->dropoutCntr = (si->dropoutCntr > 0) ? (si->dropoutCntr - 1) : 0; // decrease the slave dropout counter
485 if (si->dropoutCntr == 0) {
486 si->state = PTP_P2PSS_NONE;
487 si->identity = 0;
488 }
490
491 ptp_send_delay_req_message(); // send a PDelay_Request message
492
493 // dispatch PDELAY_REQUEST_SENT message
495 }
496 }
497}
void ptp_compute_mean_path_delay_p2p(const TimestampI *pTs, const uint64_t *pCf, TimestampI *pMPD)
Definition: common.c:155
void ptp_send_delay_req_message()
Definition: common.c:44
This module defines messaging functions for both the slave and master modules.
@ PTP_UEV_PDELAY_RESP_FOLLOW_UP_RECVED
A PDelay_Resp_Follow_Up had been received (master/slave)
Definition: event.h:62
@ PTP_UEV_PDELAY_REQ_SENT
A PDelay_Req had been sent (master/slave)
Definition: event.h:59
@ PTP_UEV_SYNC_SENT
A Sync message has eebn sent (master)
Definition: event.h:51
@ PTP_UEV_PDELAY_RESP_RECVED
A PDelay_Resp had been received (master/slave)
Definition: event.h:60
@ PTP_UEV_DELAY_RESP_SENT
A Delay_Resp had been sent (master)
Definition: event.h:57
@ PTP_UEV_ANNOUNCE_SENT
An Announce message has been sent (master)
Definition: event.h:64
@ PTP_UEV_DELAY_REQ_RECVED
A Delay_Req had been received (master)
Definition: event.h:54
#define PTP_IUEV(uev)
Definition: event.h:83
#define CLILOG(en,...)
uint16_t ptp_logi2ms(int8_t logi)
Definition: format_utils.c:14
This module defines format conversion functions between network and host byte order and conversion fu...
static void ptp_init_sync_header()
Definition: master.c:67
void ptp_master_disable()
Definition: master.c:437
static PtpHeader syncHeader
Definition: master.c:35
void ptp_master_enable()
Definition: master.c:413
void ptp_master_tick()
Definition: master.c:441
#define PTP_MASTER_P2P_SLAVE_STATE_LOG()
Definition: master.c:221
static void ptp_master_p2p_slave_reported(uint64_t slClockId)
Definition: master.c:230
void ptp_master_reset()
Definition: master.c:390
static void ptp_send_delay_resp_message(const RawPtpMessage *pRawMsg, const PtpHeader *pHeader)
Definition: master.c:177
void ptp_master_init()
Definition: master.c:381
static void ptp_init_follow_up_message()
Definition: master.c:96
static RawPtpMessage sync_
Definition: master.c:36
static RawPtpMessage followUp
Definition: master.c:37
static PtpHeader announceHeader
Definition: master.c:33
static void ptp_send_follow_up(const RawPtpMessage *pMsg)
Definition: master.c:127
static void ptp_send_announce_message()
Definition: master.c:105
void ptp_master_destroy()
Definition: master.c:386
static const PtpProfileTlvElement * tlvChain
Definition: master.c:38
void ptp_master_process_message(RawPtpMessage *pRawMsg, PtpHeader *pHeader)
Definition: master.c:308
static void ptp_init_announce_header()
Definition: master.c:40
static RawPtpMessage announce
Definition: master.c:34
static char * P2P_SLAVE_STATE_HINTS[]
Definition: master.c:216
static void ptp_send_sync_message()
Definition: master.c:157
static void ptp_master_commence_mpd_computation()
Definition: master.c:282
This module implements the master clock functionality.
#define MIN(a, b)
Definition: minmax.h:8
void ptp_write_delay_resp_id_data(void *pPayload, const PtpDelay_RespIdentification *pDRData)
Definition: msg_utils.c:223
void ptp_construct_binary_announce_message(void *pData, const PtpAnnounceBody *pAnnounce)
Definition: msg_utils.c:143
void ptp_extract_header(PtpHeader *pHeader, const void *pPayload)
Definition: msg_utils.c:55
void ptp_extract_timestamps(TimestampI *ts, void *pPayload, uint8_t n)
Definition: msg_utils.c:188
void ptp_read_delay_resp_id_data(PtpDelay_RespIdentification *pDRData, void *pPayload)
Definition: msg_utils.c:213
void ptp_construct_binary_header(void *pData, const PtpHeader *pHeader)
Definition: msg_utils.c:90
void ptp_write_binary_timestamps(void *pPayload, const TimestampI *ts, uint8_t n)
Definition: msg_utils.c:165
void ptp_clear_flags(PtpFlags *pFlags)
Definition: msg_utils.c:231
This module defines functions that deal with actual PTP messages; they can extract or insert headers,...
Core of the PTP implementation. Defines functions for message processing, clock tuning,...
In here reside a multitude of fundamental PTP-related constants and definitions.
#define PTP_HEARTBEAT_TICKRATE_MS
Heartbeat ticking period.
Definition: ptp_defs.h:128
#define PTP_PCKT_SIZE_FOLLOW_UP
Size of a Follow_Up message.
Definition: ptp_defs.h:54
#define PTP_PCKT_SIZE_ANNOUNCE
Size of an Announce message.
Definition: ptp_defs.h:61
#define PTP_PDELAY_DROPOUT
Maximum number of failed PDelReq-PDelResp cycles before the MASTER drops the SLAVE.
Definition: ptp_defs.h:196
#define PTP_PCKT_SIZE_DELAY_RESP
Size of a Delay_Resp message.
Definition: ptp_defs.h:56
#define PTP_PCKT_SIZE_SYNC
Size of a Sync message.
Definition: ptp_defs.h:53
#define PTP_PORT_ID
PTP port ID on the device.
Definition: ptp_defs.h:132
#define PTP_PDELAY_SLAVE_QUALIFICATION
Number of consecutive PDelReq-PDelResp iterations after the SLAVE is considered stable.
Definition: ptp_defs.h:192
#define FLEXPTP_RANDOM_TAGGED_MESSAGE_TTL_TICKS
Definition: ptp_defs.h:240
const PtpProfileTlvElement * ptp_tlv_chain_preset_get(const char *pName)
This module manages predefined profile presets. It allows their fetching by name or ID.
This module defines the context object of a full synchronization cycle. In SLAVE mode four timestamps...
#define T2
#define T3
#define T4
#define T1
This module defines the fundamental PTP message and state machine type, flags, bitfields and the PTP ...
@ PTP_CON_Other
Other.
Definition: ptp_types.h:56
@ PTP_CON_Follow_Up
Follow Up.
Definition: ptp_types.h:54
@ PTP_CON_Delay_Resp
Delay Response.
Definition: ptp_types.h:55
@ PTP_CON_Sync
Sync.
Definition: ptp_types.h:52
@ PTP_LOGPER_SYNCMATCHED
Messaging occurs whenever a Sync arrives.
Definition: ptp_types.h:307
@ PTP_MC_EVENT
Event Message Class.
Definition: ptp_types.h:161
@ PTP_MC_GENERAL
General Message Class.
Definition: ptp_types.h:162
PtpMessageType
PTP packet type enumeration.
Definition: ptp_types.h:37
@ PTP_MT_Delay_Resp
Delay Response.
Definition: ptp_types.h:43
@ PTP_MT_PDelay_Resp
Peer Delay Response.
Definition: ptp_types.h:41
@ PTP_MT_Sync
Sync.
Definition: ptp_types.h:38
@ PTP_MT_Announce
Announce.
Definition: ptp_types.h:45
@ PTP_MT_Delay_Req
Delay Request.
Definition: ptp_types.h:39
@ PTP_MT_PDelay_Resp_Follow_Up
Peer Delay Response Follow Up.
Definition: ptp_types.h:44
@ PTP_MT_Follow_Up
Follow Up.
Definition: ptp_types.h:42
PtpDelayMechanism
PTP Delay mechanism enumeration.
Definition: ptp_types.h:144
@ PTP_DM_E2E
End-to-End Delay Mechanism.
Definition: ptp_types.h:145
@ PTP_DM_P2P
Peer-to-Peer Delay Mechanism.
Definition: ptp_types.h:146
@ RPMT_RANDOM
Create a random, unique tag.
Definition: ptp_types.h:181
@ RPMT_DELAY_REQ
(P)Delay_Req tag
Definition: ptp_types.h:183
#define MAX_PTP_MSG_SIZE
Maximum PTP message size.
Definition: ptp_types.h:165
PtpP2PSlaveState
PTP P2P slave state viewed from the MASTER.
Definition: ptp_types.h:434
@ PTP_P2PSS_ESTABLISHED
The slave is considered stable and ready.
Definition: ptp_types.h:437
@ PTP_P2PSS_NONE
No slave is detected.
Definition: ptp_types.h:435
@ PTP_P2PSS_CANDIDATE
A slave has reported in at least once, now being checked on.
Definition: ptp_types.h:436
@ PTP_PF_ISSUE_SYNC_FOR_COMPLIANT_SLAVE_ONLY_IN_P2P
Send Sync messages only for a compliant peer in P2P mode.
Definition: ptp_types.h:349
Identification carrying Delay_Resp message.
Definition: ptp_types.h:128
uint64_t requestingSourceClockIdentity
Requesting Source Clock Identity.
Definition: ptp_types.h:129
uint16_t requestingSourcePortIdentity
Requesting Source Port Identity.
Definition: ptp_types.h:130
bool PTP_TIMESCALE
Timescale.
Definition: ptp_types.h:71
bool PTP_TWO_STEP
Two Step.
Definition: ptp_types.h:67
PTP message header structure.
Definition: ptp_types.h:81
int8_t logMessagePeriod
Definition: ptp_types.h:122
uint8_t versionPTP
PTP version.
Definition: ptp_types.h:87
uint8_t messageType
ID.
Definition: ptp_types.h:83
uint64_t clockIdentity
Clock Identity.
Definition: ptp_types.h:110
uint16_t sequenceID
Sequence ID.
Definition: ptp_types.h:116
uint16_t messageLength
Length.
Definition: ptp_types.h:91
uint16_t sourcePortID
Source Port ID.
Definition: ptp_types.h:113
PtpFlags flags
Flags.
Definition: ptp_types.h:100
uint8_t minorVersionPTP
Definition: ptp_types.h:88
uint8_t control
Control.
Definition: ptp_types.h:119
uint64_t correction_ns
Correction nanoseconds.
Definition: ptp_types.h:103
uint8_t domainNumber
Domain.
Definition: ptp_types.h:94
uint32_t correction_subns
Correction subnanoseconds.
Definition: ptp_types.h:104
uint8_t transportSpecific
Transport Specific.
Definition: ptp_types.h:84
PTP master messaging state structure.
Definition: ptp_types.h:426
PTP P2P slave info structure;.
Definition: ptp_types.h:443
uint16_t reportCount
Number of times the slave had reported in.
Definition: ptp_types.h:446
uint16_t dropoutCntr
Dropout watchdog counter for resetting the state machine if the slave went silent.
Definition: ptp_types.h:447
uint64_t identity
The clock identity of the connected, operating P2P slave.
Definition: ptp_types.h:445
PtpP2PSlaveState state
Indicates that a slave is responding to our PDELAY_REQ messages.
Definition: ptp_types.h:444
PTP profile additional data list element.
Definition: ptp_types.h:337
PTP synchronization cycle data.
TimestampI t[6]
T1-T6 timestamps.
uint64_t cf[6]
T1-T6 correction fields.
TimestampI ts
Timestamp.
Definition: ptp_types.h:187
uint32_t tag
unique transmit tag
Definition: ptp_types.h:191
PtpDelayMechanism tx_dm
transmit transport type
Definition: ptp_types.h:194
uint32_t ttl
transmit Time-to-Live in ticks
Definition: ptp_types.h:192
PtpMessageClass tx_mc
transmit message class
Definition: ptp_types.h:195
PtpMessageType tx_mt
transmit message type
Definition: ptp_types.h:196
uint32_t size
Packet size.
Definition: ptp_types.h:188
uint8_t data[(128)]
raw packet data
Definition: ptp_types.h:199
TxCb * pTxCb
transmit callback function
Definition: ptp_types.h:193
Timestamp (signed)
Definition: timeutils.h:33
int32_t nanosec
nanoseconds
Definition: timeutils.h:35
int64_t sec
seconds
Definition: timeutils.h:34
bool ptp_transmit_enqueue(const RawPtpMessage *pMsg)
Definition: task_ptp.c:549
bool ptp_read_and_clear_transmit_timestamp(uint32_t tag, TimestampI *pTs)
Definition: task_ptp.c:649
The entry point of the whole PTP-implementation. Calling reg_task_ptp() initializes the PTP-engine,...
int64_t nsI(const TimestampI *t)
Definition: timeutils.c:52
This module defines storage classes for timestamps and operations on time values.
uint16_t ptp_tlv_insert(void *dst, const PtpProfileTlvElement *pad, PtpMessageType mt, uint16_t maxLen)
Definition: tlv.c:5
This module implements the TLV-related functionality.