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