/** * @file ptpd_dep.h * * @brief External definitions for inclusion elsewhere. * * */ /* modification history -------------------- 25jan17,xxy Add support for TSN Clocks and Timers (F6548) 01nov16,myt Add PTP features.(F7726) 15aug16,xxy Add PTP features.(F6696) 13jun16,xxy Add PTP one-step hardware Tx timeStamp */ #ifndef PTPD_DEP_H_ #define PTPD_DEP_H_ #ifdef RUNTIME_DEBUG #undef PTPD_DBGV #define PTPD_DBGV #endif /** \name System messages*/ /**\{*/ /* Syslog ordering. We define extra debug levels above LOG_DEBUG for internal use - but message() doesn't pass these to SysLog */ /* extended from */ #define LOG_DEBUG1 7 #define LOG_DEBUG2 8 #define LOG_DEBUG3 9 #define LOG_DEBUGV 9 #define EMERGENCY(x, ...) (void)printf( x, ##__VA_ARGS__) #define ALERT(x, ...) (void)printf( x, ##__VA_ARGS__) #define CRITICAL(x, ...) (void)printf( x, ##__VA_ARGS__) #define ERROR_LOG(x, ...) (void)printf( x, ##__VA_ARGS__) #define PERROR(x, ...) (void)printf( x " (strerror: %m)\n", ##__VA_ARGS__) #define WARNING(x, ...) (void)printf( x, ##__VA_ARGS__) #define NOTIFY(x, ...) (void)printf( x, ##__VA_ARGS__) #define NOTICE(x, ...) (void)printf( x, ##__VA_ARGS__) #define INFO(x, ...) (void)printf( x, ##__VA_ARGS__) #include #include /* list of per-module defines: ./dep/sys.c:#define PRINT_MAC_ADDRESSES ./dep/timer.c:#define US_TIMER_INTERVAL 125000 */ #define USE_BINDTODEVICE /* enable this line to show debug numbers in nanoseconds instead of microseconds #define DEBUG_IN_NS */ #define DBG_UNIT_US (1000) #define DBG_UNIT_NS (1) #ifdef DEBUG_IN_NS #define DBG_UNIT DBG_UNIT_NS #else #define DBG_UNIT DBG_UNIT_US #endif #ifdef PTPD_DBGV #define DBGV(x, ...) printf( x, ##__VA_ARGS__) #else #define DBGV(x, ...) #endif /* * new debug level DBG2: * this is above DBG(), but below DBGV() (to avoid changing hundreds of lines) */ #ifdef PTPD_DBG2 #define DBG2(x, ...) printf( x, ##__VA_ARGS__) #else #define DBG2(x, ...) #endif #ifdef PTPD_DBG #define DBG(x, ...) printf( x, ##__VA_ARGS__) #else #define DBG(x, ...) #endif /** \}*/ /** \name Endian corrections*/ /**\{*/ #if defined(PTPD_MSBF) #define shift8(x,y) ( (x) << ((3-y)<<3) ) #define shift16(x,y) ( (x) << ((1-y)<<4) ) #elif defined(PTPD_LSBF) #define shift8(x,y) ( (x) << ((y)<<3) ) #define shift16(x,y) ( (x) << ((y)<<4) ) #endif #define flip16(x) htons(x) #define flip32(x) htonl(x) /* i don't know any target platforms that do not have htons and htonl, but here are generic funtions just in case */ /* #if defined(PTPD_MSBF) #define flip16(x) (x) #define flip32(x) (x) #elif defined(PTPD_LSBF) static inline Integer16 flip16(Integer16 x) { return (((x) >> 8) & 0x00ff) | (((x) << 8) & 0xff00); } static inline Integer32 flip32(x) { return (((x) >> 24) & 0x000000ff) | (((x) >> 8 ) & 0x0000ff00) | (((x) << 8 ) & 0x00ff0000) | (((x) << 24) & 0xff000000); } #endif */ /** \}*/ /** \name Bit array manipulations*/ /**\{*/ #define getFlag(x,y) !!( *(UInteger8*)((x)+((y)<8?1:0)) & (1<<((y)<8?(y):(y)-8)) ) #define setFlag(x,y) ( *(UInteger8*)((x)+((y)<8?1:0)) |= 1<<((y)<8?(y):(y)-8) ) #define clearFlag(x,y) ( *(UInteger8*)((x)+((y)<8?1:0)) &= ~(1<<((y)<8?(y):(y)-8)) ) /** \}*/ /** \name msg.c *-Pack and unpack PTP messages */ /**\{*/ void msgUnpackHeader(Octet * buf,MsgHeader*); void msgUnpackAnnounce (Octet * buf,MsgAnnounce*); void msgUnpackSync(Octet * buf,MsgSync*); void msgUnpackFollowUp(Octet * buf,MsgFollowUp*); void msgUnpackDelayReq(Octet * buf, MsgDelayReq * delayreq); void msgUnpackDelayResp(Octet * buf,MsgDelayResp *); void msgUnpackPDelayReq(Octet * buf,MsgPDelayReq*); void msgUnpackPDelayResp(Octet * buf,MsgPDelayResp*); void msgUnpackPDelayRespFollowUp(Octet * buf,MsgPDelayRespFollowUp*); void msgUnpackManagement(Octet * buf,MsgManagement*, MsgHeader*, PtpClock *ptpClock); void msgPackHeader(Octet * buf,PtpClock*); void msgPackAnnounce(Octet * buf,PtpClock*,RunTimeOpts *); void msgPackSync(Octet * buf,Timestamp*,PtpClock*,RunTimeOpts *); void msgPackFollowUp(Octet * buf,Timestamp*,PtpClock*, const UInteger16,RunTimeOpts *); void msgPackDelayReq(Octet * buf,Timestamp *,PtpClock *); void msgPackDelayResp(Octet * buf,MsgHeader *,Timestamp *,PtpClock *,RunTimeOpts *); void msgPackPDelayReq(Octet * buf,Timestamp*,PtpClock*,RunTimeOpts *); void msgPackPDelayResp(Octet * buf,MsgHeader*,Timestamp*,PtpClock*); void msgPackPDelayRespFollowUp(Octet * buf,MsgHeader*,Timestamp*,PtpClock*, const UInteger16); void msgPackManagement(Octet * buf,MsgManagement*,PtpClock*); void msgPackManagementRespAck(Octet *,MsgManagement*,PtpClock*); void msgPackManagementTLV(Octet *,MsgManagement*, PtpClock*); void msgPackManagementErrorStatusTLV(Octet *,MsgManagement*,PtpClock*); void freeMMErrorStatusTLV(ManagementTLV*); void freeMMTLV(ManagementTLV*); void msgDump(PtpClock *ptpClock); void msgDebugHeader(MsgHeader *header); void msgDebugSync(MsgSync *sync); void msgDebugAnnounce(MsgAnnounce *announce); void msgDebugDelayReq(MsgDelayReq *req); void msgDebugFollowUp(MsgFollowUp *follow); void msgDebugDelayResp(MsgDelayResp *resp); void msgDebugManagement(MsgManagement *manage); void copyClockIdentity( ClockIdentity dest, ClockIdentity src); void copyPortIdentity( PortIdentity * dest, PortIdentity * src); void unpackMsgManagement(Octet *, MsgManagement*, PtpClock*); void packMsgManagement(MsgManagement*, Octet *); void unpackManagementTLV(Octet*, MsgManagement*, PtpClock*); void packManagementTLV(ManagementTLV*, Octet*); void freeManagementTLV(MsgManagement*); void unpackMMClockDescription( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMClockDescription( MsgManagement*, Octet*); void freeMMClockDescription( MMClockDescription*); void unpackMMUserDescription( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMUserDescription( MsgManagement*, Octet*); void freeMMUserDescription( MMUserDescription*); void unpackMMErrorStatus( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMErrorStatus( MsgManagement*, Octet*); void freeMMErrorStatus( MMErrorStatus*); void unpackMMInitialize( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMInitialize( MsgManagement*, Octet*); void unpackMMDefaultDataSet( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMDefaultDataSet( MsgManagement*, Octet*); void unpackMMCurrentDataSet( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMCurrentDataSet( MsgManagement*, Octet*); void unpackMMParentDataSet( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMParentDataSet( MsgManagement*, Octet*); void unpackMMTimePropertiesDataSet( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMTimePropertiesDataSet( MsgManagement*, Octet*); void unpackMMPortDataSet( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMPortDataSet( MsgManagement*, Octet*); void unpackMMPriority1( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMPriority1( MsgManagement*, Octet*); void unpackMMPriority2( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMPriority2( MsgManagement*, Octet*); void unpackMMDomain( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMDomain( MsgManagement*, Octet*); void unpackMMSlaveOnly( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMSlaveOnly( MsgManagement*, Octet* ); void unpackMMLogAnnounceInterval( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMLogAnnounceInterval( MsgManagement*, Octet*); void unpackMMAnnounceReceiptTimeout( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMAnnounceReceiptTimeout( MsgManagement*, Octet*); void unpackMMLogSyncInterval( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMLogSyncInterval( MsgManagement*, Octet*); void unpackMMVersionNumber( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMVersionNumber( MsgManagement*, Octet*); void unpackMMTime( Octet* buf, MsgManagement*, PtpClock * ); UInteger16 packMMTime( MsgManagement*, Octet*); void unpackMMClockAccuracy( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMClockAccuracy( MsgManagement*, Octet*); void unpackMMUtcProperties( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMUtcProperties( MsgManagement*, Octet*); void unpackMMTraceabilityProperties( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMTraceabilityProperties( MsgManagement*, Octet*); void unpackMMDelayMechanism( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMDelayMechanism( MsgManagement*, Octet*); void unpackMMLogMinPdelayReqInterval( Octet* buf, MsgManagement*, PtpClock* ); UInteger16 packMMLogMinPdelayReqInterval( MsgManagement*, Octet*); void unpackPortAddress( Octet* buf, PortAddress*, PtpClock*); void packPortAddress( PortAddress*, Octet*); void freePortAddress( PortAddress*); void unpackPTPText( Octet* buf, PTPText*, PtpClock*); void packPTPText( PTPText*, Octet*); void freePTPText( PTPText*); void unpackPhysicalAddress( Octet* buf, PhysicalAddress*, PtpClock*); void packPhysicalAddress( PhysicalAddress*, Octet*); void freePhysicalAddress( PhysicalAddress*); void unpackClockIdentity( Octet* buf, ClockIdentity *c, PtpClock*); void packClockIdentity( ClockIdentity *c, Octet* buf); void freeClockIdentity( ClockIdentity *c); void unpackClockQuality( Octet* buf, ClockQuality *c, PtpClock*); void packClockQuality( ClockQuality *c, Octet* buf); void freeClockQuality( ClockQuality *c); void unpackTimeInterval( Octet* buf, TimeInterval *t, PtpClock*); void packTimeInterval( TimeInterval *t, Octet* buf); void freeTimeInterval( TimeInterval *t); void unpackPortIdentity( Octet* buf, PortIdentity *p, PtpClock*); void packPortIdentity( PortIdentity *p, Octet* buf); void freePortIdentity( PortIdentity *p); void unpackTimestamp( Octet* buf, Timestamp *t, PtpClock*); void packTimestamp( Timestamp *t, Octet* buf); void freeTimestamp( Timestamp *t); UInteger16 msgPackManagementResponse(Octet * buf,MsgHeader*,MsgManagement*,PtpClock*); /** \}*/ /** \name net.c (Unix API dependent) * -Init network stuff, send and receive datas*/ /**\{*/ Boolean netInit(NetPath*,RunTimeOpts*,PtpClock*); Boolean netShutdown(RunTimeOpts*,NetPath*); int netSelect(RunTimeOpts *,TimeInternal*,NetPath*,fd_set*); ssize_t netRecvEvent(Octet*,TimeInternal*,NetPath*,int); ssize_t netRecvGeneral(Octet*,NetPath*); ssize_t netSendEvent(Octet*,UInteger16,PtpClock*,RunTimeOpts*,Integer32,TimeInternal*); ssize_t netSendGeneral(Octet*,UInteger16,NetPath*,RunTimeOpts*,Integer32 ); ssize_t netSendPeerGeneral(Octet*,UInteger16,NetPath*,RunTimeOpts*); ssize_t netSendPeerEvent(Octet*,UInteger16,PtpClock*,RunTimeOpts*,TimeInternal*); Boolean netRefreshIGMP(NetPath *, RunTimeOpts *, PtpClock *); Boolean hostLookup(const char* hostname, Integer32* addr); int netSetSysTime (void * ethCookie, struct timespec * ts); int netGetSysTime (void * ethCookie, struct timespec * ts); int netAdjustFreq (void * ethCookie, INT32 adj); int netGetSysIntervalTime (void * ethCookie, IEEE1588_TIMER_SYNC * sync); int netGetSysSyncDelayTime (void * ethCookie, long * delay); int netSetSysIntervalTime (void * ethCookie, IEEE1588_TIMER_SYNC * sync); int netSetSysTimeAdd (void *ethCookie, INT64 * counts); int netEnableHwTimeStamp (void * ethCookie, UINT8 enable); Boolean netGetHwTimeStampCap (void * ethCookie); Boolean netGetHwOneStepCap (void * ethCookie); /** \}*/ /** \name servo.c * -Clock servo*/ /**\{*/ void initClock(RunTimeOpts*,PtpClock*); void updatePeerDelay (one_way_delay_filter*, RunTimeOpts*,PtpClock*,TimeInternal*,Boolean); void updateDelay (one_way_delay_filter*, RunTimeOpts*, PtpClock*,TimeInternal*); void updateOffset(TimeInternal*,TimeInternal*, offset_from_master_filter*,RunTimeOpts*,PtpClock*,TimeInternal*); void updateClock(RunTimeOpts*,PtpClock*); void servo_perform_clock_step(RunTimeOpts * rtOpts, PtpClock * ptpClock); PtpClock * ptpdStartup(int slaveMaster, RunTimeOpts * rtOpts); void ptpdShutdown(RunTimeOpts * rtOpts, PtpClock * ptpClock); void enable_runtime_debug(void ); void disable_runtime_debug(void ); #define D_ON do { enable_runtime_debug(); } while (0); #define D_OFF do { disable_runtime_debug( ); } while (0); /** \}*/ /** \name sys.c (Unix API dependent) * -Manage timing system API*/ /**\{*/ /* new debug methods to debug time variables */ char *time2st(const TimeInternal * p); void DBG_time(const char *name, const TimeInternal p); void logStatistics(RunTimeOpts *rtOpts, PtpClock *ptpClock); void ShowStatistics(RunTimeOpts * rtOpts, PtpClock * ptpClock); void displayStatus(const RunTimeOpts *rtOpts,PtpClock *ptpClock, const char *prefixMessage); void displayPortIdentity(PortIdentity *port, const char *prefixMessage); void getTime(RunTimeOpts * ,TimeInternal*); void setTime(RunTimeOpts * ,TimeInternal*); double getRand(void); #ifndef HAVE_SYS_TIMEX_H void adjTime(Integer32); #else void adjFreq_wrapper(RunTimeOpts * rtOpts, PtpClock * ptpClock, double adj); Boolean adjFreq(RunTimeOpts *,double); double getAdjFreq(void); void informClockSource(PtpClock* ptpClock); /* Observed drift save / recovery functions */ void restoreDrift(PtpClock * ptpClock, RunTimeOpts * rtOpts, Boolean quiet); void saveDrift(PtpClock * ptpClock, RunTimeOpts * rtOpts, Boolean quiet); /* Helper function to manage ntpadjtime / adjtimex flags */ void setTimexFlags(int flags, Boolean quiet); void unsetTimexFlags(int flags, Boolean quiet); int getTimexFlags(void); Boolean checkTimexFlags(int flags); #endif /* HAVE_SYS_TIMEX_H */ #ifndef _WRS_CONFIG_ARCH_i86 double trunc(double x); double round(double x); #endif /** \}*/ /** \name timer.c (Unix API dependent) * -Handle with timers*/ /**\{*/ void initTimer(void); void timerUpdate(IntervalTimer*); void timerStop(UInteger16,IntervalTimer*); /* void timerStart(UInteger16,UInteger16,IntervalTimer*); */ /* R135 patch: we went back to floating point periods (for less than 1s )*/ void timerStart(UInteger16 index, float interval, IntervalTimer * itimer); /* Version with randomized backoff */ void timerStart_random(UInteger16 index, float interval, IntervalTimer * itimer); Boolean timerExpired(UInteger16,IntervalTimer*); Boolean timerStopped(UInteger16,IntervalTimer*); Boolean timerRunning(UInteger16,IntervalTimer*); /** \}*/ void reset_operator_messages(RunTimeOpts * rtOpts, PtpClock * ptpClock); void setupPIservo(PIservo* servo, const RunTimeOpts* rtOpts); void resetPIservo(PIservo* servo); double runPIservo(RunTimeOpts * rtOpts, PIservo* servo, const Integer32 input); #endif /*PTPD_DEP_H_*/