summaryrefslogtreecommitdiff
path: root/daemons/gptp/windows/daemon_cl/windows_hal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'daemons/gptp/windows/daemon_cl/windows_hal.cpp')
-rw-r--r--daemons/gptp/windows/daemon_cl/windows_hal.cpp386
1 files changed, 0 insertions, 386 deletions
diff --git a/daemons/gptp/windows/daemon_cl/windows_hal.cpp b/daemons/gptp/windows/daemon_cl/windows_hal.cpp
deleted file mode 100644
index 3d034e39..00000000
--- a/daemons/gptp/windows/daemon_cl/windows_hal.cpp
+++ /dev/null
@@ -1,386 +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.
-
-******************************************************************************/
-
-#include <WinSock2.h>
-#include <iphlpapi.h>
-#include <windows_hal.hpp>
-#include <IPCListener.hpp>
-#include <PeerList.hpp>
-#include <gptp_log.hpp>
-
-DWORD WINAPI OSThreadCallback( LPVOID input ) {
- OSThreadArg *arg = (OSThreadArg*) input;
- arg->ret = arg->func( arg->arg );
- return 0;
-}
-
-VOID CALLBACK WindowsTimerQueueHandler( PVOID arg_in, BOOLEAN ignore ) {
- WindowsTimerQueueHandlerArg *arg = (WindowsTimerQueueHandlerArg *) arg_in;
- size_t diff;
-
- // Remove myself from unexpired timer queue
- AcquireSRWLockExclusive( &arg->timer_queue->lock );
- diff = arg->timer_queue->arg_list.size();
- arg->timer_queue->arg_list.remove( arg );
- diff -= arg->timer_queue->arg_list.size();
- ReleaseSRWLockExclusive( &arg->timer_queue->lock );
-
- // If the remove was unsuccessful bail because we were
- // stepped on by 'cancelEvent'
- if( diff == 0 ) return;
-
- arg->func( arg->inner_arg );
-
- // Add myself to the expired timer queue
- AcquireSRWLockExclusive( &arg->queue->retiredTimersLock );
- arg->queue->retiredTimers.push_front( arg );
- ReleaseSRWLockExclusive( &arg->queue->retiredTimersLock );
-}
-
-inline uint64_t scale64(uint64_t i, uint32_t m, uint32_t n)
-{
- uint64_t tmp, res, rem;
-
- rem = i % n;
- i /= n;
-
- res = i * m;
- tmp = rem * m;
-
- tmp /= n;
-
- return res + tmp;
-}
-
-void WirelessTimestamperCallback( LPVOID arg )
-{
- WirelessTimestamperCallbackArg *larg =
- (WirelessTimestamperCallbackArg *)arg;
- WindowsWirelessTimestamper *timestamper =
- dynamic_cast<WindowsWirelessTimestamper *> (larg->timestamper);
- WirelessDialog tmp1, tmp2;
- LinkLayerAddress *peer_addr = NULL;
-
- if (timestamper == NULL)
- {
- GPTP_LOG_ERROR( "Wrong timestamper type: %p",
- larg->timestamper );
- return;
- }
-
- switch( larg->iEvent_type )
- {
- default:
- case TIMINGMSMT_CONFIRM_EVENT:
- tmp1.action_devclk = larg->event_data.confirm.T1;
- tmp1.ack_devclk = larg->event_data.confirm.T4;
- tmp1.dialog_token = (BYTE)larg->event_data.confirm.DialogToken;
- GPTP_LOG_VERBOSE
- ( "Got confirm, %hhu(%llu,%llu)", tmp1.dialog_token,
- tmp1.action_devclk, tmp1.ack_devclk );
- peer_addr = new LinkLayerAddress
- ( larg->event_data.confirm.PeerMACAddress );
- larg->timestamper->
- timingMeasurementConfirmCB( *peer_addr, &tmp1 );
-
- break;
-
- case TIMINGMSMT_EVENT:
- tmp1/*prev*/.action_devclk = larg->event_data.indication.
- indication.T1;
- tmp1/*prev*/.ack_devclk = larg->event_data.indication.
- indication.T4;
- tmp1/*prev*/.dialog_token = (BYTE)larg->event_data.indication.
- indication.FollowUpDialogToken;
- tmp2/*curr*/.action_devclk = larg->event_data.indication.
- indication.T2;
- tmp2/*curr*/.ack_devclk = larg->event_data.indication.
- indication.T3;
- tmp2/*curr*/.dialog_token = (BYTE)larg->event_data.indication.
- indication.DialogToken;
- GPTP_LOG_VERBOSE
- ("Got indication, %hhu(%llu,%llu) %hhu(%llu,%llu)",
- tmp1.dialog_token, tmp1.action_devclk,
- tmp1.ack_devclk, tmp2.dialog_token,
- tmp2.action_devclk, tmp2.ack_devclk);
- peer_addr = new LinkLayerAddress(larg->event_data.indication.
- indication.PeerMACAddress);
-
- larg->timestamper->timeMeasurementIndicationCB
- ( *peer_addr, &tmp2, &tmp1,
- larg->event_data.indication.
- indication.PtpSpec.fwup_data,
- larg->event_data.indication.
- indication.WiFiVSpecHdr.Length - (sizeof(PTP_SPEC) -
- 1));
-
- break;
-
- case TIMINGMSMT_CORRELATEDTIME_EVENT:
- timestamper->system_counter =
- scale64( larg->event_data.ptm_wa.TSC, NS_PER_SECOND,
- (uint32_t)timestamper->tsc_hz.QuadPart );
- timestamper->system_time.set64(timestamper->system_counter);
- // Scale from TM timescale to nanoseconds
- larg->event_data.ptm_wa.LocalClk *= 10;
- timestamper->device_time.set64
- (larg->event_data.ptm_wa.LocalClk*10);
-
- break;
- }
-
- delete peer_addr;
-}
-
-net_result WindowsWirelessTimestamper::_requestTimingMeasurement
-(TIMINGMSMT_REQUEST *timingmsmt_req)
-{
- net_result ret = net_succeed;
-
- if (!adapter->initiateTimingRequest(timingmsmt_req)) {
- GPTP_LOG_ERROR("Failed to send timing measurement request\n");
- ret = net_fatal;
- }
-
- return ret;
-}
-
-bool WindowsWirelessTimestamper::HWTimestamper_gettime
-( Timestamp *system_time,
- Timestamp * device_time,
- uint32_t * local_clock,
- uint32_t * nominal_clock_rate ) const
-{
- bool refreshed = adapter->refreshCrossTimestamp();
- if (refreshed)
- {
- // We have a fresh cross-timestamp just use it
- *system_time = this->system_time;
- *device_time = this->device_time;
- } else
- {
- // We weren't able to get a fresh timestamp,
- // extrapolate from the last
- LARGE_INTEGER tsc_now;
- QueryPerformanceCounter(&tsc_now);
- unsigned device_delta = (unsigned)
- (((long double) (tsc_now.QuadPart - system_counter)) /
- (((long double)tsc_hz.QuadPart) / 1000000000));
- device_delta = (unsigned)(device_delta*getPort()->
- getLocalSystemFreqOffset());
- system_time->set64((uint64_t)
- (((long double)tsc_now.QuadPart) /
- ((long double)tsc_hz.QuadPart /
- 1000000000)));
- device_time->set64(device_delta);
- *device_time = *device_time + this->device_time;
- }
-
- return true;
-}
-
-bool WindowsWirelessTimestamper::HWTimestamper_init
-(InterfaceLabel *iface_label, OSNetworkInterface *iface)
-{
- uint8_t mac_addr_local[ETHER_ADDR_OCTETS];
-
- if (!initialized) {
- if (!adapter->initialize()) return false;
- if (getPort()->getLocalAddr() == NULL)
- return false;
-
- getPort()->getLocalAddr()->toOctetArray(mac_addr_local);
- if (!adapter->attachAdapter(mac_addr_local)) {
- return false;
- }
-
- tsc_hz.QuadPart = getTSCFrequency(false);
- if (tsc_hz.QuadPart == 0) {
- return false;
- }
-
- if (!adapter->registerTimestamper(this))
- return false;
- }
-
- initialized = true;
- return true;
-}
-
-WindowsWirelessTimestamper::~WindowsWirelessTimestamper() {
- if (adapter->deregisterTimestamper(this))
- adapter->shutdown();
- else
- GPTP_LOG_INFO("Failed to shutdown time sync on adapter");
-}
-
-bool WindowsEtherTimestamper::HWTimestamper_init( InterfaceLabel *iface_label, OSNetworkInterface *net_iface ) {
- char network_card_id[64];
- LinkLayerAddress *addr = dynamic_cast<LinkLayerAddress *>(iface_label);
- if( addr == NULL ) return false;
- PIP_ADAPTER_INFO pAdapterInfo;
- IP_ADAPTER_INFO AdapterInfo[32]; // Allocate information for up to 32 NICs
- DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
-
- DWORD dwStatus = GetAdaptersInfo( AdapterInfo, &dwBufLen );
- if( dwStatus != ERROR_SUCCESS ) return false;
-
- for( pAdapterInfo = AdapterInfo; pAdapterInfo != NULL; pAdapterInfo = pAdapterInfo->Next ) {
- if( pAdapterInfo->AddressLength == ETHER_ADDR_OCTETS && *addr == LinkLayerAddress( pAdapterInfo->Address )) {
- break;
- }
- }
-
- if( pAdapterInfo == NULL ) return false;
-
- DeviceClockRateMapping *rate_map = DeviceClockRateMap;
- while (rate_map->device_desc != NULL)
- {
- if (strstr(pAdapterInfo->Description, rate_map->device_desc) != NULL)
- break;
- ++rate_map;
- }
- if (rate_map->device_desc != NULL) {
- netclock_hz.QuadPart = rate_map->clock_rate;
- }
- else {
- GPTP_LOG_ERROR("Unable to determine clock rate for interface %s", pAdapterInfo->Description);
- return false;
- }
-
- GPTP_LOG_INFO( "Adapter UID: %s\n", pAdapterInfo->AdapterName );
- PLAT_strncpy( network_card_id, NETWORK_CARD_ID_PREFIX, 63 );
- PLAT_strncpy( network_card_id+strlen(network_card_id), pAdapterInfo->AdapterName, 63-strlen(network_card_id) );
-
- miniport = CreateFile( network_card_id,
- GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_EXISTING, 0, NULL );
- if( miniport == INVALID_HANDLE_VALUE ) return false;
-
- tsc_hz.QuadPart = getTSCFrequency( true );
- if( tsc_hz.QuadPart == 0 ) {
- return false;
- }
-
- return true;
-}
-
-bool WindowsNamedPipeIPC::init(OS_IPC_ARG *arg) {
- IPCListener *ipclistener;
- IPCSharedData ipcdata = { &peerList_, &lOffset_ };
-
- ipclistener = new IPCListener();
- // Start IPC listen thread
- if (!ipclistener->start(ipcdata)) {
- GPTP_LOG_ERROR("Starting IPC listener thread failed");
- }
- else {
- GPTP_LOG_INFO("Starting IPC listener thread succeeded");
- }
-
- return true;
-}
-
-bool WindowsNamedPipeIPC::update(
- int64_t ml_phoffset,
- int64_t ls_phoffset,
- FrequencyRatio ml_freqoffset,
- FrequencyRatio ls_freq_offset,
- uint64_t local_time,
- uint32_t sync_count,
- uint32_t pdelay_count,
- PortState port_state,
- bool asCapable )
-{
- lOffset_.get();
- lOffset_.local_time = local_time;
- lOffset_.ml_freqoffset = ml_freqoffset;
- lOffset_.ml_phoffset = ml_phoffset;
- lOffset_.ls_freqoffset = ls_freq_offset;
- lOffset_.ls_phoffset = ls_phoffset;
-
- if (!lOffset_.isReady()) lOffset_.setReady(true);
- lOffset_.put();
- return true;
-}
-
-bool WindowsNamedPipeIPC::update_grandmaster(
- uint8_t gptp_grandmaster_id[],
- uint8_t gptp_domain_number )
-{
- lOffset_.get();
- memcpy(lOffset_.gptp_grandmaster_id, gptp_grandmaster_id, PTP_CLOCK_IDENTITY_LENGTH);
- lOffset_.gptp_domain_number = gptp_domain_number;
-
- if (!lOffset_.isReady()) lOffset_.setReady(true);
- lOffset_.put();
- return true;
-}
-
-bool WindowsNamedPipeIPC::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 )
-{
- lOffset_.get();
- memcpy(lOffset_.clock_identity, clock_identity, PTP_CLOCK_IDENTITY_LENGTH);
- lOffset_.priority1 = priority1;
- lOffset_.clock_class = clock_class;
- lOffset_.offset_scaled_log_variance = offset_scaled_log_variance;
- lOffset_.clock_accuracy = clock_accuracy;
- lOffset_.priority2 = priority2;
- lOffset_.domain_number = domain_number;
- lOffset_.log_sync_interval = log_sync_interval;
- lOffset_.log_announce_interval = log_announce_interval;
- lOffset_.log_pdelay_interval = log_pdelay_interval;
- lOffset_.port_number = port_number;
-
- if (!lOffset_.isReady()) lOffset_.setReady(true);
- lOffset_.put();
- return true;
-}
-
-
-void WindowsPCAPNetworkInterface::watchNetLink( CommonPort *pPort)
-{
- /* ToDo add link up/down detection, Google MIB_IPADDR_DISCONNECTED */
-}