| 92 | |
| 93 | |
| 94 | void TransceiverManager::clockHandler() |
| 95 | { |
| 96 | char buffer[MAX_UDP_LENGTH]; |
| 97 | int msgLen = mClockSocket.read(buffer,gConfig.getNum("TRX.Timeout.Clock")*1000); |
| 98 | |
| 99 | // Did the transceiver die?? |
| 100 | if (msgLen<0) { |
| 101 | LOG(EMERG) << "TRX clock interface timed out, assuming TRX is dead."; |
| 102 | gReports.incr("OpenBTS.Exit.Error.TransceiverHeartbeat"); |
| 103 | #if RN_DEVELOPER_MODE |
| 104 | // (pat) Added so you can keep debugging without the radio. |
| 105 | static int foo = 0; |
| 106 | pthread_exit(&foo); |
| 107 | #else |
| 108 | abort(); |
| 109 | #endif |
| 110 | } |
| 111 | |
| 112 | if (msgLen==0) { |
| 113 | LOG(ALERT) << "read error on TRX clock interface, return " << msgLen; |
| 114 | return; |
| 115 | } |
| 116 | |
| 117 | if (strncmp(buffer,"IND CLOCK",9)==0) { |
| 118 | uint32_t FN; |
| 119 | sscanf(buffer,"IND CLOCK %u", &FN); |
| 120 | LOG(INFO) << "CLOCK indication, current clock = " << gBTS.clock().get() << " new clock ="<<FN; |
| 121 | gBTS.clock().set(FN); |
| 122 | mHaveClock = true; |
| 123 | return; |
| 124 | } |
| 125 | |
| 126 | buffer[msgLen]='\0'; |
| 127 | LOG(ALERT) << "bogus message " << buffer << " on clock interface"; |
| 128 | } |
| 129 | |
| 130 | |
| 131 |
no test coverage detected