diff options
Diffstat (limited to 'daemons/gptp/common/wireless_tstamper.hpp')
-rw-r--r-- | daemons/gptp/common/wireless_tstamper.hpp | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/daemons/gptp/common/wireless_tstamper.hpp b/daemons/gptp/common/wireless_tstamper.hpp new file mode 100644 index 00000000..79413d0d --- /dev/null +++ b/daemons/gptp/common/wireless_tstamper.hpp @@ -0,0 +1,221 @@ +/****************************************************************************** + +Copyright (c) 2009-2015, 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 WIRELESS_TSTAMPER_HPP +#define WIRELESS_TSTAMPER_HPP + +#include <common_tstamper.hpp> +#include <wireless_port.hpp> + +#define MAX_DIALOG_TOKEN 255 +#define OUI_8021AS_OCTETS { 0x00, 0x80, 0xC2 } +static const uint8_t OUI_8021AS[] = OUI_8021AS_OCTETS; +#define FWUP_TYPE 0 +#define FWUP_VDEF_TAG 0xDD /* Vendor Defined Tag */ + +typedef enum _WIRELESS_EVENT_TYPE +{ + TIMINGMSMT_EVENT = 0, + TIMINGMSMT_CONFIRM_EVENT, + TIMINGMSMT_CORRELATEDTIME_EVENT, +} WIRELESS_EVENT_TYPE; + +#pragma pack(push, 1) +typedef struct +{ + uint8_t oui[sizeof(OUI_8021AS)]; + uint8_t type; +} FwUpLabel_t; + +typedef struct _PTP_SPEC +{ + FwUpLabel_t FwUpLabel; + uint8_t fwup_data[1]; +} PTP_SPEC; + +static const FwUpLabel_t FwUpLabel = { OUI_8021AS_OCTETS, FWUP_TYPE }; + +typedef struct _WIFI_VENDOR_SPEC_HDR +{ + uint8_t ElementId; + uint8_t Length; +} WIFI_VENDOR_SPEC_HDR; +#pragma pack(pop) + +typedef struct _TIMINGMSMT_REQUEST +{ + uint8_t PeerMACAddress[ETHER_ADDR_OCTETS]; + uint8_t Category; + uint8_t Action; + uint8_t DialogToken; + uint8_t FollowUpDialogToken; + uint32_t T1; + uint32_t T4; + uint8_t MaxT1Error; + uint8_t MaxT4Error; + + WIFI_VENDOR_SPEC_HDR WiFiVSpecHdr; + PTP_SPEC PtpSpec; +} TIMINGMSMT_REQUEST; + +typedef struct _TIMINGMSMT_EVENT_DATA +{ + uint8_t PeerMACAddress[ETHER_ADDR_OCTETS]; + uint32_t DialogToken; + uint32_t FollowUpDialogToken; + uint64_t T1; + uint32_t MaxT1Error; + uint64_t T4; + uint32_t MaxT4Error; + uint64_t T2; + uint32_t MaxT2Error; + uint64_t T3; + uint32_t MaxT3Error; + + WIFI_VENDOR_SPEC_HDR WiFiVSpecHdr; + PTP_SPEC PtpSpec; +} TIMINGMSMT_EVENT_DATA; + +typedef struct _TIMINGMSMT_CONFIRM_EVENT_DATA +{ + uint8_t PeerMACAddress[ETHER_ADDR_OCTETS]; + uint32_t DialogToken; + uint64_t T1; + uint32_t MaxT1Error; + uint64_t T4; + uint32_t MaxT4Error; +} TIMINGMSMT_CONFIRM_EVENT_DATA; + +typedef struct _WIRELESS_CORRELATEDTIME +{ + uint64_t TSC; + uint64_t LocalClk; +} WIRELESS_CORRELATEDTIME; + +struct S8021AS_Indication { + TIMINGMSMT_EVENT_DATA indication; + uint8_t followup[75]; // (34 header + 10 followup + 32 TLV) - 1 byte contained in indication struct = 75 +}; + +union TimeSyncEventData +{ + TIMINGMSMT_CONFIRM_EVENT_DATA confirm; + S8021AS_Indication indication; + WIRELESS_CORRELATEDTIME ptm_wa; +}; + +class WirelessTimestamper : public CommonTimestamper +{ +private: + WirelessPort *port; +public: + virtual ~WirelessTimestamper() {} + + /** + * @brief attach timestamper to port + * @param port port to attach + */ + void setPort( WirelessPort *port ) + { + this->port = port; + } + + /** + * @brief return reference to attached port + * @return reference to attached port + */ + WirelessPort *getPort(void) const + { + return port; + } + + /** + * @brief Return buffer offset where followup message should be placed + * @return byte offset + */ + uint8_t getFwUpOffset(void) + { + // Subtract 1 to compensate for 'bogus' vendor specific buffer + // length + return (uint8_t)((size_t) &((TIMINGMSMT_REQUEST *) 0)-> + PtpSpec.fwup_data ); + } + + /** + * @brief Request transmission of TM frame + * @param dest [in] MAC destination the frame should be sent to + * @param seq [in] 802.1AS sequence number + * @param prev_dialog [in] last dialog message + * @param follow_up [in] buffer containing followup message + * @param followup_length [in] fw-up message length in bytes + */ + virtual net_result requestTimingMeasurement + ( LinkLayerAddress *dest, uint16_t seq, WirelessDialog *prev_dialog, + uint8_t *follow_up, int followup_length ); + + /** + * @brief abstract method for driver/os specific TM transmit code + * @param timingmsmt_req fully formed TM message + */ + virtual net_result _requestTimingMeasurement + ( TIMINGMSMT_REQUEST *timingmsmt_req ) = 0; + + /** + * @brief Asynchronous completion of TM transmit + * @param addr [in] MAC the message was transmitted to + * @param dialog [in] dialog filled with T1, T4 timestamps + */ + void timingMeasurementConfirmCB( LinkLayerAddress addr, + WirelessDialog *dialog ); + + /** + * @brief Reception of TM frame + * @param addr [in] MAC the message was received from + * @param current [in] dialog filled with T2, T3 timestamps + * @param previous [in] dialog filled with T1, T4 timestamps + * @param buf [in] buffer containing followup message + * @param previous [in] length of followup message + */ + void timeMeasurementIndicationCB + ( LinkLayerAddress addr, WirelessDialog *current, + WirelessDialog *previous, uint8_t *buf, size_t buflen ); +}; + +struct WirelessTimestamperCallbackArg +{ + WIRELESS_EVENT_TYPE iEvent_type; + WirelessTimestamper *timestamper; + TimeSyncEventData event_data; +}; + +#endif/*WIRELESS_TSTAMPER_HPP*/ |