1 /*
2  * Copyright (C) 2011 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 #include <sys/socket.h>
18 
19 #include <common_time/ICommonTimeConfig.h>
20 #include <binder/Parcel.h>
21 
22 #include "utils.h"
23 
24 namespace android {
25 
26 /***** ICommonTimeConfig *****/
27 
28 enum {
29     GET_MASTER_ELECTION_PRIORITY = IBinder::FIRST_CALL_TRANSACTION,
30     SET_MASTER_ELECTION_PRIORITY,
31     GET_MASTER_ELECTION_ENDPOINT,
32     SET_MASTER_ELECTION_ENDPOINT,
33     GET_MASTER_ELECTION_GROUP_ID,
34     SET_MASTER_ELECTION_GROUP_ID,
35     GET_INTERFACE_BINDING,
36     SET_INTERFACE_BINDING,
37     GET_MASTER_ANNOUNCE_INTERVAL,
38     SET_MASTER_ANNOUNCE_INTERVAL,
39     GET_CLIENT_SYNC_INTERVAL,
40     SET_CLIENT_SYNC_INTERVAL,
41     GET_PANIC_THRESHOLD,
42     SET_PANIC_THRESHOLD,
43     GET_AUTO_DISABLE,
44     SET_AUTO_DISABLE,
45     FORCE_NETWORKLESS_MASTER_MODE,
46 };
47 
48 const String16 ICommonTimeConfig::kServiceName("common_time.config");
49 
50 class BpCommonTimeConfig : public BpInterface<ICommonTimeConfig>
51 {
52   public:
BpCommonTimeConfig(const sp<IBinder> & impl)53     BpCommonTimeConfig(const sp<IBinder>& impl)
54         : BpInterface<ICommonTimeConfig>(impl) {}
55 
getMasterElectionPriority(uint8_t * priority)56     virtual status_t getMasterElectionPriority(uint8_t *priority) {
57         Parcel data, reply;
58         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
59         status_t status = remote()->transact(GET_MASTER_ELECTION_PRIORITY,
60                                              data,
61                                              &reply);
62         if (status == OK) {
63             status = reply.readInt32();
64             if (status == OK) {
65                 *priority = static_cast<uint8_t>(reply.readInt32());
66             }
67         }
68 
69         return status;
70     }
71 
setMasterElectionPriority(uint8_t priority)72     virtual status_t setMasterElectionPriority(uint8_t priority) {
73         Parcel data, reply;
74         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
75         data.writeInt32(static_cast<int32_t>(priority));
76         status_t status = remote()->transact(SET_MASTER_ELECTION_PRIORITY,
77                                              data,
78                                              &reply);
79         if (status == OK) {
80             status = reply.readInt32();
81         }
82 
83         return status;
84     }
85 
getMasterElectionEndpoint(struct sockaddr_storage * addr)86     virtual status_t getMasterElectionEndpoint(struct sockaddr_storage *addr) {
87         Parcel data, reply;
88         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
89         status_t status = remote()->transact(GET_MASTER_ELECTION_ENDPOINT,
90                                              data,
91                                              &reply);
92         if (status == OK) {
93             status = reply.readInt32();
94             if (status == OK) {
95                 deserializeSockaddr(&reply, addr);
96             }
97         }
98 
99         return status;
100     }
101 
setMasterElectionEndpoint(const struct sockaddr_storage * addr)102     virtual status_t setMasterElectionEndpoint(
103             const struct sockaddr_storage *addr) {
104         Parcel data, reply;
105         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
106         if (!canSerializeSockaddr(addr))
107             return BAD_VALUE;
108         if (NULL == addr) {
109             data.writeInt32(0);
110         } else {
111             data.writeInt32(1);
112             serializeSockaddr(&data, addr);
113         }
114         status_t status = remote()->transact(SET_MASTER_ELECTION_ENDPOINT,
115                                              data,
116                                              &reply);
117         if (status == OK) {
118             status = reply.readInt32();
119         }
120 
121         return status;
122     }
123 
getMasterElectionGroupId(uint64_t * id)124     virtual status_t getMasterElectionGroupId(uint64_t *id) {
125         Parcel data, reply;
126         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
127         status_t status = remote()->transact(GET_MASTER_ELECTION_GROUP_ID,
128                                              data,
129                                              &reply);
130 
131         if (status == OK) {
132             status = reply.readInt32();
133             if (status == OK) {
134                 *id = static_cast<uint64_t>(reply.readInt64());
135             }
136         }
137 
138         return status;
139     }
140 
setMasterElectionGroupId(uint64_t id)141     virtual status_t setMasterElectionGroupId(uint64_t id) {
142         Parcel data, reply;
143         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
144         data.writeInt64(id);
145         status_t status = remote()->transact(SET_MASTER_ELECTION_GROUP_ID,
146                                              data,
147                                              &reply);
148 
149         if (status == OK) {
150             status = reply.readInt32();
151         }
152 
153         return status;
154     }
155 
getInterfaceBinding(String16 & ifaceName)156     virtual status_t getInterfaceBinding(String16& ifaceName) {
157         Parcel data, reply;
158         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
159         status_t status = remote()->transact(GET_INTERFACE_BINDING,
160                                              data,
161                                              &reply);
162         if (status == OK) {
163             status = reply.readInt32();
164             if (status == OK) {
165                 ifaceName = reply.readString16();
166             }
167         }
168 
169         return status;
170     }
171 
setInterfaceBinding(const String16 & ifaceName)172     virtual status_t setInterfaceBinding(const String16& ifaceName) {
173         Parcel data, reply;
174         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
175         data.writeString16(ifaceName);
176         status_t status = remote()->transact(SET_INTERFACE_BINDING,
177                                              data,
178                                              &reply);
179         if (status == OK) {
180             status = reply.readInt32();
181         }
182 
183         return status;
184     }
185 
getMasterAnnounceInterval(int * interval)186     virtual status_t getMasterAnnounceInterval(int *interval) {
187         Parcel data, reply;
188         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
189         status_t status = remote()->transact(GET_MASTER_ANNOUNCE_INTERVAL,
190                                              data,
191                                              &reply);
192         if (status == OK) {
193             status = reply.readInt32();
194             if (status == OK) {
195                 *interval = reply.readInt32();
196             }
197         }
198 
199         return status;
200     }
201 
setMasterAnnounceInterval(int interval)202     virtual status_t setMasterAnnounceInterval(int interval) {
203         Parcel data, reply;
204         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
205         data.writeInt32(interval);
206         status_t status = remote()->transact(SET_MASTER_ANNOUNCE_INTERVAL,
207                                              data,
208                                              &reply);
209         if (status == OK) {
210             status = reply.readInt32();
211         }
212 
213         return status;
214     }
215 
getClientSyncInterval(int * interval)216     virtual status_t getClientSyncInterval(int *interval) {
217         Parcel data, reply;
218         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
219         status_t status = remote()->transact(GET_CLIENT_SYNC_INTERVAL,
220                                              data,
221                                              &reply);
222         if (status == OK) {
223             status = reply.readInt32();
224             if (status == OK) {
225                 *interval = reply.readInt32();
226             }
227         }
228 
229         return status;
230     }
231 
setClientSyncInterval(int interval)232     virtual status_t setClientSyncInterval(int interval) {
233         Parcel data, reply;
234         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
235         data.writeInt32(interval);
236         status_t status = remote()->transact(SET_CLIENT_SYNC_INTERVAL,
237                                              data,
238                                              &reply);
239         if (status == OK) {
240             status = reply.readInt32();
241         }
242 
243         return status;
244     }
245 
getPanicThreshold(int * threshold)246     virtual status_t getPanicThreshold(int *threshold) {
247         Parcel data, reply;
248         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
249         status_t status = remote()->transact(GET_PANIC_THRESHOLD,
250                                              data,
251                                              &reply);
252         if (status == OK) {
253             status = reply.readInt32();
254             if (status == OK) {
255                 *threshold = reply.readInt32();
256             }
257         }
258 
259         return status;
260     }
261 
setPanicThreshold(int threshold)262     virtual status_t setPanicThreshold(int threshold) {
263         Parcel data, reply;
264         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
265         data.writeInt32(threshold);
266         status_t status = remote()->transact(SET_PANIC_THRESHOLD,
267                                              data,
268                                              &reply);
269         if (status == OK) {
270             status = reply.readInt32();
271         }
272 
273         return status;
274     }
275 
getAutoDisable(bool * autoDisable)276     virtual status_t getAutoDisable(bool *autoDisable) {
277         Parcel data, reply;
278         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
279         status_t status = remote()->transact(GET_AUTO_DISABLE,
280                                              data,
281                                              &reply);
282         if (status == OK) {
283             status = reply.readInt32();
284             if (status == OK) {
285                 *autoDisable = (0 != reply.readInt32());
286             }
287         }
288 
289         return status;
290     }
291 
setAutoDisable(bool autoDisable)292     virtual status_t setAutoDisable(bool autoDisable) {
293         Parcel data, reply;
294         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
295         data.writeInt32(autoDisable ? 1 : 0);
296         status_t status = remote()->transact(SET_AUTO_DISABLE,
297                                              data,
298                                              &reply);
299 
300         if (status == OK) {
301             status = reply.readInt32();
302         }
303 
304         return status;
305     }
306 
forceNetworklessMasterMode()307     virtual status_t forceNetworklessMasterMode() {
308         Parcel data, reply;
309         data.writeInterfaceToken(ICommonTimeConfig::getInterfaceDescriptor());
310         status_t status = remote()->transact(FORCE_NETWORKLESS_MASTER_MODE,
311                                              data,
312                                              &reply);
313 
314         if (status == OK) {
315             status = reply.readInt32();
316         }
317 
318         return status;
319     }
320 };
321 
322 IMPLEMENT_META_INTERFACE(CommonTimeConfig, "android.os.ICommonTimeConfig");
323 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)324 status_t BnCommonTimeConfig::onTransact(uint32_t code,
325                                    const Parcel& data,
326                                    Parcel* reply,
327                                    uint32_t flags) {
328     switch(code) {
329         case GET_MASTER_ELECTION_PRIORITY: {
330             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
331             uint8_t priority;
332             status_t status = getMasterElectionPriority(&priority);
333             reply->writeInt32(status);
334             if (status == OK) {
335                 reply->writeInt32(static_cast<int32_t>(priority));
336             }
337             return OK;
338         } break;
339 
340         case SET_MASTER_ELECTION_PRIORITY: {
341             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
342             uint8_t priority = static_cast<uint8_t>(data.readInt32());
343             status_t status = setMasterElectionPriority(priority);
344             reply->writeInt32(status);
345             return OK;
346         } break;
347 
348         case GET_MASTER_ELECTION_ENDPOINT: {
349             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
350             struct sockaddr_storage addr;
351             status_t status = getMasterElectionEndpoint(&addr);
352 
353             if ((status == OK) && !canSerializeSockaddr(&addr)) {
354                 status = UNKNOWN_ERROR;
355             }
356 
357             reply->writeInt32(status);
358 
359             if (status == OK) {
360                 serializeSockaddr(reply, &addr);
361             }
362 
363             return OK;
364         } break;
365 
366         case SET_MASTER_ELECTION_ENDPOINT: {
367             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
368             struct sockaddr_storage addr;
369             int hasAddr = data.readInt32();
370 
371             status_t status;
372             if (hasAddr) {
373                 deserializeSockaddr(&data, &addr);
374                 status = setMasterElectionEndpoint(&addr);
375             } else {
376                 status = setMasterElectionEndpoint(&addr);
377             }
378 
379             reply->writeInt32(status);
380             return OK;
381         } break;
382 
383         case GET_MASTER_ELECTION_GROUP_ID: {
384             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
385             uint64_t id;
386             status_t status = getMasterElectionGroupId(&id);
387             reply->writeInt32(status);
388             if (status == OK) {
389                 reply->writeInt64(id);
390             }
391             return OK;
392         } break;
393 
394         case SET_MASTER_ELECTION_GROUP_ID: {
395             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
396             uint64_t id = static_cast<uint64_t>(data.readInt64());
397             status_t status = setMasterElectionGroupId(id);
398             reply->writeInt32(status);
399             return OK;
400         } break;
401 
402         case GET_INTERFACE_BINDING: {
403             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
404             String16 ret;
405             status_t status = getInterfaceBinding(ret);
406             reply->writeInt32(status);
407             if (status == OK) {
408                 reply->writeString16(ret);
409             }
410             return OK;
411         } break;
412 
413         case SET_INTERFACE_BINDING: {
414             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
415             String16 ifaceName;
416             ifaceName = data.readString16();
417             status_t status = setInterfaceBinding(ifaceName);
418             reply->writeInt32(status);
419             return OK;
420         } break;
421 
422         case GET_MASTER_ANNOUNCE_INTERVAL: {
423             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
424             int interval;
425             status_t status = getMasterAnnounceInterval(&interval);
426             reply->writeInt32(status);
427             if (status == OK) {
428                 reply->writeInt32(interval);
429             }
430             return OK;
431         } break;
432 
433         case SET_MASTER_ANNOUNCE_INTERVAL: {
434             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
435             int interval = data.readInt32();
436             status_t status = setMasterAnnounceInterval(interval);
437             reply->writeInt32(status);
438             return OK;
439         } break;
440 
441         case GET_CLIENT_SYNC_INTERVAL: {
442             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
443             int interval;
444             status_t status = getClientSyncInterval(&interval);
445             reply->writeInt32(status);
446             if (status == OK) {
447                 reply->writeInt32(interval);
448             }
449             return OK;
450         } break;
451 
452         case SET_CLIENT_SYNC_INTERVAL: {
453             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
454             int interval = data.readInt32();
455             status_t status = setClientSyncInterval(interval);
456             reply->writeInt32(status);
457             return OK;
458         } break;
459 
460         case GET_PANIC_THRESHOLD: {
461             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
462             int threshold;
463             status_t status = getPanicThreshold(&threshold);
464             reply->writeInt32(status);
465             if (status == OK) {
466                 reply->writeInt32(threshold);
467             }
468             return OK;
469         } break;
470 
471         case SET_PANIC_THRESHOLD: {
472             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
473             int threshold = data.readInt32();
474             status_t status = setPanicThreshold(threshold);
475             reply->writeInt32(status);
476             return OK;
477         } break;
478 
479         case GET_AUTO_DISABLE: {
480             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
481             bool autoDisable;
482             status_t status = getAutoDisable(&autoDisable);
483             reply->writeInt32(status);
484             if (status == OK) {
485                 reply->writeInt32(autoDisable ? 1 : 0);
486             }
487             return OK;
488         } break;
489 
490         case SET_AUTO_DISABLE: {
491             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
492             bool autoDisable = (0 != data.readInt32());
493             status_t status = setAutoDisable(autoDisable);
494             reply->writeInt32(status);
495             return OK;
496         } break;
497 
498         case FORCE_NETWORKLESS_MASTER_MODE: {
499             CHECK_INTERFACE(ICommonTimeConfig, data, reply);
500             status_t status = forceNetworklessMasterMode();
501             reply->writeInt32(status);
502             return OK;
503         } break;
504     }
505     return BBinder::onTransact(code, data, reply, flags);
506 }
507 
508 }; // namespace android
509 
510