📄 msg.c
字号:
/* msg.c *//* see spec annex d */#include "../ptpd.h"Boolean msgPeek(void *buf, ssize_t length){ /* not imlpemented yet */ return TRUE;}void msgUnpackHeader(void *buf, MsgHeader *header){ header->versionPTP = flip16(*(UInteger16*)(buf + 0)); header->versionNetwork = flip16(*(UInteger16*)(buf + 2)); DBGV("msgUnpackHeader: versionPTP %d\n", header->versionPTP); DBGV("msgUnpackHeader: versionNetwork %d\n", header->versionNetwork); memcpy(header->subdomain, (buf + 4), 16); DBGV("msgUnpackHeader: subdomain %s\n", header->subdomain); header->messageType = *(UInteger8*)(buf + 20); header->sourceCommunicationTechnology = *(UInteger8*)(buf + 21); DBGV("msgUnpackHeader: messageType %d\n", header->messageType); DBGV("msgUnpackHeader: sourceCommunicationTechnology %d\n", header->sourceCommunicationTechnology); memcpy(header->sourceUuid, (buf + 22), 6); DBGV("msgUnpackHeader: sourceUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", header->sourceUuid[0], header->sourceUuid[1], header->sourceUuid[2], header->sourceUuid[3], header->sourceUuid[4], header->sourceUuid[5]); header->sourcePortId = flip16(*(UInteger16*)(buf + 28)); header->sequenceId = flip16(*(UInteger16*)(buf + 30)); DBGV("msgUnpackHeader: sourcePortId %d\n", header->sourcePortId); DBGV("msgUnpackHeader: sequenceId %d\n", header->sequenceId); header->control = *(UInteger8*)(buf + 32); DBGV("msgUnpackHeader: control %d\n", header->control); memcpy(header->flags, (buf + 34), 2); DBGV("msgUnpackHeader: flags %02hhx %02hhx\n", header->flags[0], header->flags[1]);}void msgUnpackSync(void *buf, MsgSync *sync){ sync->originTimestamp.seconds = flip32(*(UInteger32*)(buf + 40)); DBGV("msgUnpackSync: originTimestamp.seconds %u\n", sync->originTimestamp.seconds); sync->originTimestamp.nanoseconds = flip32(*(Integer32*)(buf + 44)); DBGV("msgUnpackSync: originTimestamp.nanoseconds %d\n", sync->originTimestamp.nanoseconds); sync->epochNumber = flip16(*(UInteger16*)(buf + 48)); DBGV("msgUnpackSync: epochNumber %d\n", sync->epochNumber); sync->currentUTCOffset = flip16(*(Integer16*)(buf + 50)); DBGV("msgUnpackSync: currentUTCOffset %d\n", sync->currentUTCOffset); sync->grandmasterCommunicationTechnology = *(UInteger8*)(buf + 53); DBGV("msgUnpackSync: grandmasterCommunicationTechnology %d\n", sync->grandmasterCommunicationTechnology); memcpy(sync->grandmasterClockUuid, (buf + 54), 6); DBGV("msgUnpackSync: grandmasterClockUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", sync->grandmasterClockUuid[0], sync->grandmasterClockUuid[1], sync->grandmasterClockUuid[2], sync->grandmasterClockUuid[3], sync->grandmasterClockUuid[4], sync->grandmasterClockUuid[5]); sync->grandmasterPortId = flip16(*(UInteger16*)(buf + 60)); DBGV("msgUnpackSync: grandmasterPortId %d\n", sync->grandmasterPortId); sync->grandmasterSequenceId = flip16(*(UInteger16*)(buf + 62)); DBGV("msgUnpackSync: grandmasterSequenceId %d\n", sync->grandmasterSequenceId); sync->grandmasterClockStratum = *(UInteger8*)(buf + 67); DBGV("msgUnpackSync: grandmasterClockStratum %d\n", sync->grandmasterClockStratum); memcpy(sync->grandmasterClockIdentifier, (buf + 68), 4); DBGV("msgUnpackSync: grandmasterClockIdentifier %c%c%c%c\n", sync->grandmasterClockIdentifier[0], sync->grandmasterClockIdentifier[1], sync->grandmasterClockIdentifier[2], sync->grandmasterClockIdentifier[3]); sync->grandmasterClockVariance = flip16(*(Integer16*)(buf + 74)); DBGV("msgUnpackSync: grandmasterClockVariance %d\n", sync->grandmasterClockVariance); sync->grandmasterPreferred = *(UInteger8*)(buf + 77); DBGV("msgUnpackSync: grandmasterPreferred %d\n", sync->grandmasterPreferred); sync->grandmasterIsBoundaryClock = *(UInteger8*)(buf + 79); DBGV("msgUnpackSync: grandmasterIsBoundaryClock %d\n", sync->grandmasterIsBoundaryClock); sync->syncInterval = *(Integer8*)(buf + 83); DBGV("msgUnpackSync: syncInterval %d\n", sync->syncInterval); sync->localClockVariance = flip16(*(Integer16*)(buf + 86)); DBGV("msgUnpackSync: localClockVariance %d\n", sync->localClockVariance); sync->localStepsRemoved = flip16(*(UInteger16*)(buf + 90)); DBGV("msgUnpackSync: localStepsRemoved %d\n", sync->localStepsRemoved); sync->localClockStratum = *(UInteger8*)(buf + 95); DBGV("msgUnpackSync: localClockStratum %d\n", sync->localClockStratum); memcpy(sync->localClockIdentifer, (buf + 96), PTP_CODE_STRING_LENGTH); DBGV("msgUnpackSync: localClockIdentifer %c%c%c%c\n", sync->localClockIdentifer[0], sync->localClockIdentifer[1], sync->localClockIdentifer[2], sync->localClockIdentifer[3]); sync->parentCommunicationTechnology = *(UInteger8*)(buf + 101); DBGV("msgUnpackSync: parentCommunicationTechnology %d\n", sync->parentCommunicationTechnology); memcpy(sync->parentUuid, (buf + 102), PTP_UUID_LENGTH); DBGV("msgUnpackSync: parentUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", sync->parentUuid[0], sync->parentUuid[1], sync->parentUuid[2], sync->parentUuid[3], sync->parentUuid[4], sync->parentUuid[5]); sync->parentPortField = flip16(*(UInteger16*)(buf + 110)); DBGV("msgUnpackSync: parentPortField %d\n", sync->parentPortField); sync->estimatedMasterVariance = flip16(*(Integer16*)(buf + 114)); DBGV("msgUnpackSync: estimatedMasterVariance %d\n", sync->estimatedMasterVariance); sync->estimatedMasterDrift = flip32(*(Integer32*)(buf + 116)); DBGV("msgUnpackSync: estimatedMasterDrift %d\n", sync->estimatedMasterDrift); sync->utcReasonable = *(UInteger8*)(buf + 123); DBGV("msgUnpackSync: utcReasonable %d\n", sync->utcReasonable);}void msgUnpackDelayReq(void *buf, MsgDelayReq *req) {}void msgUnpackFollowUp(void *buf, MsgFollowUp *follow){ follow->associatedSequenceId = flip16(*(UInteger16*)(buf + 42)); DBGV("msgUnpackFollowUp: associatedSequenceId %u\n", follow->associatedSequenceId); follow->preciseOriginTimestamp.seconds = flip32(*(UInteger32*)(buf + 44)); DBGV("msgUnpackFollowUp: preciseOriginTimestamp.seconds %u\n", follow->preciseOriginTimestamp.seconds); follow->preciseOriginTimestamp.nanoseconds = flip32(*(Integer32*)(buf + 48)); DBGV("msgUnpackFollowUp: preciseOriginTimestamp.nanoseconds %d\n", follow->preciseOriginTimestamp.nanoseconds);}void msgUnpackDelayResp(void *buf, MsgDelayResp *resp){ resp->delayReceiptTimestamp.seconds = flip32(*(UInteger32*)(buf + 40)); DBGV("msgUnpackDelayResp: delayReceiptTimestamp.seconds %u\n", resp->delayReceiptTimestamp.seconds); resp->delayReceiptTimestamp.nanoseconds = flip32(*(Integer32*)(buf + 44)); DBGV("msgUnpackDelayResp: delayReceiptTimestamp.nanoseconds %d\n", resp->delayReceiptTimestamp.nanoseconds); resp->requestingSourceCommunicationTechnology = *(UInteger8*)(buf + 49); DBGV("msgUnpackDelayResp: requestingSourceCommunicationTechnology %d\n", resp->requestingSourceCommunicationTechnology); memcpy(resp->requestingSourceUuid, (buf + 50), 6); DBGV("msgUnpackDelayResp: requestingSourceUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", resp->requestingSourceUuid[0], resp->requestingSourceUuid[1], resp->requestingSourceUuid[2], resp->requestingSourceUuid[3], resp->requestingSourceUuid[4], resp->requestingSourceUuid[5]); resp->requestingSourcePortId = flip16(*(UInteger16*)(buf + 56)); DBGV("msgUnpackDelayResp: requestingSourcePortId %d\n", resp->requestingSourcePortId); resp->requestingSourceSequenceId = flip16(*(UInteger16*)(buf + 58)); DBGV("msgUnpackDelayResp: requestingSourceSequenceId %d\n", resp->requestingSourceSequenceId);}void msgUnpackManagement(void *buf, MsgManagement *manage){ manage->targetCommunicationTechnology = *(UInteger8*)(buf + 41); DBGV("msgUnpackManagement: targetCommunicationTechnology %d\n", manage->targetCommunicationTechnology); memcpy(manage->targetUuid, (buf + 42), 6); DBGV("msgUnpackManagement: targetUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", manage->targetUuid[0], manage->targetUuid[1], manage->targetUuid[2], manage->targetUuid[3], manage->targetUuid[4], manage->targetUuid[5]); manage->targetPortId = flip16(*(UInteger16*)(buf + 48)); DBGV("msgUnpackManagement: targetPortId %d\n", manage->targetPortId); manage->startingBoundaryHops = flip16(*(Integer16*)(buf + 50)); DBGV("msgUnpackManagement: startingBoundaryHops %d\n", manage->startingBoundaryHops); manage->boundaryHops = flip16(*(Integer16*)(buf + 52)); DBGV("msgUnpackManagement: boundaryHops %d\n", manage->boundaryHops); manage->managementMessageKey = *(UInteger8*)(buf + 55); DBGV("msgUnpackManagement: managementMessageKey %d\n", manage->managementMessageKey); manage->parameterLength = flip16(*(UInteger16*)(buf + 58)); DBGV("msgUnpackManagement: parameterLength %d\n", manage->parameterLength); if(manage->managementMessageKey == PTP_MM_GET_FOREIGN_DATA_SET) manage->recordKey = flip16(*(UInteger16*)(buf + 62));}UInteger8 msgUnloadManagement(void *buf, MsgManagement *manage, PtpClock *ptpClock, RunTimeOpts *rtOpts){ TimeInternal internalTime; TimeRepresentation externalTime; switch(manage->managementMessageKey) { case PTP_MM_INITIALIZE_CLOCK: if(ptpClock->initializable) return PTP_INITIALIZING; break; case PTP_MM_GOTO_FAULTY_STATE: DBG("event FAULT_DETECTED (forced by management message)\n"); return PTP_FAULTY; break; case PTP_MM_DISABLE_PORT: if(manage->targetPortId == 1) { DBG("event DESIGNATED_DISABLED\n"); return PTP_DISABLED; } break; case PTP_MM_ENABLE_PORT: if(manage->targetPortId == 1) { DBG("event DESIGNATED_ENABLED\n"); return PTP_INITIALIZING; } break; case PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER: ptpClock->preferred = FALSE; break; case PTP_MM_SET_DESIGNATED_PREFERRED_MASTER: ptpClock->preferred = TRUE; break; case PTP_MM_DISABLE_BURST: break; case PTP_MM_ENABLE_BURST: break; case PTP_MM_SET_SYNC_INTERVAL: rtOpts->syncInterval = *(Integer8*)(buf + 63); break; case PTP_MM_SET_SUBDOMAIN: memcpy(rtOpts->subdomainName, buf + 60, 16); DBG("set subdomain to %s\n", rtOpts->subdomainName); break; case PTP_MM_SET_TIME: externalTime.seconds = flip32(*(UInteger32*)(buf + 60)); externalTime.nanoseconds = flip32(*(Integer32*)(buf + 64)); toInternalTime(&internalTime, &externalTime, &ptpClock->halfEpoch); setTime(&internalTime); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -