• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * A service that exchanges time synchronization information between
19  * a master that defines a timeline and clients that follow the timeline.
20  */
21 
22 #define LOG_TAG "common_time"
23 #include <utils/Log.h>
24 
25 #include <arpa/inet.h>
26 #include <assert.h>
27 #include <fcntl.h>
28 #include <linux/if_ether.h>
29 #include <net/if.h>
30 #include <net/if_arp.h>
31 #include <netinet/ip.h>
32 #include <poll.h>
33 #include <stdio.h>
34 #include <sys/eventfd.h>
35 #include <sys/ioctl.h>
36 #include <sys/stat.h>
37 #include <sys/types.h>
38 #include <sys/socket.h>
39 
40 #include <common_time/local_clock.h>
41 #include <binder/IPCThreadState.h>
42 #include <binder/ProcessState.h>
43 #include <utils/Timers.h>
44 
45 #include "common_clock_service.h"
46 #include "common_time_config_service.h"
47 #include "common_time_server.h"
48 #include "common_time_server_packets.h"
49 #include "clock_recovery.h"
50 #include "common_clock.h"
51 
52 #define MAX_INT ((int)0x7FFFFFFF)
53 
54 namespace android {
55 
56 const char*    CommonTimeServer::kDefaultMasterElectionAddr = "239.195.128.88";
57 const uint16_t CommonTimeServer::kDefaultMasterElectionPort = 8887;
58 const uint64_t CommonTimeServer::kDefaultSyncGroupID = 0;
59 const uint8_t  CommonTimeServer::kDefaultMasterPriority = 1;
60 const uint32_t CommonTimeServer::kDefaultMasterAnnounceIntervalMs = 10000;
61 const uint32_t CommonTimeServer::kDefaultSyncRequestIntervalMs = 1000;
62 const uint32_t CommonTimeServer::kDefaultPanicThresholdUsec = 50000;
63 const bool     CommonTimeServer::kDefaultAutoDisable = true;
64 const int      CommonTimeServer::kSetupRetryTimeoutMs = 30000;
65 const int64_t  CommonTimeServer::kNoGoodDataPanicThresholdUsec = 600000000ll;
66 const uint32_t CommonTimeServer::kRTTDiscardPanicThreshMultiplier = 5;
67 
68 // timeout value representing an infinite timeout
69 const int CommonTimeServer::kInfiniteTimeout = -1;
70 
71 /*** Initial state constants ***/
72 
73 // number of WhoIsMaster attempts sent before giving up
74 const int CommonTimeServer::kInitial_NumWhoIsMasterRetries = 6;
75 
76 // timeout used when waiting for a response to a WhoIsMaster request
77 const int CommonTimeServer::kInitial_WhoIsMasterTimeoutMs = 500;
78 
79 /*** Client state constants ***/
80 
81 // number of sync requests that can fail before a client assumes its master
82 // is dead
83 const int CommonTimeServer::kClient_NumSyncRequestRetries = 10;
84 
85 /*** Master state constants ***/
86 
87 /*** Ronin state constants ***/
88 
89 // number of WhoIsMaster attempts sent before declaring ourselves master
90 const int CommonTimeServer::kRonin_NumWhoIsMasterRetries = 20;
91 
92 // timeout used when waiting for a response to a WhoIsMaster request
93 const int CommonTimeServer::kRonin_WhoIsMasterTimeoutMs = 500;
94 
95 /*** WaitForElection state constants ***/
96 
97 // how long do we wait for an announcement from a master before
98 // trying another election?
99 const int CommonTimeServer::kWaitForElection_TimeoutMs = 12500;
100 
CommonTimeServer()101 CommonTimeServer::CommonTimeServer()
102     : Thread(false)
103     , mState(ICommonClock::STATE_INITIAL)
104     , mClockRecovery(&mLocalClock, &mCommonClock)
105     , mSocket(-1)
106     , mLastPacketRxLocalTime(0)
107     , mTimelineID(ICommonClock::kInvalidTimelineID)
108     , mClockSynced(false)
109     , mCommonClockHasClients(false)
110     , mInitial_WhoIsMasterRequestTimeouts(0)
111     , mClient_MasterDeviceID(0)
112     , mClient_MasterDevicePriority(0)
113     , mRonin_WhoIsMasterRequestTimeouts(0) {
114     // zero out sync stats
115     resetSyncStats();
116 
117     // Setup the master election endpoint to use the default.
118     struct sockaddr_in* meep =
119         reinterpret_cast<struct sockaddr_in*>(&mMasterElectionEP);
120     memset(&mMasterElectionEP, 0, sizeof(mMasterElectionEP));
121     inet_aton(kDefaultMasterElectionAddr, &meep->sin_addr);
122     meep->sin_family = AF_INET;
123     meep->sin_port   = htons(kDefaultMasterElectionPort);
124 
125     // Zero out the master endpoint.
126     memset(&mMasterEP, 0, sizeof(mMasterEP));
127     mMasterEPValid    = false;
128     mBindIfaceValid   = false;
129     setForceLowPriority(false);
130 
131     // Set all remaining configuration parameters to their defaults.
132     mDeviceID                 = 0;
133     mSyncGroupID              = kDefaultSyncGroupID;
134     mMasterPriority           = kDefaultMasterPriority;
135     mMasterAnnounceIntervalMs = kDefaultMasterAnnounceIntervalMs;
136     mSyncRequestIntervalMs    = kDefaultSyncRequestIntervalMs;
137     mPanicThresholdUsec       = kDefaultPanicThresholdUsec;
138     mAutoDisable              = kDefaultAutoDisable;
139 
140     // Create the eventfd we will use to signal our thread to wake up when
141     // needed.
142     mWakeupThreadFD = eventfd(0, EFD_NONBLOCK);
143 
144     // seed the random number generator (used to generated timeline IDs)
145     srand48(static_cast<unsigned int>(systemTime()));
146 }
147 
~CommonTimeServer()148 CommonTimeServer::~CommonTimeServer() {
149     shutdownThread();
150 
151     // No need to grab the lock here.  We are in the destructor; if the the user
152     // has a thread in any of the APIs while the destructor is being called,
153     // there is a threading problem a the application level we cannot reasonably
154     // do anything about.
155     cleanupSocket_l();
156 
157     if (mWakeupThreadFD >= 0) {
158         close(mWakeupThreadFD);
159         mWakeupThreadFD = -1;
160     }
161 }
162 
startServices()163 bool CommonTimeServer::startServices() {
164     // start the ICommonClock service
165     mICommonClock = CommonClockService::instantiate(*this);
166     if (mICommonClock == NULL)
167         return false;
168 
169     // start the ICommonTimeConfig service
170     mICommonTimeConfig = CommonTimeConfigService::instantiate(*this);
171     if (mICommonTimeConfig == NULL)
172         return false;
173 
174     return true;
175 }
176 
threadLoop()177 bool CommonTimeServer::threadLoop() {
178     // Register our service interfaces.
179     if (!startServices())
180         return false;
181 
182     // Hold the lock while we are in the main thread loop.  It will release the
183     // lock when it blocks, and hold the lock at all other times.
184     mLock.lock();
185     runStateMachine_l();
186     mLock.unlock();
187 
188     IPCThreadState::self()->stopProcess();
189     return false;
190 }
191 
runStateMachine_l()192 bool CommonTimeServer::runStateMachine_l() {
193     if (!mLocalClock.initCheck())
194         return false;
195 
196     if (!mCommonClock.init(mLocalClock.getLocalFreq()))
197         return false;
198 
199     // Enter the initial state.
200     becomeInitial("startup");
201 
202     // run the state machine
203     while (!exitPending()) {
204         struct pollfd pfds[2];
205         int rc;
206         int eventCnt = 0;
207         int64_t wakeupTime;
208 
209         // We are always interested in our wakeup FD.
210         pfds[eventCnt].fd      = mWakeupThreadFD;
211         pfds[eventCnt].events  = POLLIN;
212         pfds[eventCnt].revents = 0;
213         eventCnt++;
214 
215         // If we have a valid socket, then we are interested in what it has to
216         // say as well.
217         if (mSocket >= 0) {
218             pfds[eventCnt].fd      = mSocket;
219             pfds[eventCnt].events  = POLLIN;
220             pfds[eventCnt].revents = 0;
221             eventCnt++;
222         }
223 
224         // Note, we were holding mLock when this function was called.  We
225         // release it only while we are blocking and hold it at all other times.
226         mLock.unlock();
227         rc          = poll(pfds, eventCnt, mCurTimeout.msecTillTimeout());
228         wakeupTime  = mLocalClock.getLocalTime();
229         mLock.lock();
230 
231         // Is it time to shutdown?  If so, don't hesitate... just do it.
232         if (exitPending())
233             break;
234 
235         // Did the poll fail?  This should never happen and is fatal if it does.
236         if (rc < 0) {
237             ALOGE("%s:%d poll failed", __PRETTY_FUNCTION__, __LINE__);
238             return false;
239         }
240 
241         if (rc == 0)
242             mCurTimeout.setTimeout(kInfiniteTimeout);
243 
244         // Were we woken up on purpose?  If so, clear the eventfd with a read.
245         if (pfds[0].revents)
246             clearPendingWakeupEvents_l();
247 
248         // Is out bind address dirty?  If so, clean up our socket (if any).
249         // Alternatively, do we have an active socket but should be auto
250         // disabled?  If so, release the socket and enter the proper sync state.
251         bool droppedSocket = false;
252         if (mBindIfaceDirty || ((mSocket >= 0) && shouldAutoDisable())) {
253             cleanupSocket_l();
254             mBindIfaceDirty = false;
255             droppedSocket = true;
256         }
257 
258         // Do we not have a socket but should have one?  If so, try to set one
259         // up.
260         if ((mSocket < 0) && mBindIfaceValid && !shouldAutoDisable()) {
261             if (setupSocket_l()) {
262                 // Success!  We are now joining a new network (either coming
263                 // from no network, or coming from a potentially different
264                 // network).  Force our priority to be lower so that we defer to
265                 // any other masters which may already be on the network we are
266                 // joining.  Later, when we enter either the client or the
267                 // master state, we will clear this flag and go back to our
268                 // normal election priority.
269                 setForceLowPriority(true);
270                 switch (mState) {
271                     // If we were in initial (whether we had a immediately
272                     // before this network or not) we want to simply reset the
273                     // system and start again.  Forcing a transition from
274                     // INITIAL to INITIAL should do the job.
275                     case CommonClockService::STATE_INITIAL:
276                         becomeInitial("bound interface");
277                         break;
278 
279                     // If we were in the master state, then either we were the
280                     // master in a no-network situation, or we were the master
281                     // of a different network and have moved to a new interface.
282                     // In either case, immediately transition to Ronin at low
283                     // priority.  If there is no one in the network we just
284                     // joined, we will become master soon enough.  If there is,
285                     // we want to be certain to defer master status to the
286                     // existing timeline currently running on the network.
287                     //
288                     case CommonClockService::STATE_MASTER:
289                         becomeRonin("leaving networkless mode");
290                         break;
291 
292                     // If we were in any other state (CLIENT, RONIN, or
293                     // WAIT_FOR_ELECTION) then we must be moving from one
294                     // network to another.  We have lost our old master;
295                     // transition to RONIN in an attempt to find a new master.
296                     // If there are none out there, we will just assume
297                     // responsibility for the timeline we used to be a client
298                     // of.
299                     default:
300                         becomeRonin("bound interface");
301                         break;
302                 }
303             } else {
304                 // That's odd... we failed to set up our socket.  This could be
305                 // due to some transient network change which will work itself
306                 // out shortly; schedule a retry attempt in the near future.
307                 mCurTimeout.setTimeout(kSetupRetryTimeoutMs);
308             }
309 
310             // One way or the other, we don't have any data to process at this
311             // point (since we just tried to bulid a new socket).  Loop back
312             // around and wait for the next thing to do.
313             continue;
314         } else if (droppedSocket) {
315             // We just lost our socket, and for whatever reason (either no
316             // config, or auto disable engaged) we are not supposed to rebuild
317             // one at this time.  We are not going to rebuild our socket until
318             // something about our config/auto-disabled status changes, so we
319             // are basically in network-less mode.  If we are already in either
320             // INITIAL or MASTER, just stay there until something changes.  If
321             // we are in any other state (CLIENT, RONIN or WAIT_FOR_ELECTION),
322             // then transition to either INITIAL or MASTER depending on whether
323             // or not our timeline is valid.
324             ALOGI("Entering networkless mode interface is %s, "
325                  "shouldAutoDisable = %s",
326                  mBindIfaceValid ? "valid" : "invalid",
327                  shouldAutoDisable() ? "true" : "false");
328             if ((mState != ICommonClock::STATE_INITIAL) &&
329                 (mState != ICommonClock::STATE_MASTER)) {
330                 if (mTimelineID == ICommonClock::kInvalidTimelineID)
331                     becomeInitial("network-less mode");
332                 else
333                     becomeMaster("network-less mode");
334             }
335 
336             continue;
337         }
338 
339         // Did we wakeup with no signalled events across all of our FDs?  If so,
340         // we must have hit our timeout.
341         if (rc == 0) {
342             if (!handleTimeout())
343                 ALOGE("handleTimeout failed");
344             continue;
345         }
346 
347         // Does our socket have data for us (assuming we still have one, we
348         // may have RXed a packet at the same time as a config change telling us
349         // to shut our socket down)?  If so, process its data.
350         if ((mSocket >= 0) && (eventCnt > 1) && (pfds[1].revents)) {
351             mLastPacketRxLocalTime = wakeupTime;
352             if (!handlePacket())
353                 ALOGE("handlePacket failed");
354         }
355     }
356 
357     cleanupSocket_l();
358     return true;
359 }
360 
clearPendingWakeupEvents_l()361 void CommonTimeServer::clearPendingWakeupEvents_l() {
362     int64_t tmp;
363     read(mWakeupThreadFD, &tmp, sizeof(tmp));
364 }
365 
wakeupThread_l()366 void CommonTimeServer::wakeupThread_l() {
367     int64_t tmp = 1;
368     write(mWakeupThreadFD, &tmp, sizeof(tmp));
369 }
370 
cleanupSocket_l()371 void CommonTimeServer::cleanupSocket_l() {
372     if (mSocket >= 0) {
373         close(mSocket);
374         mSocket = -1;
375     }
376 }
377 
shutdownThread()378 void CommonTimeServer::shutdownThread() {
379     // Flag the work thread for shutdown.
380     this->requestExit();
381 
382     // Signal the thread in case its sleeping.
383     mLock.lock();
384     wakeupThread_l();
385     mLock.unlock();
386 
387     // Wait for the thread to exit.
388     this->join();
389 }
390 
setupSocket_l()391 bool CommonTimeServer::setupSocket_l() {
392     int rc;
393     bool ret_val = false;
394     struct sockaddr_in* ipv4_addr = NULL;
395     char masterElectionEPStr[64];
396     const int one = 1;
397 
398     // This should never be needed, but if we happened to have an old socket
399     // lying around, be sure to not leak it before proceeding.
400     cleanupSocket_l();
401 
402     // If we don't have a valid endpoint to bind to, then how did we get here in
403     // the first place?  Regardless, we know that we are going to fail to bind,
404     // so don't even try.
405     if (!mBindIfaceValid)
406         return false;
407 
408     sockaddrToString(mMasterElectionEP, true, masterElectionEPStr,
409                      sizeof(masterElectionEPStr));
410     ALOGI("Building socket :: bind = %s master election = %s",
411          mBindIface.string(), masterElectionEPStr);
412 
413     // TODO: add proper support for IPv6.  Right now, we block IPv6 addresses at
414     // the configuration interface level.
415     if (AF_INET != mMasterElectionEP.ss_family) {
416         ALOGW("TODO: add proper IPv6 support");
417         goto bailout;
418     }
419 
420     // open a UDP socket for the timeline serivce
421     mSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
422     if (mSocket < 0) {
423         ALOGE("Failed to create socket (errno = %d)", errno);
424         goto bailout;
425     }
426 
427     // Bind to the selected interface using Linux's spiffy SO_BINDTODEVICE.
428     struct ifreq ifr;
429     memset(&ifr, 0, sizeof(ifr));
430     snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", mBindIface.string());
431     ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = 0;
432     rc = setsockopt(mSocket, SOL_SOCKET, SO_BINDTODEVICE,
433                     (void *)&ifr, sizeof(ifr));
434     if (rc) {
435         ALOGE("Failed to bind socket at to interface %s (errno = %d)",
436               ifr.ifr_name, errno);
437         goto bailout;
438     }
439 
440     // Bind our socket to INADDR_ANY and the master election port.  The
441     // interface binding we made using SO_BINDTODEVICE should limit us to
442     // traffic only on the interface we are interested in.  We need to bind to
443     // INADDR_ANY and the specific master election port in order to be able to
444     // receive both unicast traffic and master election multicast traffic with
445     // just a single socket.
446     struct sockaddr_in bindAddr;
447     ipv4_addr = reinterpret_cast<struct sockaddr_in*>(&mMasterElectionEP);
448     memcpy(&bindAddr, ipv4_addr, sizeof(bindAddr));
449     bindAddr.sin_addr.s_addr = INADDR_ANY;
450     rc = bind(mSocket,
451               reinterpret_cast<const sockaddr *>(&bindAddr),
452               sizeof(bindAddr));
453     if (rc) {
454         ALOGE("Failed to bind socket to port %hu (errno = %d)",
455               ntohs(bindAddr.sin_port), errno);
456         goto bailout;
457     }
458 
459     if (0xE0000000 == (ntohl(ipv4_addr->sin_addr.s_addr) & 0xF0000000)) {
460         // If our master election endpoint is a multicast address, be sure to join
461         // the multicast group.
462         struct ip_mreq mreq;
463         mreq.imr_multiaddr = ipv4_addr->sin_addr;
464         mreq.imr_interface.s_addr = htonl(INADDR_ANY);
465         rc = setsockopt(mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
466                         &mreq, sizeof(mreq));
467         if (rc == -1) {
468             ALOGE("Failed to join multicast group at %s.  (errno = %d)",
469                  masterElectionEPStr, errno);
470             goto bailout;
471         }
472 
473         // disable loopback of multicast packets
474         const int zero = 0;
475         rc = setsockopt(mSocket, IPPROTO_IP, IP_MULTICAST_LOOP,
476                         &zero, sizeof(zero));
477         if (rc == -1) {
478             ALOGE("Failed to disable multicast loopback (errno = %d)", errno);
479             goto bailout;
480         }
481     } else
482     if (ntohl(ipv4_addr->sin_addr.s_addr) != 0xFFFFFFFF) {
483         // If the master election address is neither broadcast, nor multicast,
484         // then we are misconfigured.  The config API layer should prevent this
485         // from ever happening.
486         goto bailout;
487     }
488 
489     // Set the TTL of sent packets to 1.  (Time protocol sync should never leave
490     // the local subnet)
491     rc = setsockopt(mSocket, IPPROTO_IP, IP_TTL, &one, sizeof(one));
492     if (rc == -1) {
493         ALOGE("Failed to set TTL to %d (errno = %d)", one, errno);
494         goto bailout;
495     }
496 
497     // get the device's unique ID
498     if (!assignDeviceID())
499         goto bailout;
500 
501     ret_val = true;
502 
503 bailout:
504     if (!ret_val)
505         cleanupSocket_l();
506     return ret_val;
507 }
508 
509 // generate a unique device ID that can be used for arbitration
assignDeviceID()510 bool CommonTimeServer::assignDeviceID() {
511     if (!mBindIfaceValid)
512         return false;
513 
514     struct ifreq ifr;
515     memset(&ifr, 0, sizeof(ifr));
516     ifr.ifr_addr.sa_family = AF_INET;
517     strlcpy(ifr.ifr_name, mBindIface.string(), IFNAMSIZ);
518 
519     int rc = ioctl(mSocket, SIOCGIFHWADDR, &ifr);
520     if (rc) {
521         ALOGE("%s:%d ioctl failed", __PRETTY_FUNCTION__, __LINE__);
522         return false;
523     }
524 
525     if (ifr.ifr_addr.sa_family != ARPHRD_ETHER) {
526         ALOGE("%s:%d got non-Ethernet address", __PRETTY_FUNCTION__, __LINE__);
527         return false;
528     }
529 
530     mDeviceID = 0;
531     for (int i = 0; i < ETH_ALEN; i++) {
532         mDeviceID = (mDeviceID << 8) | ifr.ifr_hwaddr.sa_data[i];
533     }
534 
535     return true;
536 }
537 
538 // generate a new timeline ID
assignTimelineID()539 void CommonTimeServer::assignTimelineID() {
540     do {
541         mTimelineID = (static_cast<uint64_t>(lrand48()) << 32)
542                     |  static_cast<uint64_t>(lrand48());
543     } while (mTimelineID == ICommonClock::kInvalidTimelineID);
544 }
545 
546 // Select a preference between the device IDs of two potential masters.
547 // Returns true if the first ID wins, or false if the second ID wins.
arbitrateMaster(uint64_t deviceID1,uint8_t devicePrio1,uint64_t deviceID2,uint8_t devicePrio2)548 bool CommonTimeServer::arbitrateMaster(
549         uint64_t deviceID1, uint8_t devicePrio1,
550         uint64_t deviceID2, uint8_t devicePrio2) {
551     return ((devicePrio1 >  devicePrio2) ||
552            ((devicePrio1 == devicePrio2) && (deviceID1 > deviceID2)));
553 }
554 
handlePacket()555 bool CommonTimeServer::handlePacket() {
556     uint8_t buf[256];
557     struct sockaddr_storage srcAddr;
558     socklen_t srcAddrLen = sizeof(srcAddr);
559 
560     ssize_t recvBytes = recvfrom(
561             mSocket, buf, sizeof(buf), 0,
562             reinterpret_cast<const sockaddr *>(&srcAddr), &srcAddrLen);
563 
564     if (recvBytes < 0) {
565         ALOGE("%s:%d recvfrom failed", __PRETTY_FUNCTION__, __LINE__);
566         return false;
567     }
568 
569     UniversalTimeServicePacket pkt;
570     recvBytes = pkt.deserializePacket(buf, recvBytes, mSyncGroupID);
571     if (recvBytes < 0)
572         return false;
573 
574     bool result;
575     switch (pkt.packetType) {
576         case TIME_PACKET_WHO_IS_MASTER_REQUEST:
577             result = handleWhoIsMasterRequest(&pkt.p.who_is_master_request,
578                                               srcAddr);
579             break;
580 
581         case TIME_PACKET_WHO_IS_MASTER_RESPONSE:
582             result = handleWhoIsMasterResponse(&pkt.p.who_is_master_response,
583                                                srcAddr);
584             break;
585 
586         case TIME_PACKET_SYNC_REQUEST:
587             result = handleSyncRequest(&pkt.p.sync_request, srcAddr);
588             break;
589 
590         case TIME_PACKET_SYNC_RESPONSE:
591             result = handleSyncResponse(&pkt.p.sync_response, srcAddr);
592             break;
593 
594         case TIME_PACKET_MASTER_ANNOUNCEMENT:
595             result = handleMasterAnnouncement(&pkt.p.master_announcement,
596                                               srcAddr);
597             break;
598 
599         default: {
600             ALOGD("%s:%d unknown packet type(%d)",
601                     __PRETTY_FUNCTION__, __LINE__, pkt.packetType);
602             result = false;
603         } break;
604     }
605 
606     return result;
607 }
608 
handleTimeout()609 bool CommonTimeServer::handleTimeout() {
610     // If we have no socket, then this must be a timeout to retry socket setup.
611     if (mSocket < 0)
612         return true;
613 
614     switch (mState) {
615         case ICommonClock::STATE_INITIAL:
616             return handleTimeoutInitial();
617         case ICommonClock::STATE_CLIENT:
618             return handleTimeoutClient();
619         case ICommonClock::STATE_MASTER:
620             return handleTimeoutMaster();
621         case ICommonClock::STATE_RONIN:
622             return handleTimeoutRonin();
623         case ICommonClock::STATE_WAIT_FOR_ELECTION:
624             return handleTimeoutWaitForElection();
625     }
626 
627     return false;
628 }
629 
handleTimeoutInitial()630 bool CommonTimeServer::handleTimeoutInitial() {
631     if (++mInitial_WhoIsMasterRequestTimeouts ==
632             kInitial_NumWhoIsMasterRetries) {
633         // none of our attempts to discover a master succeeded, so make
634         // this device the master
635         return becomeMaster("initial timeout");
636     } else {
637         // retry the WhoIsMaster request
638         return sendWhoIsMasterRequest();
639     }
640 }
641 
handleTimeoutClient()642 bool CommonTimeServer::handleTimeoutClient() {
643     if (shouldPanicNotGettingGoodData())
644         return becomeInitial("timeout panic, no good data");
645 
646     if (mClient_SyncRequestPending) {
647         mClient_SyncRequestPending = false;
648 
649         if (++mClient_SyncRequestTimeouts < kClient_NumSyncRequestRetries) {
650             // a sync request has timed out, so retry
651             return sendSyncRequest();
652         } else {
653             // The master has failed to respond to a sync request for too many
654             // times in a row.  Assume the master is dead and start electing
655             // a new master.
656             return becomeRonin("master not responding");
657         }
658     } else {
659         // initiate the next sync request
660         return sendSyncRequest();
661     }
662 }
663 
handleTimeoutMaster()664 bool CommonTimeServer::handleTimeoutMaster() {
665     // send another announcement from the master
666     return sendMasterAnnouncement();
667 }
668 
handleTimeoutRonin()669 bool CommonTimeServer::handleTimeoutRonin() {
670     if (++mRonin_WhoIsMasterRequestTimeouts == kRonin_NumWhoIsMasterRetries) {
671         // no other master is out there, so we won the election
672         return becomeMaster("no better masters detected");
673     } else {
674         return sendWhoIsMasterRequest();
675     }
676 }
677 
handleTimeoutWaitForElection()678 bool CommonTimeServer::handleTimeoutWaitForElection() {
679     return becomeRonin("timeout waiting for election conclusion");
680 }
681 
handleWhoIsMasterRequest(const WhoIsMasterRequestPacket * request,const sockaddr_storage & srcAddr)682 bool CommonTimeServer::handleWhoIsMasterRequest(
683         const WhoIsMasterRequestPacket* request,
684         const sockaddr_storage& srcAddr) {
685     if (mState == ICommonClock::STATE_MASTER) {
686         // is this request related to this master's timeline?
687         if (request->timelineID != ICommonClock::kInvalidTimelineID &&
688             request->timelineID != mTimelineID)
689             return true;
690 
691         WhoIsMasterResponsePacket pkt;
692         pkt.initHeader(mTimelineID, mSyncGroupID);
693         pkt.deviceID = mDeviceID;
694         pkt.devicePriority = effectivePriority();
695 
696         uint8_t buf[256];
697         ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
698         if (bufSz < 0)
699             return false;
700 
701         ssize_t sendBytes = sendto(
702                 mSocket, buf, bufSz, 0,
703                 reinterpret_cast<const sockaddr *>(&srcAddr),
704                 sizeof(srcAddr));
705         if (sendBytes == -1) {
706             ALOGE("%s:%d sendto failed", __PRETTY_FUNCTION__, __LINE__);
707             return false;
708         }
709     } else if (mState == ICommonClock::STATE_RONIN) {
710         // if we hear a WhoIsMaster request from another device following
711         // the same timeline and that device wins arbitration, then we will stop
712         // trying to elect ourselves master and will instead wait for an
713         // announcement from the election winner
714         if (request->timelineID != mTimelineID)
715             return true;
716 
717         if (arbitrateMaster(request->senderDeviceID,
718                             request->senderDevicePriority,
719                             mDeviceID,
720                             effectivePriority()))
721             return becomeWaitForElection("would lose election");
722 
723         return true;
724     } else if (mState == ICommonClock::STATE_INITIAL) {
725         // If a group of devices booted simultaneously (e.g. after a power
726         // outage) and all of them are in the initial state and there is no
727         // master, then each device may time out and declare itself master at
728         // the same time.  To avoid this, listen for
729         // WhoIsMaster(InvalidTimeline) requests from peers.  If we would lose
730         // arbitration against that peer, reset our timeout count so that the
731         // peer has a chance to become master before we time out.
732         if (request->timelineID == ICommonClock::kInvalidTimelineID &&
733                 arbitrateMaster(request->senderDeviceID,
734                                 request->senderDevicePriority,
735                                 mDeviceID,
736                                 effectivePriority())) {
737             mInitial_WhoIsMasterRequestTimeouts = 0;
738         }
739     }
740 
741     return true;
742 }
743 
handleWhoIsMasterResponse(const WhoIsMasterResponsePacket * response,const sockaddr_storage & srcAddr)744 bool CommonTimeServer::handleWhoIsMasterResponse(
745         const WhoIsMasterResponsePacket* response,
746         const sockaddr_storage& srcAddr) {
747     if (mState == ICommonClock::STATE_INITIAL || mState == ICommonClock::STATE_RONIN) {
748         return becomeClient(srcAddr,
749                             response->deviceID,
750                             response->devicePriority,
751                             response->timelineID,
752                             "heard whois response");
753     } else if (mState == ICommonClock::STATE_CLIENT) {
754         // if we get multiple responses because there are multiple devices
755         // who believe that they are master, then follow the master that
756         // wins arbitration
757         if (arbitrateMaster(response->deviceID,
758                             response->devicePriority,
759                             mClient_MasterDeviceID,
760                             mClient_MasterDevicePriority)) {
761             return becomeClient(srcAddr,
762                                 response->deviceID,
763                                 response->devicePriority,
764                                 response->timelineID,
765                                 "heard whois response");
766         }
767     }
768 
769     return true;
770 }
771 
handleSyncRequest(const SyncRequestPacket * request,const sockaddr_storage & srcAddr)772 bool CommonTimeServer::handleSyncRequest(const SyncRequestPacket* request,
773                                          const sockaddr_storage& srcAddr) {
774     SyncResponsePacket pkt;
775     pkt.initHeader(mTimelineID, mSyncGroupID);
776 
777     if ((mState == ICommonClock::STATE_MASTER) &&
778         (mTimelineID == request->timelineID)) {
779         int64_t rxLocalTime = mLastPacketRxLocalTime;
780         int64_t rxCommonTime;
781 
782         // If we are master on an actual network and have actual clients, then
783         // we are no longer low priority.
784         setForceLowPriority(false);
785 
786         if (OK != mCommonClock.localToCommon(rxLocalTime, &rxCommonTime)) {
787             return false;
788         }
789 
790         int64_t txLocalTime = mLocalClock.getLocalTime();;
791         int64_t txCommonTime;
792         if (OK != mCommonClock.localToCommon(txLocalTime, &txCommonTime)) {
793             return false;
794         }
795 
796         pkt.nak = 0;
797         pkt.clientTxLocalTime  = request->clientTxLocalTime;
798         pkt.masterRxCommonTime = rxCommonTime;
799         pkt.masterTxCommonTime = txCommonTime;
800     } else {
801         pkt.nak = 1;
802         pkt.clientTxLocalTime  = 0;
803         pkt.masterRxCommonTime = 0;
804         pkt.masterTxCommonTime = 0;
805     }
806 
807     uint8_t buf[256];
808     ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
809     if (bufSz < 0)
810         return false;
811 
812     ssize_t sendBytes = sendto(
813             mSocket, &buf, bufSz, 0,
814             reinterpret_cast<const sockaddr *>(&srcAddr),
815             sizeof(srcAddr));
816     if (sendBytes == -1) {
817         ALOGE("%s:%d sendto failed", __PRETTY_FUNCTION__, __LINE__);
818         return false;
819     }
820 
821     return true;
822 }
823 
handleSyncResponse(const SyncResponsePacket * response,const sockaddr_storage & srcAddr)824 bool CommonTimeServer::handleSyncResponse(
825         const SyncResponsePacket* response,
826         const sockaddr_storage& srcAddr) {
827     if (mState != ICommonClock::STATE_CLIENT)
828         return true;
829 
830     assert(mMasterEPValid);
831     if (!sockaddrMatch(srcAddr, mMasterEP, true)) {
832         char srcEP[64], expectedEP[64];
833         sockaddrToString(srcAddr, true, srcEP, sizeof(srcEP));
834         sockaddrToString(mMasterEP, true, expectedEP, sizeof(expectedEP));
835         ALOGI("Dropping sync response from unexpected address."
836              " Expected %s Got %s", expectedEP, srcEP);
837         return true;
838     }
839 
840     if (response->nak) {
841         // if our master is no longer accepting requests, then we need to find
842         // a new master
843         return becomeRonin("master NAK'ed");
844     }
845 
846     mClient_SyncRequestPending = 0;
847     mClient_SyncRequestTimeouts = 0;
848     mClient_PacketRTTLog.logRX(response->clientTxLocalTime,
849                                mLastPacketRxLocalTime);
850 
851     bool result;
852     if (!(mClient_SyncRespsRXedFromCurMaster++)) {
853         // the first request/response exchange between a client and a master
854         // may take unusually long due to ARP, so discard it.
855         result = true;
856     } else {
857         int64_t clientTxLocalTime  = response->clientTxLocalTime;
858         int64_t clientRxLocalTime  = mLastPacketRxLocalTime;
859         int64_t masterTxCommonTime = response->masterTxCommonTime;
860         int64_t masterRxCommonTime = response->masterRxCommonTime;
861 
862         int64_t rtt       = (clientRxLocalTime - clientTxLocalTime);
863         int64_t avgLocal  = (clientTxLocalTime + clientRxLocalTime) >> 1;
864         int64_t avgCommon = (masterTxCommonTime + masterRxCommonTime) >> 1;
865 
866         // if the RTT of the packet is significantly larger than the panic
867         // threshold, we should simply discard it.  Its better to do nothing
868         // than to take cues from a packet like that.
869         int rttCommon = mCommonClock.localDurationToCommonDuration(rtt);
870         if (rttCommon > (static_cast<int64_t>(mPanicThresholdUsec) *
871                          kRTTDiscardPanicThreshMultiplier)) {
872             ALOGV("Dropping sync response with RTT of %lld uSec", rttCommon);
873             mClient_ExpiredSyncRespsRXedFromCurMaster++;
874             if (shouldPanicNotGettingGoodData())
875                 return becomeInitial("RX panic, no good data");
876         } else {
877             result = mClockRecovery.pushDisciplineEvent(avgLocal, avgCommon, rttCommon);
878             mClient_LastGoodSyncRX = clientRxLocalTime;
879 
880             if (result) {
881                 // indicate to listeners that we've synced to the common timeline
882                 notifyClockSync();
883             } else {
884                 ALOGE("Panic!  Observed clock sync error is too high to tolerate,"
885                         " resetting state machine and starting over.");
886                 notifyClockSyncLoss();
887                 return becomeInitial("panic");
888             }
889         }
890     }
891 
892     mCurTimeout.setTimeout(mSyncRequestIntervalMs);
893     return result;
894 }
895 
handleMasterAnnouncement(const MasterAnnouncementPacket * packet,const sockaddr_storage & srcAddr)896 bool CommonTimeServer::handleMasterAnnouncement(
897         const MasterAnnouncementPacket* packet,
898         const sockaddr_storage& srcAddr) {
899     uint64_t newDeviceID   = packet->deviceID;
900     uint8_t  newDevicePrio = packet->devicePriority;
901     uint64_t newTimelineID = packet->timelineID;
902 
903     if (mState == ICommonClock::STATE_INITIAL ||
904         mState == ICommonClock::STATE_RONIN ||
905         mState == ICommonClock::STATE_WAIT_FOR_ELECTION) {
906         // if we aren't currently following a master, then start following
907         // this new master
908         return becomeClient(srcAddr,
909                             newDeviceID,
910                             newDevicePrio,
911                             newTimelineID,
912                             "heard master announcement");
913     } else if (mState == ICommonClock::STATE_CLIENT) {
914         // if the new master wins arbitration against our current master,
915         // then become a client of the new master
916         if (arbitrateMaster(newDeviceID,
917                             newDevicePrio,
918                             mClient_MasterDeviceID,
919                             mClient_MasterDevicePriority))
920             return becomeClient(srcAddr,
921                                 newDeviceID,
922                                 newDevicePrio,
923                                 newTimelineID,
924                                 "heard master announcement");
925     } else if (mState == ICommonClock::STATE_MASTER) {
926         // two masters are competing - if the new one wins arbitration, then
927         // cease acting as master
928         if (arbitrateMaster(newDeviceID, newDevicePrio,
929                             mDeviceID, effectivePriority()))
930             return becomeClient(srcAddr, newDeviceID,
931                                 newDevicePrio, newTimelineID,
932                                 "heard master announcement");
933     }
934 
935     return true;
936 }
937 
sendWhoIsMasterRequest()938 bool CommonTimeServer::sendWhoIsMasterRequest() {
939     assert(mState == ICommonClock::STATE_INITIAL || mState == ICommonClock::STATE_RONIN);
940 
941     // If we have no socket, then we must be in the unconfigured initial state.
942     // Don't report any errors, just don't try to send the initial who-is-master
943     // query.  Eventually, our network will either become configured, or we will
944     // be forced into network-less master mode by higher level code.
945     if (mSocket < 0) {
946         assert(mState == ICommonClock::STATE_INITIAL);
947         return true;
948     }
949 
950     bool ret = false;
951     WhoIsMasterRequestPacket pkt;
952     pkt.initHeader(mSyncGroupID);
953     pkt.senderDeviceID = mDeviceID;
954     pkt.senderDevicePriority = effectivePriority();
955 
956     uint8_t buf[256];
957     ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
958     if (bufSz >= 0) {
959         ssize_t sendBytes = sendto(
960                 mSocket, buf, bufSz, 0,
961                 reinterpret_cast<const sockaddr *>(&mMasterElectionEP),
962                 sizeof(mMasterElectionEP));
963         if (sendBytes < 0)
964             ALOGE("WhoIsMaster sendto failed (errno %d)", errno);
965         ret = true;
966     }
967 
968     if (mState == ICommonClock::STATE_INITIAL) {
969         mCurTimeout.setTimeout(kInitial_WhoIsMasterTimeoutMs);
970     } else {
971         mCurTimeout.setTimeout(kRonin_WhoIsMasterTimeoutMs);
972     }
973 
974     return ret;
975 }
976 
sendSyncRequest()977 bool CommonTimeServer::sendSyncRequest() {
978     // If we are sending sync requests, then we must be in the client state and
979     // we must have a socket (when we have no network, we are only supposed to
980     // be in INITIAL or MASTER)
981     assert(mState == ICommonClock::STATE_CLIENT);
982     assert(mSocket >= 0);
983 
984     bool ret = false;
985     SyncRequestPacket pkt;
986     pkt.initHeader(mTimelineID, mSyncGroupID);
987     pkt.clientTxLocalTime = mLocalClock.getLocalTime();
988 
989     if (!mClient_FirstSyncTX)
990         mClient_FirstSyncTX = pkt.clientTxLocalTime;
991 
992     mClient_PacketRTTLog.logTX(pkt.clientTxLocalTime);
993 
994     uint8_t buf[256];
995     ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
996     if (bufSz >= 0) {
997         ssize_t sendBytes = sendto(
998                 mSocket, buf, bufSz, 0,
999                 reinterpret_cast<const sockaddr *>(&mMasterEP),
1000                 sizeof(mMasterEP));
1001         if (sendBytes < 0)
1002             ALOGE("SyncRequest sendto failed (errno %d)", errno);
1003         ret = true;
1004     }
1005 
1006     mClient_SyncsSentToCurMaster++;
1007     mCurTimeout.setTimeout(mSyncRequestIntervalMs);
1008     mClient_SyncRequestPending = true;
1009 
1010     return ret;
1011 }
1012 
sendMasterAnnouncement()1013 bool CommonTimeServer::sendMasterAnnouncement() {
1014     bool ret = false;
1015     assert(mState == ICommonClock::STATE_MASTER);
1016 
1017     // If we are being asked to send a master announcement, but we have no
1018     // socket, we must be in network-less master mode.  Don't bother to send the
1019     // announcement, and don't bother to schedule a timeout.  When the network
1020     // comes up, the work thread will get poked and start the process of
1021     // figuring out who the current master should be.
1022     if (mSocket < 0) {
1023         mCurTimeout.setTimeout(kInfiniteTimeout);
1024         return true;
1025     }
1026 
1027     MasterAnnouncementPacket pkt;
1028     pkt.initHeader(mTimelineID, mSyncGroupID);
1029     pkt.deviceID = mDeviceID;
1030     pkt.devicePriority = effectivePriority();
1031 
1032     uint8_t buf[256];
1033     ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
1034     if (bufSz >= 0) {
1035         ssize_t sendBytes = sendto(
1036                 mSocket, buf, bufSz, 0,
1037                 reinterpret_cast<const sockaddr *>(&mMasterElectionEP),
1038                 sizeof(mMasterElectionEP));
1039         if (sendBytes < 0)
1040             ALOGE("MasterAnnouncement sendto failed (errno %d)", errno);
1041         ret = true;
1042     }
1043 
1044     mCurTimeout.setTimeout(mMasterAnnounceIntervalMs);
1045     return ret;
1046 }
1047 
becomeClient(const sockaddr_storage & masterEP,uint64_t masterDeviceID,uint8_t masterDevicePriority,uint64_t timelineID,const char * cause)1048 bool CommonTimeServer::becomeClient(const sockaddr_storage& masterEP,
1049                                     uint64_t masterDeviceID,
1050                                     uint8_t  masterDevicePriority,
1051                                     uint64_t timelineID,
1052                                     const char* cause) {
1053     char newEPStr[64], oldEPStr[64];
1054     sockaddrToString(masterEP, true, newEPStr, sizeof(newEPStr));
1055     sockaddrToString(mMasterEP, mMasterEPValid, oldEPStr, sizeof(oldEPStr));
1056 
1057     ALOGI("%s --> CLIENT (%s) :%s"
1058          " OldMaster: %02x-%014llx::%016llx::%s"
1059          " NewMaster: %02x-%014llx::%016llx::%s",
1060          stateToString(mState), cause,
1061          (mTimelineID != timelineID) ? " (new timeline)" : "",
1062          mClient_MasterDevicePriority, mClient_MasterDeviceID,
1063          mTimelineID, oldEPStr,
1064          masterDevicePriority, masterDeviceID,
1065          timelineID, newEPStr);
1066 
1067     if (mTimelineID != timelineID) {
1068         // start following a new timeline
1069         mTimelineID = timelineID;
1070         mClockRecovery.reset(true, true);
1071         notifyClockSyncLoss();
1072     } else {
1073         // start following a new master on the existing timeline
1074         mClockRecovery.reset(false, true);
1075     }
1076 
1077     mMasterEP = masterEP;
1078     mMasterEPValid = true;
1079 
1080     // If we are on a real network as a client of a real master, then we should
1081     // no longer force low priority.  If our master disappears, we should have
1082     // the high priority bit set during the election to replace the master
1083     // because this group was a real group and not a singleton created in
1084     // networkless mode.
1085     setForceLowPriority(false);
1086 
1087     mClient_MasterDeviceID = masterDeviceID;
1088     mClient_MasterDevicePriority = masterDevicePriority;
1089     resetSyncStats();
1090 
1091     setState(ICommonClock::STATE_CLIENT);
1092 
1093     // add some jitter to when the various clients send their requests
1094     // in order to reduce the likelihood that a group of clients overload
1095     // the master after receiving a master announcement
1096     usleep((lrand48() % 100) * 1000);
1097 
1098     return sendSyncRequest();
1099 }
1100 
becomeMaster(const char * cause)1101 bool CommonTimeServer::becomeMaster(const char* cause) {
1102     uint64_t oldTimelineID = mTimelineID;
1103     if (mTimelineID == ICommonClock::kInvalidTimelineID) {
1104         // this device has not been following any existing timeline,
1105         // so it will create a new timeline and declare itself master
1106         assert(!mCommonClock.isValid());
1107 
1108         // set the common time basis
1109         mCommonClock.setBasis(mLocalClock.getLocalTime(), 0);
1110 
1111         // assign an arbitrary timeline iD
1112         assignTimelineID();
1113 
1114         // notify listeners that we've created a common timeline
1115         notifyClockSync();
1116     }
1117 
1118     ALOGI("%s --> MASTER (%s) : %s timeline %016llx",
1119          stateToString(mState), cause,
1120          (oldTimelineID == mTimelineID) ? "taking ownership of"
1121                                         : "creating new",
1122          mTimelineID);
1123 
1124     memset(&mMasterEP, 0, sizeof(mMasterEP));
1125     mMasterEPValid = false;
1126     mClient_MasterDevicePriority = effectivePriority();
1127     mClient_MasterDeviceID = mDeviceID;
1128     mClockRecovery.reset(false, true);
1129     resetSyncStats();
1130 
1131     setState(ICommonClock::STATE_MASTER);
1132     return sendMasterAnnouncement();
1133 }
1134 
becomeRonin(const char * cause)1135 bool CommonTimeServer::becomeRonin(const char* cause) {
1136     // If we were the client of a given timeline, but had never received even a
1137     // single time sync packet, then we transition back to Initial instead of
1138     // Ronin.  If we transition to Ronin and end up becoming the new Master, we
1139     // will be unable to service requests for other clients because we never
1140     // actually knew what time it was.  By going to initial, we ensure that
1141     // other clients who know what time it is, but would lose master arbitration
1142     // in the Ronin case, will step up and become the proper new master of the
1143     // old timeline.
1144 
1145     char oldEPStr[64];
1146     sockaddrToString(mMasterEP, mMasterEPValid, oldEPStr, sizeof(oldEPStr));
1147     memset(&mMasterEP, 0, sizeof(mMasterEP));
1148     mMasterEPValid = false;
1149 
1150     if (mCommonClock.isValid()) {
1151         ALOGI("%s --> RONIN (%s) : lost track of previously valid timeline "
1152              "%02x-%014llx::%016llx::%s (%d TXed %d RXed %d RXExpired)",
1153              stateToString(mState), cause,
1154              mClient_MasterDevicePriority, mClient_MasterDeviceID,
1155              mTimelineID, oldEPStr,
1156              mClient_SyncsSentToCurMaster,
1157              mClient_SyncRespsRXedFromCurMaster,
1158              mClient_ExpiredSyncRespsRXedFromCurMaster);
1159 
1160         mRonin_WhoIsMasterRequestTimeouts = 0;
1161         setState(ICommonClock::STATE_RONIN);
1162         return sendWhoIsMasterRequest();
1163     } else {
1164         ALOGI("%s --> INITIAL (%s) : never synced timeline "
1165              "%02x-%014llx::%016llx::%s (%d TXed %d RXed %d RXExpired)",
1166              stateToString(mState), cause,
1167              mClient_MasterDevicePriority, mClient_MasterDeviceID,
1168              mTimelineID, oldEPStr,
1169              mClient_SyncsSentToCurMaster,
1170              mClient_SyncRespsRXedFromCurMaster,
1171              mClient_ExpiredSyncRespsRXedFromCurMaster);
1172 
1173         return becomeInitial("ronin, no timeline");
1174     }
1175 }
1176 
becomeWaitForElection(const char * cause)1177 bool CommonTimeServer::becomeWaitForElection(const char* cause) {
1178     ALOGI("%s --> WAIT_FOR_ELECTION (%s) : dropping out of election,"
1179          " waiting %d mSec for completion.",
1180          stateToString(mState), cause, kWaitForElection_TimeoutMs);
1181 
1182     setState(ICommonClock::STATE_WAIT_FOR_ELECTION);
1183     mCurTimeout.setTimeout(kWaitForElection_TimeoutMs);
1184     return true;
1185 }
1186 
becomeInitial(const char * cause)1187 bool CommonTimeServer::becomeInitial(const char* cause) {
1188     ALOGI("Entering INITIAL (%s), total reset.", cause);
1189 
1190     setState(ICommonClock::STATE_INITIAL);
1191 
1192     // reset clock recovery
1193     mClockRecovery.reset(true, true);
1194 
1195     // reset internal state bookkeeping.
1196     mCurTimeout.setTimeout(kInfiniteTimeout);
1197     memset(&mMasterEP, 0, sizeof(mMasterEP));
1198     mMasterEPValid = false;
1199     mLastPacketRxLocalTime = 0;
1200     mTimelineID = ICommonClock::kInvalidTimelineID;
1201     mClockSynced = false;
1202     mInitial_WhoIsMasterRequestTimeouts = 0;
1203     mClient_MasterDeviceID = 0;
1204     mClient_MasterDevicePriority = 0;
1205     mRonin_WhoIsMasterRequestTimeouts = 0;
1206     resetSyncStats();
1207 
1208     // send the first request to discover the master
1209     return sendWhoIsMasterRequest();
1210 }
1211 
notifyClockSync()1212 void CommonTimeServer::notifyClockSync() {
1213     if (!mClockSynced) {
1214         mClockSynced = true;
1215         mICommonClock->notifyOnTimelineChanged(mTimelineID);
1216     }
1217 }
1218 
notifyClockSyncLoss()1219 void CommonTimeServer::notifyClockSyncLoss() {
1220     if (mClockSynced) {
1221         mClockSynced = false;
1222         mICommonClock->notifyOnTimelineChanged(
1223                 ICommonClock::kInvalidTimelineID);
1224     }
1225 }
1226 
setState(ICommonClock::State s)1227 void CommonTimeServer::setState(ICommonClock::State s) {
1228     mState = s;
1229 }
1230 
stateToString(ICommonClock::State s)1231 const char* CommonTimeServer::stateToString(ICommonClock::State s) {
1232     switch(s) {
1233         case ICommonClock::STATE_INITIAL:
1234             return "INITIAL";
1235         case ICommonClock::STATE_CLIENT:
1236             return "CLIENT";
1237         case ICommonClock::STATE_MASTER:
1238             return "MASTER";
1239         case ICommonClock::STATE_RONIN:
1240             return "RONIN";
1241         case ICommonClock::STATE_WAIT_FOR_ELECTION:
1242             return "WAIT_FOR_ELECTION";
1243         default:
1244             return "unknown";
1245     }
1246 }
1247 
sockaddrToString(const sockaddr_storage & addr,bool addrValid,char * buf,size_t bufLen)1248 void CommonTimeServer::sockaddrToString(const sockaddr_storage& addr,
1249                                         bool addrValid,
1250                                         char* buf, size_t bufLen) {
1251     if (!bufLen || !buf)
1252         return;
1253 
1254     if (addrValid) {
1255         switch (addr.ss_family) {
1256             case AF_INET: {
1257                 const struct sockaddr_in* sa =
1258                     reinterpret_cast<const struct sockaddr_in*>(&addr);
1259                 unsigned long a = ntohl(sa->sin_addr.s_addr);
1260                 uint16_t      p = ntohs(sa->sin_port);
1261                 snprintf(buf, bufLen, "%lu.%lu.%lu.%lu:%hu",
1262                         ((a >> 24) & 0xFF), ((a >> 16) & 0xFF),
1263                         ((a >>  8) & 0xFF),  (a        & 0xFF), p);
1264             } break;
1265 
1266             case AF_INET6: {
1267                 const struct sockaddr_in6* sa =
1268                     reinterpret_cast<const struct sockaddr_in6*>(&addr);
1269                 const uint8_t* a = sa->sin6_addr.s6_addr;
1270                 uint16_t       p = ntohs(sa->sin6_port);
1271                 snprintf(buf, bufLen,
1272                         "%02X%02X:%02X%02X:%02X%02X:%02X%02X:"
1273                         "%02X%02X:%02X%02X:%02X%02X:%02X%02X port %hd",
1274                         a[0], a[1], a[ 2], a[ 3], a[ 4], a[ 5], a[ 6], a[ 7],
1275                         a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15],
1276                         p);
1277             } break;
1278 
1279             default:
1280                 snprintf(buf, bufLen,
1281                          "<unknown sockaddr family %d>", addr.ss_family);
1282                 break;
1283         }
1284     } else {
1285         snprintf(buf, bufLen, "<none>");
1286     }
1287 
1288     buf[bufLen - 1] = 0;
1289 }
1290 
sockaddrMatch(const sockaddr_storage & a1,const sockaddr_storage & a2,bool matchAddressOnly)1291 bool CommonTimeServer::sockaddrMatch(const sockaddr_storage& a1,
1292                                      const sockaddr_storage& a2,
1293                                      bool matchAddressOnly) {
1294     if (a1.ss_family != a2.ss_family)
1295         return false;
1296 
1297     switch (a1.ss_family) {
1298         case AF_INET: {
1299             const struct sockaddr_in* sa1 =
1300                 reinterpret_cast<const struct sockaddr_in*>(&a1);
1301             const struct sockaddr_in* sa2 =
1302                 reinterpret_cast<const struct sockaddr_in*>(&a2);
1303 
1304             if (sa1->sin_addr.s_addr != sa2->sin_addr.s_addr)
1305                 return false;
1306 
1307             return (matchAddressOnly || (sa1->sin_port == sa2->sin_port));
1308         } break;
1309 
1310         case AF_INET6: {
1311             const struct sockaddr_in6* sa1 =
1312                 reinterpret_cast<const struct sockaddr_in6*>(&a1);
1313             const struct sockaddr_in6* sa2 =
1314                 reinterpret_cast<const struct sockaddr_in6*>(&a2);
1315 
1316             if (memcmp(&sa1->sin6_addr, &sa2->sin6_addr, sizeof(sa2->sin6_addr)))
1317                 return false;
1318 
1319             return (matchAddressOnly || (sa1->sin6_port == sa2->sin6_port));
1320         } break;
1321 
1322         // Huh?  We don't deal in non-IPv[46] addresses.  Not sure how we got
1323         // here, but we don't know how to comapre these addresses and simply
1324         // default to a no-match decision.
1325         default: return false;
1326     }
1327 }
1328 
setTimeout(int msec)1329 void CommonTimeServer::TimeoutHelper::setTimeout(int msec) {
1330     mTimeoutValid = (msec >= 0);
1331     if (mTimeoutValid)
1332         mEndTime = systemTime() +
1333                    (static_cast<nsecs_t>(msec) * 1000000);
1334 }
1335 
msecTillTimeout()1336 int CommonTimeServer::TimeoutHelper::msecTillTimeout() {
1337     if (!mTimeoutValid)
1338         return kInfiniteTimeout;
1339 
1340     nsecs_t now = systemTime();
1341     if (now >= mEndTime)
1342         return 0;
1343 
1344     uint64_t deltaMsec = (((mEndTime - now) + 999999) / 1000000);
1345 
1346     if (deltaMsec > static_cast<uint64_t>(MAX_INT))
1347         return MAX_INT;
1348 
1349     return static_cast<int>(deltaMsec);
1350 }
1351 
shouldPanicNotGettingGoodData()1352 bool CommonTimeServer::shouldPanicNotGettingGoodData() {
1353     if (mClient_FirstSyncTX) {
1354         int64_t now = mLocalClock.getLocalTime();
1355         int64_t delta = now - (mClient_LastGoodSyncRX
1356                              ? mClient_LastGoodSyncRX
1357                              : mClient_FirstSyncTX);
1358         int64_t deltaUsec = mCommonClock.localDurationToCommonDuration(delta);
1359 
1360         if (deltaUsec >= kNoGoodDataPanicThresholdUsec)
1361             return true;
1362     }
1363 
1364     return false;
1365 }
1366 
logTX(int64_t txTime)1367 void CommonTimeServer::PacketRTTLog::logTX(int64_t txTime) {
1368     txTimes[wrPtr] = txTime;
1369     rxTimes[wrPtr] = 0;
1370     wrPtr = (wrPtr + 1) % RTT_LOG_SIZE;
1371     if (!wrPtr)
1372         logFull = true;
1373 }
1374 
logRX(int64_t txTime,int64_t rxTime)1375 void CommonTimeServer::PacketRTTLog::logRX(int64_t txTime, int64_t rxTime) {
1376     if (!logFull && !wrPtr)
1377         return;
1378 
1379     uint32_t i = logFull ? wrPtr : 0;
1380     do {
1381         if (txTimes[i] == txTime) {
1382             rxTimes[i] = rxTime;
1383             break;
1384         }
1385         i = (i + 1) % RTT_LOG_SIZE;
1386     } while (i != wrPtr);
1387 }
1388 
1389 }  // namespace android
1390