summaryrefslogtreecommitdiff
path: root/daemons/gptp/linux/src/linux_hal_common.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'daemons/gptp/linux/src/linux_hal_common.hpp')
-rw-r--r--daemons/gptp/linux/src/linux_hal_common.hpp723
1 files changed, 0 insertions, 723 deletions
diff --git a/daemons/gptp/linux/src/linux_hal_common.hpp b/daemons/gptp/linux/src/linux_hal_common.hpp
deleted file mode 100644
index 9eb3ddc9..00000000
--- a/daemons/gptp/linux/src/linux_hal_common.hpp
+++ /dev/null
@@ -1,723 +0,0 @@
-/******************************************************************************
-
- Copyright (c) 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 LINUX_HAL_COMMON_HPP
-#define LINUX_HAL_COMMON_HPP
-
-/**@file*/
-
-#include "avbts_osnet.hpp"
-#include "avbts_oslock.hpp"
-#include "avbts_oscondition.hpp"
-#include "avbts_ostimerq.hpp"
-#include "avbts_ostimer.hpp"
-#include "avbts_osthread.hpp"
-#include "avbts_osipc.hpp"
-#include "ieee1588.hpp"
-#include <ether_tstamper.hpp>
-#include <linux/ethtool.h>
-
-#include <list>
-
-#define ONE_WAY_PHY_DELAY 400 /*!< One way phy delay. TX or RX phy delay default value*/
-#define P8021AS_MULTICAST "\x01\x80\xC2\x00\x00\x0E" /*!< Default multicast address*/
-#define PTP_DEVICE "/dev/ptpXX" /*!< Default PTP device */
-#define PTP_DEVICE_IDX_OFFS 8 /*!< PTP device index offset*/
-#define CLOCKFD 3 /*!< Clock file descriptor */
-#define FD_TO_CLOCKID(fd) ((~(clockid_t) (fd) << 3) | CLOCKFD) /*!< Converts an FD to CLOCKID */
-struct timespec;
-
-/**
- * @brief Converts timestamp in the struct timespec format to Timestamp
- * @param ts Timestamp on struct timespec format
- * @return timestamp on the Timestamp format
- */
-extern Timestamp tsToTimestamp(struct timespec *ts);
-
-struct TicketingLockPrivate;
-
-/**
- * @brief Provides the type for the TicketingLock private structure
- */
-typedef struct TicketingLockPrivate * TicketingLockPrivate_t;
-
-/**
- * @brief TicketingLock: Implements the ticket lock algorithm.
- * A ticket lock consists of two counters, one containing the
- * number of requests to acquire the lock, and the other the
- * number of times the lock has been released. A processor acquires the lock
- * by performing a fetch and increment operation on the request counter and
- * waiting until the result its ticket is equal to the value of the release
- * counter. It releases the lock by incrementing the release counter.
- */
-class TicketingLock {
-public:
- /**
- * @brief Lock mechanism.
- * Gets a ticket and try locking the process.
- * @param got [out] If non-null, it is set to TRUE when the lock is acquired. FALSE otherwise.
- * @return TRUE when successfully got the lock, FALSE otherwise.
- */
- bool lock( bool *got = NULL );
-
- /**
- * @brief Unlock mechanism. Increments the release counter and unblock other threads
- * waiting for a condition flag.
- * @return TRUE in case of success, FALSE otherwise.
- */
- bool unlock();
-
- /**
- * @brief Initializes all flags and counters. Create private structures.
- * @return TRUE in case of success, FALSE otherwise.
- */
- bool init();
-
- /**
- * @brief Default constructor sets some flags to false that will be initialized on
- * the init method. Protects against using lock/unlock without calling init.
- */
- TicketingLock();
-
- /**
- * @brief Deletes the object and private structures.
- */
- ~TicketingLock();
-private:
- bool init_flag;
- TicketingLockPrivate_t _private;
- bool in_use;
- uint8_t cond_ticket_issue;
- uint8_t cond_ticket_serving;
-};
-
-/**
- * @brief LinuxTimestamper: Provides a generic hardware
- * timestamp interface for linux based systems.
- */
-class LinuxTimestamper : public EtherTimestamper {
-public:
- /**
- * @brief Destructor
- */
- virtual ~LinuxTimestamper() = 0;
-
- /**
- * @brief Provides a generic method for initializing timestamp interfaces
- * @param ifindex Network device interface index
- * @param sd Socket descriptor
- * @param lock [in] Pointer to ticketing Lock object
- * @return TRUE if success, FALSE in case of error
- */
- virtual bool post_init( int ifindex, int sd, TicketingLock *lock ) = 0;
-};
-
-/**
- * @brief Provides a Linux network generic interface
- */
-class LinuxNetworkInterface : public OSNetworkInterface {
- friend class LinuxNetworkInterfaceFactory;
-private:
- LinkLayerAddress local_addr;
- int sd_event;
- int sd_general;
- LinuxTimestamper *timestamper;
- int ifindex;
-
- TicketingLock net_lock;
-public:
- /**
- * @brief Sends a packet to a remote address
- * @param addr [in] Remote link layer address
- * @param etherType [in] The EtherType of the message in host order
- * @param payload [in] Data buffer
- * @param length Size of data buffer
- * @param timestamp TRUE if to use the event socket with the PTP multicast address. FALSE if to use
- * a general socket.
- * @return net_fatal if error, net_success if success
- */
- virtual net_result send
- ( LinkLayerAddress *addr, uint16_t etherType, uint8_t *payload, size_t length,
- bool timestamp );
-
- /**
- * @brief Receives a packet from a remote address
- * @param addr [in] Remote link layer address
- * @param payload [out] Data buffer
- * @param length [out] Size of received data buffer
- * @return net_succeed in case of successful reception, net_trfail in case there is
- * an error on the transmit side, net_fatal if error on reception
- */
- virtual net_result nrecv
- ( LinkLayerAddress *addr, uint8_t *payload, size_t &length );
-
- /**
- * @brief Disables rx socket descriptor rx queue
- * @return void
- */
- void disable_rx_queue();;
-
- /**
- * @brief Clears and enables the rx socket descriptor
- * @return void
- */
- void clear_reenable_rx_queue();
-
- /**
- * @brief Gets the local link layer address
- * @param addr [out] Pointer to the LinkLayerAddress object
- * @return void
- */
- virtual void getLinkLayerAddress( LinkLayerAddress *addr ) {
- *addr = local_addr;
- }
-
- /**
- * @brief Get speed of network link
- *
- * @param [in] sd Open socket descriptor
- * @param [out] speed Link speed in kb/sec
- * @return false on error
- */
- bool getLinkSpeed( int sd, uint32_t *speed );
-
- /**
- * @brief Watch for net link changes.
- */
- virtual void watchNetLink( CommonPort *pPort );
-
- /**
- * @brief Gets the payload offset
- * @return payload offset
- */
- virtual unsigned getPayloadOffset() {
- return 0;
- }
- /**
- * @brief Destroys the network interface
- */
- ~LinuxNetworkInterface();
-protected:
- /**
- * @brief Default constructor
- */
- LinuxNetworkInterface() {};
-};
-
-/**
- * @brief Provides a list of LinuxNetworkInterface members
- */
-typedef std::list<LinuxNetworkInterface *> LinuxNetworkInterfaceList;
-
-struct LinuxLockPrivate;
-/**
- * @brief Provides a type for the LinuxLock class
- */
-typedef LinuxLockPrivate * LinuxLockPrivate_t;
-
-/**
- * @brief Extends OSLock generic interface to Linux
- */
-class LinuxLock : public OSLock {
- friend class LinuxLockFactory;
-private:
- OSLockType type;
- LinuxLockPrivate_t _private;
-protected:
- /**
- * @brief Default constructor.
- */
- LinuxLock() {
- _private = NULL;
- }
-
- /**
- * @brief Initializes all mutexes and locks
- * @param type OSLockType enumeration. If oslock_recursive then set pthreads
- * attributes to PTHREAD_MUTEX_RECURSIVE
- * @return If successful, returns oslock_ok. Returns oslock_fail otherwise
- */
- bool initialize( OSLockType type );
-
- /**
- * @brief Destroys mutexes if lock is still valid
- */
- ~LinuxLock();
-
- /**
- * @brief Provides a simple lock mechanism.
- * @return oslock_fail if lock has failed, oslock_ok otherwise.
- */
- OSLockResult lock();
-
- /**
- * @brief Provides a simple trylock mechanism.
- * @return oslock_fail if lock has failed, oslock_ok otherwise.
- */
- OSLockResult trylock();
-
- /**
- * @brief Provides a simple unlock mechanism.
- * @return oslock_fail if unlock has failed, oslock_ok otherwise.
- */
- OSLockResult unlock();
-};
-
-/**
- * @brief Provides a factory pattern for LinuxLock class
- */
-class LinuxLockFactory:public OSLockFactory {
-public:
- /**
- * @brief Creates the locking mechanism
- * @param type OSLockType enumeration
- * @return Pointer to OSLock object
- */
- OSLock * createLock( OSLockType type ) const
- {
- LinuxLock *lock = new LinuxLock();
- if (!lock->initialize(type)) {
- delete lock;
- lock = NULL;
- }
- return lock;
- }
-};
-
-struct LinuxConditionPrivate;
-/**
- * @brief Provides a private type for the LinuxCondition class
- */
-typedef struct LinuxConditionPrivate * LinuxConditionPrivate_t;
-
-/**
- * @brief Extends OSCondition class to Linux
- */
-class LinuxCondition : public OSCondition {
- friend class LinuxConditionFactory;
-private:
- LinuxConditionPrivate_t _private;
-protected:
-
- /**
- * @brief Initializes locks and mutex conditions
- * @return TRUE if it is ok, FALSE in case of error
- */
- bool initialize();
-public:
-
- /**
- * @brief Counts up the amount of times we call the locking
- * mechanism
- * @return TRUE after incrementing the counter.
- */
- bool wait_prelock();
-
- /**
- * @brief Waits until the ready signal condition is met and decrements
- * the counter.
- */
- bool wait();
-
- /**
- * @brief Unblock all threads that are busy waiting for a condition
- * @return TRUE
- */
- bool signal();
-
- /*
- * Default constructor
- */
- ~LinuxCondition();
-
- /*
- * Destructor: Deletes internal variables
- */
- LinuxCondition() {
- _private = NULL;
- }
-};
-
-/**
- * @brief Implements factory design pattern for LinuxCondition class
- */
-class LinuxConditionFactory : public OSConditionFactory {
-public:
- /**
- * @brief Creates LinuxCondition objects
- * @return Pointer to the OSCondition object in case of success. NULL otherwise
- */
- OSCondition *createCondition() const
- {
- LinuxCondition *result = new LinuxCondition();
- return result->initialize() ? result : NULL;
- }
-};
-
-struct LinuxTimerQueueActionArg;
-
-/**
- * @brief Provides a map type for the LinuxTimerQueue class
- */
-typedef std::map < int, struct LinuxTimerQueueActionArg *> LinuxTimerQueueMap_t;
-
-/**
- * @brief Linux timer queue handler. Deals with linux queues
- * @param arg [in] LinuxTimerQueue arguments
- * @return void
- */
-void *LinuxTimerQueueHandler( void *arg );
-
-struct LinuxTimerQueuePrivate;
-/**
- * @brief Provides a private type for the LinuxTimerQueue class
- */
-typedef struct LinuxTimerQueuePrivate * LinuxTimerQueuePrivate_t;
-
-/**
- * @brief Extends OSTimerQueue to Linux
- */
-class LinuxTimerQueue : public OSTimerQueue {
- friend class LinuxTimerQueueFactory;
- friend void *LinuxTimerQueueHandler( void * arg );
-private:
- LinuxTimerQueueMap_t timerQueueMap;
- int key;
- bool stop;
- LinuxTimerQueuePrivate_t _private;
- OSLock *lock;
- void LinuxTimerQueueAction( LinuxTimerQueueActionArg *arg );
-protected:
- /**
- * @brief Default constructor
- */
- LinuxTimerQueue() {
- _private = NULL;
- }
-
- /**
- * @brief Initializes internal variables
- * @return TRUE if success, FALSE otherwise.
- */
- virtual bool init();
-public:
- /**
- * @brief Deletes pre-allocated internal variables.
- */
- ~LinuxTimerQueue();
-
- /**
- * @brief Add an event to the timer queue
- * @param micros Time in microsseconds
- * @param type Event type
- * @param func Callback
- * @param arg inner argument of type event_descriptor_t
- * @param rm when true, allows elements to be deleted from the queue
- * @param event [inout] Pointer to the event
- * @return TRUE success, FALSE fail
- */
- bool addEvent
- ( unsigned long micros, int type, ostimerq_handler func,
- event_descriptor_t * arg, bool rm, unsigned *event );
-
- /**
- * @brief Removes an event from the timer queue
- * @param type Event type
- * @param event [inout] Pointer to the event
- * @return TRUE success, FALSE fail
- */
- bool cancelEvent( int type, unsigned *event );
-};
-
-/**
- * @brief Implements factory design pattern for linux
- */
-class LinuxTimerQueueFactory : public OSTimerQueueFactory {
-public:
- /**
- * @brief Creates Linux timer queue
- * @param clock [in] Pointer to IEEE15588Clock type
- * @return Pointer to OSTimerQueue
- */
- virtual OSTimerQueue *createOSTimerQueue( IEEE1588Clock *clock );
-};
-
-/**
- * @brief Extends the OSTimer generic class to Linux
- */
-class LinuxTimer : public OSTimer {
- friend class LinuxTimerFactory;
- public:
- /**
- * @brief Sleeps for a given amount of time in microsseconds
- * @param micros Time in micro-seconds
- * @return -1 if error, micros (input argument) if success
- */
- virtual unsigned long sleep(unsigned long micros);
- protected:
- /**
- * @brief Destroys linux timer
- */
- LinuxTimer() {};
-};
-
-/**
- * @brief Provides factory design pattern for LinuxTimer
- */
-class LinuxTimerFactory : public OSTimerFactory {
- public:
- /**
- * @brief Creates the linux timer
- * @return Pointer to OSTimer object
- */
- virtual OSTimer *createTimer() const
- {
- return new LinuxTimer();
- }
-};
-
-/**
- * @brief Provides the default arguments for the OSThread class
- */
-struct OSThreadArg {
- OSThreadFunction func; /*!< Callback function */
- void *arg; /*!< Input arguments */
- OSThreadExitCode ret; /*!< Return code */
-};
-
-/**
- * @brief OSThread callback
- * @param input OSThreadArg structure
- * @return void
- */
-void *OSThreadCallback(void *input);
-
-struct LinuxThreadPrivate;
-/**
- * @brief Provides a private type for the LinuxThread class
- */
-typedef LinuxThreadPrivate * LinuxThreadPrivate_t;
-
-/**
- * @brief Extends OSThread class to Linux
- */
-class LinuxThread : public OSThread {
- friend class LinuxThreadFactory;
- private:
- LinuxThreadPrivate_t _private;
- OSThreadArg *arg_inner;
- public:
- /**
- * @brief Starts a new thread
- * @param function Callback to the thread to be started
- * @param arg Function's parameters
- * @return TRUE if no error during init, FALSE otherwise
- */
- virtual bool start(OSThreadFunction function, void *arg);
-
- /**
- * @brief Joins a new thread
- * @param exit_code Callback's return code
- * @return TRUE if ok, FALSE if error.
- */
- virtual bool join(OSThreadExitCode & exit_code);
- virtual ~LinuxThread();
- protected:
- LinuxThread();
-};
-
-/**
- * @brief Provides factory design pattern for LinuxThread class
- */
-class LinuxThreadFactory:public OSThreadFactory {
- public:
- /**
- * @brief Creates a new LinuxThread
- * @return Pointer to LinuxThread object
- */
- OSThread *createThread() const {
- return new LinuxThread();
- }
-};
-
-/**
- * @brief Extends OSNetworkInterfaceFactory for LinuxNetworkInterface
- */
-class LinuxNetworkInterfaceFactory : public OSNetworkInterfaceFactory {
-public:
- /**
- * @brief Creates a new interface
- * @param net_iface [out] Network interface. Created internally.
- * @param label [in] Label to be cast to the interface's name internally
- * @param timestamper [in] Pointer to a hardware timestamp object
- * @return TRUE if no error during interface creation, FALSE otherwise
- */
- virtual bool createInterface
- ( OSNetworkInterface **net_iface, InterfaceLabel *label,
- CommonTimestamper *timestamper );
-};
-
-/**
- * @brief Extends IPC ARG generic interface to linux
- */
-class LinuxIPCArg : public OS_IPC_ARG {
-private:
- char *group_name;
-public:
- /**
- * @brief Initializes IPCArg object
- * @param group_name [in] Group's name
- */
- LinuxIPCArg( char *group_name ) {
- int len = strnlen(group_name,16);
- this->group_name = new char[len+1];
- strncpy( this->group_name, group_name, len+1 );
- this->group_name[len] = '\0';
- }
- /**
- * @brief Destroys IPCArg internal variables
- */
- virtual ~LinuxIPCArg() {
- delete group_name;
- }
- friend class LinuxSharedMemoryIPC;
-};
-
-#define DEFAULT_GROUPNAME "ptp" /*!< Default groupname for the shared memory interface*/
-
-/**
- * @brief Linux shared memory interface
- */
-class LinuxSharedMemoryIPC:public OS_IPC {
-private:
- int shm_fd;
- char *master_offset_buffer;
- int err;
-public:
- /**
- * @brief Initializes the internal flags
- */
- LinuxSharedMemoryIPC() {
- shm_fd = 0;
- err = 0;
- master_offset_buffer = NULL;
- };
- /**
- * @brief Destroys and unlinks shared memory
- */
- ~LinuxSharedMemoryIPC();
-
- /**
- * @brief Initializes shared memory with DEFAULT_GROUPNAME case arg is null
- * @param barg Groupname of the shared memory
- * @return TRUE if no error, FALSE otherwise
- */
- virtual bool init( OS_IPC_ARG *barg = NULL );
-
- /**
- * @brief Updates IPC values
- *
- * @param ml_phoffset Master to local phase offset
- * @param ls_phoffset Local to slave phase offset
- * @param ml_freqoffset Master to local frequency offset
- * @param ls_freqoffset Local to slave frequency offset
- * @param local_time Local time
- * @param sync_count Count of syncs
- * @param pdelay_count Count of pdelays
- * @param port_state Port's state
- * @param asCapable asCapable flag
- *
- * @return TRUE
- */
- virtual bool update(
- int64_t ml_phoffset,
- int64_t ls_phoffset,
- FrequencyRatio ml_freqoffset,
- FrequencyRatio ls_freqoffset,
- uint64_t local_time,
- uint32_t sync_count,
- uint32_t pdelay_count,
- PortState port_state,
- bool asCapable );
-
- /**
- * @brief Updates grandmaster IPC values
- *
- * @param gptp_grandmaster_id Current grandmaster id (all 0's if no grandmaster selected)
- * @param gptp_domain_number gPTP domain number
- *
- * @return TRUE
- */
- virtual bool update_grandmaster(
- uint8_t gptp_grandmaster_id[],
- uint8_t gptp_domain_number );
-
- /**
- * @brief Updates network interface IPC values
- *
- * @param clock_identity The clock identity of the interface
- * @param priority1 The priority1 field of the grandmaster functionality of the interface, or 0xFF if not supported
- * @param clock_class The clockClass field of the grandmaster functionality of the interface, or 0xFF if not supported
- * @param offset_scaled_log_variance The offsetScaledLogVariance field of the grandmaster functionality of the interface, or 0x0000 if not supported
- * @param clock_accuracy The clockAccuracy field of the grandmaster functionality of the interface, or 0xFF if not supported
- * @param priority2 The priority2 field of the grandmaster functionality of the interface, or 0xFF if not supported
- * @param domain_number The domainNumber field of the grandmaster functionality of the interface, or 0 if not supported
- * @param log_sync_interval The currentLogSyncInterval field of the grandmaster functionality of the interface, or 0 if not supported
- * @param log_announce_interval The currentLogAnnounceInterval field of the grandmaster functionality of the interface, or 0 if not supported
- * @param log_pdelay_interval The currentLogPDelayReqInterval field of the grandmaster functionality of the interface, or 0 if not supported
- * @param port_number The portNumber field of the interface, or 0x0000 if not supported
- *
- * @return TRUE
- */
- virtual bool update_network_interface(
- uint8_t clock_identity[],
- uint8_t priority1,
- uint8_t clock_class,
- int16_t offset_scaled_log_variance,
- uint8_t clock_accuracy,
- uint8_t priority2,
- uint8_t domain_number,
- int8_t log_sync_interval,
- int8_t log_announce_interval,
- int8_t log_pdelay_interval,
- uint16_t port_number );
-
- /**
- * @brief unmaps and unlink shared memory
- * @return void
- */
- void stop();
-};
-
-
-#endif/*LINUX_HAL_COMMON_HPP*/