summaryrefslogtreecommitdiff
path: root/daemons/gptp/common/common_port.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'daemons/gptp/common/common_port.hpp')
-rw-r--r--daemons/gptp/common/common_port.hpp1534
1 files changed, 0 insertions, 1534 deletions
diff --git a/daemons/gptp/common/common_port.hpp b/daemons/gptp/common/common_port.hpp
deleted file mode 100644
index 4f195836..00000000
--- a/daemons/gptp/common/common_port.hpp
+++ /dev/null
@@ -1,1534 +0,0 @@
-/******************************************************************************
-
- Copyright (c) 2009-2012, Intel Corporation
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of the Intel Corporation nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
-******************************************************************************/
-
-
-#ifndef COMMON_PORT_HPP
-#define COMMON_PORT_HPP
-
-#include <avbts_message.hpp>
-#include <avbts_osthread.hpp>
-#include <avbts_oscondition.hpp>
-#include <avbts_ostimer.hpp>
-#include <avbts_oslock.hpp>
-#include <avbts_osnet.hpp>
-#include <unordered_map>
-
-#include <math.h>
-
-#define SYNC_RECEIPT_TIMEOUT_MULTIPLIER 3 /*!< Sync rcpt timeout multiplier */
-#define ANNOUNCE_RECEIPT_TIMEOUT_MULTIPLIER 3 /*!< Annc rcpt timeout mult */
-#define LOG2_INTERVAL_INVALID -127 /* Invalid Log base 2 interval value */
-
-class IEEE1588Clock;
-
-/**
- * @brief PortIdentity interface
- * Defined at IEEE 802.1AS Clause 8.5.2
- */
-class PortIdentity {
-private:
- ClockIdentity clock_id;
- uint16_t portNumber;
-public:
- /**
- * @brief Default Constructor
- */
- PortIdentity() { };
-
- /**
- * @brief Constructs PortIdentity interface.
- * @param clock_id Clock ID value as defined at IEEE 802.1AS Clause
- * 8.5.2.2
- * @param portNumber Port Number
- */
- PortIdentity(uint8_t * clock_id, uint16_t * portNumber)
- {
- this->portNumber = *portNumber;
- this->portNumber = PLAT_ntohs(this->portNumber);
- this->clock_id.set(clock_id);
- }
-
- /**
- * @brief Implements the operator '!=' overloading method. Compares
- * clock_id and portNumber.
- * @param cmp Constant PortIdentity value to be compared against.
- * @return TRUE if the comparison value differs from the object's
- * PortIdentity value. FALSE otherwise.
- */
- bool operator!=(const PortIdentity & cmp) const
- {
- return
- !(this->clock_id == cmp.clock_id) ||
- this->portNumber != cmp.portNumber ? true : false;
- }
-
- /**
- * @brief Implements the operator '==' overloading method. Compares
- * clock_id and portNumber.
- * @param cmp Constant PortIdentity value to be compared against.
- * @return TRUE if the comparison value equals to the object's
- * PortIdentity value. FALSE otherwise.
- */
- bool operator==(const PortIdentity & cmp)const
- {
- return
- this->clock_id == cmp.clock_id &&
- this->portNumber == cmp.portNumber ? true : false;
- }
-
- /**
- * @brief Implements the operator '<' overloading method. Compares
- * clock_id and portNumber.
- * @param cmp Constant PortIdentity value to be compared against.
- * @return TRUE if the comparison value is lower than the object's
- * PortIdentity value. FALSE otherwise.
- */
- bool operator<(const PortIdentity & cmp)const
- {
- return
- this->clock_id < cmp.clock_id ?
- true : this->clock_id == cmp.clock_id &&
- this->portNumber < cmp.portNumber ? true : false;
- }
-
- /**
- * @brief Implements the operator '>' overloading method. Compares
- * clock_id and portNumber.
- * @param cmp Constant PortIdentity value to be compared against.
- * @return TRUE if the comparison value is greater than the object's
- * PortIdentity value. FALSE otherwise.
- */
- bool operator>(const PortIdentity & cmp)const
- {
- return
- this->clock_id > cmp.clock_id ?
- true : this->clock_id == cmp.clock_id &&
- this->portNumber > cmp.portNumber ? true : false;
- }
-
- /**
- * @brief Gets the ClockIdentity string
- * @param id [out] Pointer to an array of octets.
- * @return void
- */
- void getClockIdentityString(uint8_t *id)
- {
- clock_id.getIdentityString(id);
- }
-
- /**
- * @brief Sets the ClockIdentity.
- * @param clock_id Clock Identity to be set.
- * @return void
- */
- void setClockIdentity(ClockIdentity clock_id)
- {
- this->clock_id = clock_id;
- }
-
- /**
- * @brief Gets the clockIdentity value
- * @return A copy of Clock identity value.
- */
- ClockIdentity getClockIdentity( void ) {
- return this->clock_id;
- }
-
- /**
- * @brief Gets the port number following the network byte order, i.e.
- * Big-Endian.
- * @param id [out] Port number
- * @return void
- */
- void getPortNumberNO(uint16_t * id) // Network byte order
- {
- uint16_t portNumberNO = PLAT_htons(portNumber);
- *id = portNumberNO;
- }
-
- /**
- * @brief Gets the port number in the host byte order, which can be
- * either Big-Endian
- * or Little-Endian, depending on the processor where it is running.
- * @param id Port number
- * @return void
- */
- void getPortNumber(uint16_t * id) // Host byte order
- {
- *id = portNumber;
- }
-
- /**
- * @brief Sets the Port number
- * @param id [in] Port number
- * @return void
- */
- void setPortNumber(uint16_t * id)
- {
- portNumber = *id;
- }
-};
-
-class phy_delay_spec_t;
-typedef std::unordered_map<uint32_t, phy_delay_spec_t> phy_delay_map_t;
-
-/**
- * @brief Structure for initializing the port class
- */
-typedef struct {
- /* clock IEEE1588Clock instance */
- IEEE1588Clock * clock;
-
- /* index Interface index */
- uint16_t index;
-
- /* timestamper Hardware timestamper instance */
- CommonTimestamper * timestamper;
-
- /* net_label Network label */
- InterfaceLabel *net_label;
-
- /* Virtual Network label (e.g. WiFi Direct network MAC) */
- InterfaceLabel *virtual_label;
-
- /* automotive_profile set the AVnu automotive profile */
- bool automotive_profile;
-
- /* Set to true if the port is the grandmaster. Used for fixed GM in
- * the the AVnu automotive profile */
- bool isGM;
-
- /* Set to true if the port is the grandmaster. Used for fixed GM in
- * the the AVnu automotive profile */
- bool testMode;
-
- /* Set to true if the port's network interface is up. Used to filter
- * false LINKUP/LINKDOWN events */
- bool linkUp;
-
- /* gPTP 10.2.4.4 */
- signed char initialLogSyncInterval;
-
- /* gPTP 11.5.2.2 */
- signed char initialLogPdelayReqInterval;
-
- /* CDS 6.2.1.5 */
- signed char operLogPdelayReqInterval;
-
- /* CDS 6.2.1.6 */
- signed char operLogSyncInterval;
-
- /* condition_factory OSConditionFactory instance */
- OSConditionFactory * condition_factory;
-
- /* thread_factory OSThreadFactory instance */
- OSThreadFactory * thread_factory;
-
- /* timer_factory OSTimerFactory instance */
- OSTimerFactory * timer_factory;
-
- /* lock_factory OSLockFactory instance */
- OSLockFactory * lock_factory;
-
- /* phy delay */
- phy_delay_map_t const *phy_delay;
-
- /* sync receipt threshold */
- unsigned int syncReceiptThreshold;
-
- /* neighbor delay threshold */
- int64_t neighborPropDelayThreshold;
-} PortInit_t;
-
-
-/**
- * @brief Structure for Port Counters
- */
-typedef struct {
- int32_t ieee8021AsPortStatRxSyncCount;
- int32_t ieee8021AsPortStatRxFollowUpCount;
- int32_t ieee8021AsPortStatRxPdelayRequest;
- int32_t ieee8021AsPortStatRxPdelayResponse;
- int32_t ieee8021AsPortStatRxPdelayResponseFollowUp;
- int32_t ieee8021AsPortStatRxAnnounce;
- int32_t ieee8021AsPortStatRxPTPPacketDiscard;
- int32_t ieee8021AsPortStatRxSyncReceiptTimeouts;
- int32_t ieee8021AsPortStatAnnounceReceiptTimeouts;
- int32_t ieee8021AsPortStatPdelayAllowedLostResponsesExceeded;
- int32_t ieee8021AsPortStatTxSyncCount;
- int32_t ieee8021AsPortStatTxFollowUpCount;
- int32_t ieee8021AsPortStatTxPdelayRequest;
- int32_t ieee8021AsPortStatTxPdelayResponse;
- int32_t ieee8021AsPortStatTxPdelayResponseFollowUp;
- int32_t ieee8021AsPortStatTxAnnounce;
-} PortCounters_t;
-
-/**
- * @brief Port functionality common to all network media
- */
-class CommonPort
-{
-private:
- LinkLayerAddress local_addr;
- PortIdentity port_identity;
-
- /* Network socket description
- physical interface number that object represents */
- uint16_t ifindex;
-
- /* Link speed in kb/sec */
- uint32_t link_speed;
-
- /* Signed value allows this to be negative result because of inaccurate
- timestamp */
- int64_t one_way_delay;
- int64_t neighbor_prop_delay_thresh;
-
- InterfaceLabel *net_label;
-
- OSNetworkInterface *net_iface;
-
- PortState port_state;
- bool testMode;
- bool automotive_profile;
-
- signed char log_mean_sync_interval;
- signed char log_mean_announce_interval;
- signed char initialLogSyncInterval;
-
- /*Sync threshold*/
- unsigned int sync_receipt_thresh;
- unsigned int wrongSeqIDCounter;
-
- PortCounters_t counters;
-
- OSThread *listening_thread;
- OSThread *link_thread;
-
- FrequencyRatio _peer_rate_offset;
- Timestamp _peer_offset_ts_theirs;
- Timestamp _peer_offset_ts_mine;
- bool _peer_offset_init;
- bool asCapable;
- unsigned sync_count; /* 0 for master, increment for each sync
- * received as slave */
- unsigned pdelay_count;
-
- signed char initialLogPdelayReqInterval;
- signed char log_min_mean_pdelay_req_interval;
-
- PTPMessageAnnounce *qualified_announce;
-
- uint16_t announce_sequence_id;
- uint16_t signal_sequence_id;
- uint16_t sync_sequence_id;
-
- uint16_t lastGmTimeBaseIndicator;
-
- OSLock *syncReceiptTimerLock;
- OSLock *syncIntervalTimerLock;
- OSLock *announceIntervalTimerLock;
-
-protected:
- static const int64_t INVALID_LINKDELAY = 3600000000000;
- static const int64_t ONE_WAY_DELAY_DEFAULT = INVALID_LINKDELAY;
-
- OSThreadFactory const * const thread_factory;
- OSTimerFactory const * const timer_factory;
- OSLockFactory const * const lock_factory;
- OSConditionFactory const * const condition_factory;
- CommonTimestamper * const _hw_timestamper;
- IEEE1588Clock * const clock;
- const bool isGM;
-
- phy_delay_map_t const * const phy_delay;
-
-public:
- static const int64_t NEIGHBOR_PROP_DELAY_THRESH = 800;
- static const unsigned int DEFAULT_SYNC_RECEIPT_THRESH = 5;
-
- CommonPort( PortInit_t *portInit );
- virtual ~CommonPort();
-
- /**
- * @brief Global media dependent port initialization
- * @return true on success
- */
- bool init_port( void );
-
- /**
- * @brief Media specific port initialization
- * @return true on success
- */
- virtual bool _init_port( void ) = 0;
-
- /**
- * @brief Initializes the hwtimestamper
- */
- void timestamper_init( void );
-
- /**
- * @brief Resets the hwtimestamper
- */
- void timestamper_reset( void );
-
- /**
- * @brief Gets the link delay information.
- * @return one way delay if delay > 0, or zero otherwise.
- */
- uint64_t getLinkDelay( void )
- {
- return one_way_delay > 0LL ? one_way_delay : 0LL;
- }
-
- /**
- * @brief Gets the link delay information.
- * @param [in] delay Pointer to the delay information
- * @return True if valid, false if invalid
- */
- bool getLinkDelay( uint64_t *delay )
- {
- if(delay == NULL) {
- return false;
- }
- *delay = getLinkDelay();
- return *delay < INVALID_LINKDELAY;
- }
-
- /**
- * @brief Sets link delay information.
- * Signed value allows this to be negative result because
- * of inaccurate timestamps.
- * @param delay Link delay
- * @return True if one_way_delay is lower or equal than neighbor
- * propagation delay threshold False otherwise
- */
- bool setLinkDelay( int64_t delay )
- {
- one_way_delay = delay;
- int64_t abs_delay = (one_way_delay < 0 ?
- -one_way_delay : one_way_delay);
-
- if (testMode) {
- GPTP_LOG_STATUS("Link delay: %d", delay);
- }
-
- return (abs_delay <= neighbor_prop_delay_thresh);
- }
-
- /**
- * @brief Return frequency offset between local timestamp clock
- * system clock
- * @return local:system ratio
- */
- FrequencyRatio getLocalSystemFreqOffset();
-
- /**
- * @brief Gets a pointer to IEEE1588Clock
- * @return Pointer to clock
- */
- IEEE1588Clock *getClock( void )
- {
- return clock;
- }
-
- /**
- * @brief Gets the local_addr
- * @return LinkLayerAddress
- */
- LinkLayerAddress *getLocalAddr( void )
- {
- return &local_addr;
- }
-
- /**
- * @brief Gets the testMode
- * @return bool of the test mode value
- */
- bool getTestMode( void )
- {
- return testMode;
- }
-
- /**
- * @brief Sets the testMode
- * @param testMode changes testMode to this value
- */
- void setTestMode( bool testMode )
- {
- this->testMode = testMode;
- }
-
- /**
- * @brief Serializes (i.e. copy over buf pointer) the information from
- * the variables (in that order):
- * - asCapable;
- * - Port Sate;
- * - Link Delay;
- * - Neighbor Rate Ratio
- * @param buf [out] Buffer where to put the results.
- * @param count [inout] Length of buffer. It contains maximum length
- * to be written
- * when the function is called, and the value is decremented by the
- * same amount the
- * buf size increases.
- * @return TRUE if it has successfully written to buf all the values
- * or if buf is NULL.
- * FALSE if count should be updated with the right size.
- */
- bool serializeState( void *buf, long *count );
-
- /**
- * @brief Restores the serialized state from the buffer. Copies the
- * information from buffer
- * to the variables (in that order):
- * - asCapable;
- * - Port State;
- * - Link Delay;
- * - Neighbor Rate Ratio
- * @param buf Buffer containing the serialized state.
- * @param count Buffer lenght. It is decremented by the same size of
- * the variables that are
- * being copied.
- * @return TRUE if everything was copied successfully, FALSE otherwise.
- */
- bool restoreSerializedState( void *buf, long *count );
-
- /**
- * @brief Sets the internal variabl sync_receipt_thresh, which is the
- * flag that monitors the amount of wrong syncs enabled before
- * switching
- * the ptp to master.
- * @param th Threshold to be set
- * @return void
- */
- void setSyncReceiptThresh(unsigned int th)
- {
- sync_receipt_thresh = th;
- }
-
- /**
- * @brief Gets the internal variabl sync_receipt_thresh, which is the
- * flag that monitors the amount of wrong syncs enabled before
- * switching
- * the ptp to master.
- * @return sync_receipt_thresh value
- */
- unsigned int getSyncReceiptThresh( void )
- {
- return sync_receipt_thresh;
- }
-
- /**
- * @brief Sets the wrongSeqIDCounter variable
- * @param cnt Value to be set
- * @return void
- */
- void setWrongSeqIDCounter(unsigned int cnt)
- {
- wrongSeqIDCounter = cnt;
- }
-
- /**
- * @brief Gets the wrongSeqIDCounter value
- * @param [out] cnt Pointer to the counter value. It must be valid
- * @return TRUE if ok and lower than the syncReceiptThreshold value.
- * FALSE otherwise
- */
- bool getWrongSeqIDCounter(unsigned int *cnt)
- {
- if( cnt == NULL )
- {
- return false;
- }
- *cnt = wrongSeqIDCounter;
-
- return( *cnt < getSyncReceiptThresh() );
- }
-
- /**
- * @brief Increments the wrongSeqIDCounter value
- * @param [out] cnt Pointer to the counter value. Must be valid
- * @return TRUE if incremented value is lower than the
- * syncReceiptThreshold. FALSE otherwise.
- */
- bool incWrongSeqIDCounter(unsigned int *cnt)
- {
- if( getAsCapable() )
- {
- wrongSeqIDCounter++;
- }
- bool ret = wrongSeqIDCounter < getSyncReceiptThresh();
-
- if( cnt != NULL)
- {
- *cnt = wrongSeqIDCounter;
- }
-
- return ret;
- }
-
- /**
- * @brief Gets the hardware timestamper version
- * @return HW timestamper version
- */
- int getTimestampVersion();
-
- /**
- * @brief Adjusts the clock frequency.
- * @param freq_offset Frequency offset
- * @return TRUE if adjusted. FALSE otherwise.
- */
- bool _adjustClockRate( FrequencyRatio freq_offset );
-
- /**
- * @brief Adjusts the clock frequency.
- * @param freq_offset Frequency offset
- * @return TRUE if adjusted. FALSE otherwise.
- */
- bool adjustClockRate( FrequencyRatio freq_offset ) {
- return _adjustClockRate( freq_offset );
- }
-
- /**
- * @brief Adjusts the clock phase.
- * @param phase_adjust phase offset in ns
- * @return TRUE if adjusted. FALSE otherwise.
- */
- bool adjustClockPhase( int64_t phase_adjust );
-
- /**
- * @brief Gets extended error message from hardware timestamper
- * @param msg [out] Extended error message
- * @return void
- */
- void getExtendedError(char *msg);
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatRxSyncCount
- * @return void
- */
- void incCounter_ieee8021AsPortStatRxSyncCount( void )
- {
- counters.ieee8021AsPortStatRxSyncCount++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatRxFollowUpCount
- * @return void
- */
- void incCounter_ieee8021AsPortStatRxFollowUpCount( void )
- {
- counters.ieee8021AsPortStatRxFollowUpCount++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatRxPdelayRequest
- * @return void
- */
- void incCounter_ieee8021AsPortStatRxPdelayRequest( void )
- {
- counters.ieee8021AsPortStatRxPdelayRequest++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatRxPdelayResponse
- * @return void
- */
- void incCounter_ieee8021AsPortStatRxPdelayResponse( void )
- {
- counters.ieee8021AsPortStatRxPdelayResponse++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatRxPdelayResponseFollowUp
- * @return void
- */
- void incCounter_ieee8021AsPortStatRxPdelayResponseFollowUp( void )
- {
- counters.ieee8021AsPortStatRxPdelayResponseFollowUp++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatRxAnnounce
- * @return void
- */
- void incCounter_ieee8021AsPortStatRxAnnounce( void )
- {
- counters.ieee8021AsPortStatRxAnnounce++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatRxPTPPacketDiscard
- * @return void
- */
- void incCounter_ieee8021AsPortStatRxPTPPacketDiscard( void )
- {
- counters.ieee8021AsPortStatRxPTPPacketDiscard++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatRxSyncReceiptTimeouts
- * @return void
- */
- void incCounter_ieee8021AsPortStatRxSyncReceiptTimeouts( void )
- {
- counters.ieee8021AsPortStatRxSyncReceiptTimeouts++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatAnnounceReceiptTimeouts
- * @return void
- */
- void incCounter_ieee8021AsPortStatAnnounceReceiptTimeouts( void )
- {
- counters.ieee8021AsPortStatAnnounceReceiptTimeouts++;
- }
-
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatPdelayAllowedLostResponsesExceeded
- * @return void
- */
- // TODO: Not called
- void incCounter_ieee8021AsPortStatPdelayAllowedLostResponsesExceeded
- ( void )
- {
- counters.
- ieee8021AsPortStatPdelayAllowedLostResponsesExceeded++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatTxSyncCount
- * @return void
- */
- void incCounter_ieee8021AsPortStatTxSyncCount( void )
- {
- counters.ieee8021AsPortStatTxSyncCount++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatTxFollowUpCount
- * @return void
- */
- void incCounter_ieee8021AsPortStatTxFollowUpCount( void )
- {
- counters.ieee8021AsPortStatTxFollowUpCount++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatTxPdelayRequest
- * @return void
- */
- void incCounter_ieee8021AsPortStatTxPdelayRequest( void )
- {
- counters.ieee8021AsPortStatTxPdelayRequest++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatTxPdelayResponse
- * @return void
- */
- void incCounter_ieee8021AsPortStatTxPdelayResponse( void )
- {
- counters.ieee8021AsPortStatTxPdelayResponse++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatTxPdelayResponseFollowUp
- * @return void
- */
- void incCounter_ieee8021AsPortStatTxPdelayResponseFollowUp( void )
- {
- counters.ieee8021AsPortStatTxPdelayResponseFollowUp++;
- }
-
- /**
- * @brief Increment IEEE Port counter:
- * ieee8021AsPortStatTxAnnounce
- * @return void
- */
- void incCounter_ieee8021AsPortStatTxAnnounce( void )
- {
- counters.ieee8021AsPortStatTxAnnounce++;
- }
-
- /**
- * @brief Logs port counters
- * @return void
- */
- void logIEEEPortCounters( void )
- {
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatRxSyncCount : %u",
- counters.ieee8021AsPortStatRxSyncCount );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatRxFollowUpCount : %u",
- counters.ieee8021AsPortStatRxFollowUpCount );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatRxPdelayRequest : %u",
- counters.ieee8021AsPortStatRxPdelayRequest );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatRxPdelayResponse : %u",
- counters.ieee8021AsPortStatRxPdelayResponse );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatRxPdelayResponseFollowUp "
- ": %u", counters.
- ieee8021AsPortStatRxPdelayResponseFollowUp );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatRxAnnounce : %u",
- counters.ieee8021AsPortStatRxAnnounce );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatRxPTPPacketDiscard : %u",
- counters.
- ieee8021AsPortStatRxPTPPacketDiscard );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatRxSyncReceiptTimeouts "
- ": %u", counters.
- ieee8021AsPortStatRxSyncReceiptTimeouts );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatAnnounceReceiptTimeouts "
- ": %u", counters.
- ieee8021AsPortStatAnnounceReceiptTimeouts );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatPdelayAllowed"
- "LostResponsesExceeded : %u", counters.
- ieee8021AsPortStatPdelayAllowedLostResponsesExceeded
- );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatTxSyncCount : %u",
- counters.ieee8021AsPortStatTxSyncCount );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatTxFollowUpCount : %u", counters.
- ieee8021AsPortStatTxFollowUpCount);
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatTxPdelayRequest : %u",
- counters.ieee8021AsPortStatTxPdelayRequest);
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatTxPdelayResponse : %u", counters.
- ieee8021AsPortStatTxPdelayResponse);
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatTxPdelayResponseFollowUp : %u",
- counters.ieee8021AsPortStatTxPdelayResponseFollowUp
- );
- GPTP_LOG_STATUS
- ( "IEEE Port Counter "
- "ieee8021AsPortStatTxAnnounce : %u",
- counters.ieee8021AsPortStatTxAnnounce);
- }
-
- /**
- * @brief Get the cross timestamping information.
- * The gPTP subsystem uses these samples to calculate
- * ratios which can be used to translate or extrapolate
- * one clock into another clock reference. The gPTP service
- * uses these supplied cross timestamps to perform internal
- * rate estimation and conversion functions.
- * @param system_time [out] System time
- * @param device_time [out] Device time
- * @param local_clock [out] Local clock
- * @param nominal_clock_rate [out] Nominal clock rate
- * @return True in case of success. FALSE in case of error
- */
- void getDeviceTime
- ( Timestamp &system_time, Timestamp &device_time,
- uint32_t &local_clock, uint32_t & nominal_clock_rate );
-
- /**
- * @brief Sets asCapable flag
- * @param ascap flag to be set. If FALSE, marks peer_offset_init as
- * false.
- * @return void
- */
- void setAsCapable(bool ascap)
- {
- if ( ascap != asCapable ) {
- GPTP_LOG_STATUS
- ("AsCapable: %s", ascap == true
- ? "Enabled" : "Disabled");
- }
- if( !ascap )
- {
- _peer_offset_init = false;
- }
- asCapable = ascap;
- }
-
- /**
- * @brief Gets the asCapable flag
- * @return asCapable flag.
- */
- bool getAsCapable()
- {
- return( asCapable );
- }
-
- /**
- * @brief Gets the Peer rate offset. Used to calculate neighbor
- * rate ratio.
- * @return FrequencyRatio peer rate offset
- */
- FrequencyRatio getPeerRateOffset( void )
- {
- return _peer_rate_offset;
- }
-
- /**
- * @brief Sets the peer rate offset. Used to calculate neighbor rate
- * ratio.
- * @param offset Offset to be set
- * @return void
- */
- void setPeerRateOffset( FrequencyRatio offset ) {
- _peer_rate_offset = offset;
- }
-
- /**
- * @brief Sets peer offset timestamps
- * @param mine Local timestamps
- * @param theirs Remote timestamps
- * @return void
- */
- void setPeerOffset(Timestamp mine, Timestamp theirs) {
- _peer_offset_ts_mine = mine;
- _peer_offset_ts_theirs = theirs;
- _peer_offset_init = true;
- }
-
- /**
- * @brief Gets peer offset timestamps
- * @param mine [out] Reference to local timestamps
- * @param theirs [out] Reference to remote timestamps
- * @return TRUE if peer offset has already been initialized. FALSE
- * otherwise.
- */
- bool getPeerOffset(Timestamp & mine, Timestamp & theirs) {
- mine = _peer_offset_ts_mine;
- theirs = _peer_offset_ts_theirs;
- return _peer_offset_init;
- }
-
- /**
- * @brief Sets the neighbor propagation delay threshold
- * @param delay Delay in nanoseconds
- * @return void
- */
- void setNeighPropDelayThresh(int64_t delay) {
- neighbor_prop_delay_thresh = delay;
- }
-
- /**
- * @brief Restart PDelay
- * @return void
- */
- void restartPDelay() {
- _peer_offset_init = false;
- }
-
- /**
- * @brief Gets a pointer to timer_factory object
- * @return timer_factory pointer
- */
- const OSTimerFactory *getTimerFactory() {
- return timer_factory;
- }
-
- /**
- * @brief Watch for link up and down events.
- * @return Its an infinite loop. Returns NULL in case of error.
- */
- void *watchNetLink( void )
- {
- // Should never return
- net_iface->watchNetLink(this);
-
- return NULL;
- }
-
- /**
- * @brief Receive frame
- */
- net_result recv
- ( LinkLayerAddress *addr, uint8_t *payload, size_t &length,
- uint32_t &link_speed )
- {
- net_result result = net_iface->nrecv( addr, payload, length );
- link_speed = this->link_speed;
- return result;
- }
-
- /**
- * @brief Send frame
- */
- net_result send
- ( LinkLayerAddress *addr, uint16_t etherType, uint8_t *payload,
- size_t length, bool timestamp )
- {
- return net_iface->send
- ( addr, etherType, payload, length, timestamp );
- }
-
- /**
- * @brief Get the payload offset inside a packet
- * @return 0
- */
- unsigned getPayloadOffset()
- {
- return net_iface->getPayloadOffset();
- }
-
- bool linkWatch( OSThreadFunction func, OSThreadFunctionArg arg )
- {
- return link_thread->start( func, arg );
- }
-
- bool linkOpen( OSThreadFunction func, OSThreadFunctionArg arg )
- {
- return listening_thread->start( func, arg );
- }
-
- /**
- * @brief Gets the portState information
- * @return PortState
- */
- PortState getPortState( void ) {
- return port_state;
- }
-
- /**
- * @brief Sets the PortState
- * @param state value to be set
- * @return void
- */
- void setPortState( PortState state ) {
- port_state = state;
- }
-
- /**
- * @brief Gets port identity
- * @param identity [out] Reference to PortIdentity
- * @return void
- */
- void getPortIdentity(PortIdentity & identity) {
- identity = this->port_identity;
- }
-
- /**
- * @brief Gets the "best" announce
- * @return Pointer to PTPMessageAnnounce
- */
- PTPMessageAnnounce *calculateERBest( void );
-
- /**
- * @brief Changes the port state
- * @param state Current state
- * @param changed_external_master TRUE if external master has
- * changed, FALSE otherwise
- * @return void
- */
- void recommendState(PortState state, bool changed_external_master);
-
- /**
- * @brief Locks the TX port
- * @return TRUE if success. FALSE otherwise.
- */
- virtual bool getTxLock()
- {
- return true;
- }
-
- /**
- * @brief Unlocks the port TX.
- * @return TRUE if success. FALSE otherwise.
- */
- virtual bool putTxLock()
- {
- return false;
- }
-
- /**
- * @brief Adds a new qualified announce the port. IEEE 802.1AS
- * Clause 10.3.10.2
- * @param annc PTP announce message
- * @return void
- */
- void setQualifiedAnnounce( PTPMessageAnnounce *annc )
- {
- delete qualified_announce;
- qualified_announce = annc;
- }
-
- /**
- * @brief Switches port to a gPTP master
- * @param annc If TRUE, starts announce event timer.
- * @return void
- */
- virtual void becomeMaster( bool annc ) = 0;
-
- /**
- * @brief Switches port to a gPTP slave.
- * @param restart_syntonization if TRUE, restarts the syntonization
- * @return void
- */
- virtual void becomeSlave( bool restart_syntonization ) = 0;
-
- /**
- * @brief Gets the AVnu automotive profile flag
- * @return automotive_profile flag
- */
- bool getAutomotiveProfile() { return(automotive_profile); }
-
- /**
- * @brief Sets the pDelay minimum interval
- * @param val time interval
- * @return none
- */
- void setPDelayInterval(signed char val) {
- log_min_mean_pdelay_req_interval = val;
- }
-
- /**
- * @brief Gets the pDelay minimum interval
- * @return PDelay interval
- */
- signed char getPDelayInterval(void) {
- return log_min_mean_pdelay_req_interval;
- }
-
- /**
- * @brief Sets the pDelay minimum interval back to initial
- * value
- * @return none
- */
- void resetInitPDelayInterval(void) {
- log_min_mean_pdelay_req_interval = initialLogPdelayReqInterval;
- }
-
- /**
- * @brief set initial pdelay interval
- * @param interval [in] log base 2 pdelay rate
- */
- void setInitPDelayInterval( int8_t interval )
- {
- initialLogPdelayReqInterval = interval;
- }
-
- /**
- * @brief get initial pdelay interval
- * @return log base 2 pdelay rate
- */
- int8_t getInitPDelayInterval(void)
- {
- return initialLogPdelayReqInterval;
- }
-
- /**
- * @brief Start pDelay interval timer
- * @param waitTime time interval
- * @return none
- */
- virtual void startPDelayIntervalTimer( unsigned long long waitTime ) {}
-
- /**
- * @brief Sets current sync count value.
- * @param cnt [in] sync count value
- * @return void
- */
- void setSyncCount(unsigned int cnt)
- {
- sync_count = cnt;
- }
-
- /**
- * @brief Increments sync count
- * @return void
- */
- void incSyncCount() {
- ++sync_count;
- }
-
- /**
- * @brief Gets current sync count value. It is set to zero
- * when master and incremented at each sync received for slave.
- * @return sync count
- */
- unsigned getSyncCount()
- {
- return sync_count;
- }
-
- /**
- * @brief Sets current pdelay count value.
- * @param cnt [in] pdelay count value
- * @return void
- */
- void setPdelayCount(unsigned int cnt) {
- pdelay_count = cnt;
- }
-
- /**
- * @brief Increments Pdelay count
- * @return void
- */
- void incPdelayCount()
- {
- ++pdelay_count;
- }
-
- /**
- * @brief Gets current pdelay count value. It is set to zero
- * when asCapable is false.
- * @return pdelay count
- */
- unsigned getPdelayCount()
- {
- return pdelay_count;
- }
-
- /**
- * @brief Increments announce sequence id and returns
- * @return Next announce sequence id.
- */
- uint16_t getNextAnnounceSequenceId( void )
- {
- return announce_sequence_id++;
- }
-
- /**
- * @brief Increments signal sequence id and returns
- * @return Next signal sequence id.
- */
- uint16_t getNextSignalSequenceId( void )
- {
- return signal_sequence_id++;
- }
-
- /**
- * @brief Increments sync sequence ID and returns
- * @return Next synce sequence id.
- */
- uint16_t getNextSyncSequenceId( void )
- {
- return sync_sequence_id++;
- }
-
- /**
- * @brief Gets the lastGmTimeBaseIndicator
- * @return uint16 of the lastGmTimeBaseIndicator
- */
- uint16_t getLastGmTimeBaseIndicator( void ) {
- return lastGmTimeBaseIndicator;
- }
-
- /**
- * @brief Sets the lastGmTimeBaseIndicator
- * @param gmTimeBaseIndicator from last Follow up message
- * @return void
- */
- void setLastGmTimeBaseIndicator(uint16_t gmTimeBaseIndicator)
- {
- lastGmTimeBaseIndicator = gmTimeBaseIndicator;
- }
-
- /**
- * @brief Gets the sync interval value
- * @return Sync Interval
- */
- signed char getSyncInterval( void )
- {
- return log_mean_sync_interval;
- }
-
- /**
- * @brief Sets the sync interval value
- * @param val time interval
- * @return none
- */
- void setSyncInterval( signed char val )
- {
- log_mean_sync_interval = val;
- }
-
- /**
- * @brief Sets the sync interval back to initial value
- * @return none
- */
- void resetInitSyncInterval( void )
- {
- log_mean_sync_interval = initialLogSyncInterval;;
- }
-
- /**
- * @brief Sets the sync interval
- * @return none
- */
- void setInitSyncInterval( signed char interval )
- {
- initialLogSyncInterval = interval;
- }
-
- /**
- * @brief Gets the sync interval
- * @return sync interval
- */
- signed char getInitSyncInterval( void )
- {
- return initialLogSyncInterval;
- }
-
- /**
- * @brief Gets the announce interval
- * @return Announce interval
- */
- signed char getAnnounceInterval( void ) {
- return log_mean_announce_interval;
- }
-
- /**
- * @brief Sets the announce interval
- * @param val time interval
- * @return none
- */
- void setAnnounceInterval(signed char val) {
- log_mean_announce_interval = val;
- }
- /**
- * @brief Start sync receipt timer
- * @param waitTime time interval
- * @return none
- */
- void startSyncReceiptTimer(long long unsigned int waitTime);
-
- /**
- * @brief Stop sync receipt timer
- * @return none
- */
- void stopSyncReceiptTimer( void );
-
- /**
- * @brief Start sync interval timer
- * @param waitTime time interval in nanoseconds
- * @return none
- */
- void startSyncIntervalTimer(long long unsigned int waitTime);
-
- /**
- * @brief Start announce interval timer
- * @param waitTime time interval
- * @return none
- */
- void startAnnounceIntervalTimer(long long unsigned int waitTime);
-
- /**
- * @brief Starts announce event timer
- * @return void
- */
- void startAnnounce();
-
- /**
- * @brief Process default state change event
- * @return true if event is handled without errors
- */
- bool processStateChange( Event e );
-
- /**
- * @brief Default sync/announce timeout handler
- * @return true if event is handled without errors
- */
- bool processSyncAnnounceTimeout( Event e );
-
-
- /**
- * @brief Perform default event action, can be overridden by media
- * specific actions in _processEvent
- * @return true if event is handled without errors
- */
- bool processEvent( Event e );
-
- /**
- * @brief Perform media specific event handling action
- * @return true if event is handled without errors
- */
- virtual bool _processEvent( Event e ) = 0;
-
- /**
- * @brief Performs media specific setup after start sync is completed
- * @return void
- */
- virtual void syncDone() = 0;
-
- /**
- * @brief Sends a general message to a port. No timestamps
- * @param buf [in] Pointer to the data buffer
- * @param len Size of the message
- * @param mcast_type Enumeration
- * MulticastType (pdelay, none or other). Depracated.
- * @param destIdentity Destination port identity
- * @return void
- */
- virtual void sendGeneralPort
- (uint16_t etherType, uint8_t * buf, int len, MulticastType mcast_type,
- PortIdentity * destIdentity) = 0;
-
- /**
- * @brief Sets link speed
- */
- void setLinkSpeed( uint32_t link_speed )
- {
- this->link_speed = link_speed;
- }
-
- /**
- * @brief Returns link speed
- */
- uint32_t getLinkSpeed( void )
- {
- return link_speed;
- }
-
- /**
- * @brief Returns TX PHY delay
- */
- Timestamp getTxPhyDelay( uint32_t link_speed ) const;
-
- /**
- * @brief Returns RX PHY delay
- */
- Timestamp getRxPhyDelay( uint32_t link_speed ) const;
-};
-
-/**
- * @brief Specifies a RX/TX PHY compensation pair
- */
-class phy_delay_spec_t
-{
-private:
- uint16_t tx_delay;
- uint16_t rx_delay;
-public:
- /**
- * Constructor setting PHY compensation
- */
- phy_delay_spec_t(
- uint16_t tx_delay,
- uint16_t rx_delay )
- {
- this->tx_delay = tx_delay;
- this->rx_delay = rx_delay;
- }
-
- /**
- * Default constructor sets 0 PHY compensation
- */
- phy_delay_spec_t()
- {
- phy_delay_spec_t( 0, 0 );
- }
-
- /**
- * @brief sets PHY compensation
- */
- void set_delay(
- uint16_t tx_delay,
- uint16_t rx_delay )
- {
- this->tx_delay = tx_delay;
- this->rx_delay = rx_delay;
- }
-
- /**
- * @brief sets RX PHY compensation
- */
- void set_tx_delay(
- uint16_t tx_delay )
- {
- this->tx_delay = tx_delay;
- }
-
- /**
- * @brief sets TX PHY compensation
- */
- void set_rx_delay(
- uint16_t rx_delay )
- {
- this->rx_delay = rx_delay;
- }
-
- /**
- * @brief gets TX PHY compensation
- */
- uint16_t get_tx_delay() const
- {
- return tx_delay;
- }
-
- /**
- * @brief gets RX PHY compensation
- */
- uint16_t get_rx_delay() const
- {
- return rx_delay;
- }
-};
-
-#endif/*COMMON_PORT_HPP*/