1 /*
2 * Copyright (c) 2020-2022 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "message_router.h"
10 #ifdef USERSPACE_CLIENT_SUPPORT
11 #include <signal.h>
12 #include <unistd.h>
13 #endif
14 #include "hdf_base.h"
15 #include "hdf_log.h"
16 #include "message_dispatcher.h"
17 #include "message_router_inner.h"
18 #include "osal_mutex.h"
19 #include "securec.h"
20
21 #ifdef USERSPACE_CLIENT_SUPPORT
22 #define HDF_LOG_TAG UMsgEngine
23 #else
24 #define HDF_LOG_TAG KMsgEngine
25 #endif
26
27 #ifndef UINT8_MAX
28 #define UINT8_MAX 255
29 #endif
30
31 #if MESSAGE_ENGINE_MAX_DISPATCHER > UINT8_MAX
32 #error Max MESSAGE_ENGINE_MAX_DISPATCHER is UINT8_MAX
33 #endif
34
35 IMPLEMENT_SHARED_OBJ(MessageNode);
36 IMPLEMENT_SHARED_OBJ(RemoteService);
37
38 typedef struct {
39 uint8_t nodeIndex;
40 DispatcherId dispatcherId;
41 RemoteService *remoteService;
42 } ServiceInfo;
43
44 #define MAX_NODE_COUNT 2
45
46 OSAL_DECLARE_MUTEX(g_routerMutex) = {
47 .realMutex = NULL
48 };
49
50 static ServiceInfo g_servicesIndex[MESSAGE_ENGINE_MAX_SERVICE] = {0};
51
52 static MessageNode *g_messageNodes[MAX_NODE_COUNT] = { 0, 0};
53
54 MessageDispatcher *g_dispatchers[MESSAGE_ENGINE_MAX_DISPATCHER] = {0};
55
56 static uint8_t g_routerStatus = ME_STATUS_STOPPED;
57
ReleaseRemoteService(RemoteService * service)58 static void ReleaseRemoteService(RemoteService *service)
59 {
60 if (service == NULL) {
61 HDF_LOGE("%s: Input param is null!", __func__);
62 return;
63 }
64 if (service->Shutdown != NULL) {
65 service->Shutdown(service);
66 }
67 if (service->Disref != NULL) {
68 service->Disref(service);
69 }
70 HDF_LOGD("%s:ReleaseRemoteService finished!", __func__);
71 }
72
RefDispatcherInner(const DispatcherId dispatcherId,bool requireLock)73 static MessageDispatcher *RefDispatcherInner(const DispatcherId dispatcherId, bool requireLock)
74 {
75 MessageDispatcher *result = NULL;
76 if (dispatcherId >= MESSAGE_ENGINE_MAX_DISPATCHER) {
77 HDF_LOGE("%s:Input ID is too big.input=%u", __func__, dispatcherId);
78 return NULL;
79 }
80
81 if (requireLock) {
82 HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER);
83 if (status != HDF_SUCCESS) {
84 HDF_LOGE("Unable to get lock!status=%d", status);
85 return NULL;
86 }
87 }
88
89 do {
90 if (g_dispatchers[dispatcherId] == NULL) {
91 break;
92 }
93
94 if (g_dispatchers[dispatcherId]->Ref == NULL) {
95 break;
96 }
97 result = g_dispatchers[dispatcherId]->Ref(g_dispatchers[dispatcherId]);
98 } while (false);
99
100 if (requireLock) {
101 HDF_STATUS status = OsalMutexUnlock(&g_routerMutex);
102 if (status != HDF_SUCCESS) {
103 HDF_LOGE("Unable to unlock!status=%d", status);
104 }
105 }
106 return result;
107 }
108
RegDispatcher(DispatcherId dispatcherId,MessageDispatcher * dispatcher)109 static ErrorCode RegDispatcher(DispatcherId dispatcherId, MessageDispatcher *dispatcher)
110 {
111 HDF_STATUS status;
112 ErrorCode errCode;
113 if (dispatcherId >= MESSAGE_ENGINE_MAX_DISPATCHER) {
114 HDF_LOGE("%s:dispatcher id is too big!id=%u", __func__, dispatcherId);
115 return ME_ERROR_PARA_WRONG;
116 }
117
118 status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER);
119 if (status != HDF_SUCCESS) {
120 HDF_LOGE("Unable to get lock!status=%d", status);
121 return ME_ERROR_OPER_MUTEX_FAILED;
122 }
123 errCode = ME_SUCCESS;
124 do {
125 if (g_routerStatus != ME_STATUS_RUNNING) {
126 HDF_LOGE("%s: Unexpected g_routerStatus!", __func__);
127 errCode = ME_ERROR_WRONG_STATUS;
128 break;
129 }
130 if (g_dispatchers[dispatcherId] != NULL) {
131 HDF_LOGE("%s:DispatcherId conflict!ID=%u", __func__, dispatcherId);
132 errCode = ME_ERROR_DISPATCHERID_CONFLICT;
133 } else {
134 g_dispatchers[dispatcherId] = dispatcher;
135 }
136 } while (false);
137
138 status = OsalMutexUnlock(&g_routerMutex);
139 if (status != HDF_SUCCESS) {
140 HDF_LOGE("Unable to unlock!status=%d", status);
141 }
142 HDF_LOGD("%s: RegDispatcher finished! errCode = %d", __func__, errCode);
143 return errCode;
144 }
145
AddDispatcher(DispatcherConfig * config)146 ErrorCode AddDispatcher(DispatcherConfig *config)
147 {
148 ErrorCode errCode;
149 MessageDispatcher *dispatcher = NULL;
150 if (config == NULL) {
151 HDF_LOGE("%s: Input param is null!", __func__);
152 return ME_ERROR_NULL_PTR;
153 }
154 errCode = CreateLocalDispatcher(&dispatcher, config);
155 if (errCode != ME_SUCCESS) {
156 HDF_LOGE("%s: Create local dispatcher failed! errCode=%d", __func__, errCode);
157 return errCode;
158 }
159 if (dispatcher == NULL) {
160 HDF_LOGE("%s:CreateDispatcher return NULL!", __func__);
161 return ME_ERROR_NULL_PTR;
162 }
163 do {
164 if (dispatcher->Start != NULL) {
165 errCode = dispatcher->Start(dispatcher);
166 if (errCode != ME_SUCCESS) {
167 HDF_LOGE("%s:Start dispatcher %u failed!errCode=%d", __func__, config->dispatcherId, errCode);
168 break;
169 }
170 }
171 errCode = RegDispatcher(config->dispatcherId, dispatcher);
172 } while (false);
173
174 if (errCode != ME_SUCCESS && dispatcher->Shutdown != NULL) {
175 dispatcher->Shutdown(dispatcher);
176 }
177 if (errCode != ME_SUCCESS && dispatcher->Disref != NULL) {
178 dispatcher->Disref(dispatcher);
179 }
180 HDF_LOGD("%s: AddDispatcher finished! errCode = %d", __func__, errCode);
181 return errCode;
182 }
183
NotifyAllNodesServiceDel(const NodeId nodeId,ServiceId serviceId)184 static void NotifyAllNodesServiceDel(const NodeId nodeId, ServiceId serviceId)
185 {
186 uint8_t i;
187 for (i = 0; i < MAX_NODE_COUNT; i++) {
188 if (i == nodeId) {
189 continue;
190 }
191 if (g_messageNodes[i] != NULL && g_messageNodes[i]->NotifyServiceDel != NULL) {
192 ErrorCode subErrCode = g_messageNodes[i]->NotifyServiceDel(g_messageNodes[i], serviceId);
193 if (subErrCode != ME_SUCCESS) {
194 HDF_LOGE("%s:Rollback service add to node failed!nodeId=%hhu,serviceId=%d,errCode=%d", __func__, i,
195 serviceId, subErrCode);
196 }
197 }
198 }
199 }
200
NotifyAllNodesServiceAdd(const NodeId nodeId,struct ServiceDef * mapper)201 static ErrorCode NotifyAllNodesServiceAdd(const NodeId nodeId, struct ServiceDef *mapper)
202 {
203 uint8_t i;
204 uint8_t notifyNodeIndex;
205 ErrorCode errCode;
206 if (mapper == NULL) {
207 return ME_ERROR_NULL_PTR;
208 }
209
210 errCode = ME_SUCCESS;
211 for (notifyNodeIndex = 0; notifyNodeIndex < MAX_NODE_COUNT; notifyNodeIndex++) {
212 if (notifyNodeIndex == nodeId) {
213 continue;
214 }
215 if (g_messageNodes[notifyNodeIndex] != NULL && g_messageNodes[notifyNodeIndex]->NotifyServiceAdd != NULL) {
216 errCode = g_messageNodes[notifyNodeIndex]->NotifyServiceAdd(g_messageNodes[notifyNodeIndex], mapper);
217 if (errCode != ME_SUCCESS) {
218 HDF_LOGE("%s:Notify service add to node failed!nodeId=%d,serviceId=%d,errCode=%d", __func__,
219 notifyNodeIndex, mapper->serviceId, errCode);
220 break;
221 }
222 }
223 }
224
225 if (errCode == ME_SUCCESS) {
226 return ME_SUCCESS;
227 }
228 for (i = 0; i < MAX_NODE_COUNT && i < notifyNodeIndex; i++) {
229 if (i == nodeId) {
230 continue;
231 }
232 if (g_messageNodes[i] != NULL && g_messageNodes[i]->NotifyServiceDel != NULL) {
233 ErrorCode subErrCode = g_messageNodes[i]->NotifyServiceDel(g_messageNodes[i], mapper->serviceId);
234 if (subErrCode != ME_SUCCESS) {
235 HDF_LOGE("%s:Rollback service add to node failed!nodeId=%d,serviceId=%d,errCode=%d", __func__, i,
236 mapper->serviceId, subErrCode);
237 }
238 }
239 }
240 return errCode;
241 }
242
DoRegistService(const NodeId nodeId,const DispatcherId dispatcherId,RemoteService * remoteService)243 static ErrorCode DoRegistService(const NodeId nodeId, const DispatcherId dispatcherId, RemoteService *remoteService)
244 {
245 if (remoteService == NULL) {
246 return ME_ERROR_NULL_PTR;
247 }
248
249 if (remoteService->serviceId >= MESSAGE_ENGINE_MAX_SERVICE) {
250 return ME_ERROR_PARA_WRONG;
251 }
252
253 if (g_routerStatus != ME_STATUS_RUNNING) {
254 return ME_ERROR_WRONG_STATUS;
255 }
256
257 HDF_LOGW("%s:Register service Node:%d;Dispatcher:%u;Service:%u", __func__, nodeId, dispatcherId,
258 remoteService->serviceId);
259
260 if (g_servicesIndex[remoteService->serviceId].remoteService != NULL) {
261 HDF_LOGE("%s:Router index find conflict serviceId!", __func__);
262 return ME_ERROR_SERVICEID_CONFLICT;
263 }
264
265 g_servicesIndex[remoteService->serviceId].remoteService = remoteService;
266 g_servicesIndex[remoteService->serviceId].nodeIndex = nodeId;
267 g_servicesIndex[remoteService->serviceId].dispatcherId = dispatcherId;
268
269 return ME_SUCCESS;
270 }
271
RegistServiceInner(const NodeId nodeId,const DispatcherId dispatcherId,struct ServiceDef * mapper)272 static ErrorCode RegistServiceInner(const NodeId nodeId, const DispatcherId dispatcherId, struct ServiceDef *mapper)
273 {
274 MessageNode *node = NULL;
275 RemoteService *remoteService = NULL;
276 MessageDispatcher *dispatcher = NULL;
277 ErrorCode errCode = ME_ERROR_NOT_SUPPORTED;
278 if (mapper == NULL || mapper->serviceId >= MESSAGE_ENGINE_MAX_SERVICE) {
279 return ME_ERROR_NULL_PTR;
280 }
281
282 if (OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER) != HDF_SUCCESS) {
283 HDF_LOGE("Unable to get lock!");
284 return ME_ERROR_OPER_MUTEX_FAILED;
285 }
286
287 node = RefMessageNode(nodeId, false);
288 if (node == NULL) {
289 OsalMutexUnlock(&g_routerMutex);
290 return ME_ERROR_NO_SUCH_NODE;
291 }
292 do {
293 if (node->CreateRemoteService == NULL) {
294 HDF_LOGE("%s:Can not reg service to node %d", __func__, nodeId);
295 break;
296 }
297 dispatcher = RefDispatcherInner(dispatcherId, false);
298
299 remoteService = node->CreateRemoteService(node, dispatcher, mapper);
300 if (remoteService == NULL) {
301 HDF_LOGE("%s:Node create service failed!node=%d", __func__, nodeId);
302 break;
303 }
304
305 errCode = NotifyAllNodesServiceAdd(nodeId, mapper);
306 if (errCode != ME_SUCCESS) {
307 HDF_LOGE("%s:NotifyAllNodesServiceAdd failed!err=%d", __func__, errCode);
308 break;
309 }
310
311 errCode = DoRegistService(nodeId, dispatcherId, remoteService);
312 if (errCode != ME_SUCCESS) {
313 HDF_LOGE("%s:DoRegistService failed!err=%d.", __func__, errCode);
314 NotifyAllNodesServiceDel(nodeId, mapper->serviceId);
315 break;
316 }
317 } while (false);
318
319 OsalMutexUnlock(&g_routerMutex);
320 if (dispatcher != NULL && dispatcher->Disref != NULL) {
321 dispatcher->Disref(dispatcher);
322 }
323 if (node != NULL && node->Disref != NULL) {
324 node->Disref(node);
325 }
326
327 if (errCode != ME_SUCCESS) {
328 ReleaseRemoteService(remoteService);
329 }
330
331 return errCode;
332 }
333
RegistLocalService(const DispatcherId dispatcherId,struct ServiceDef * mapper)334 ErrorCode RegistLocalService(const DispatcherId dispatcherId, struct ServiceDef *mapper)
335 {
336 return RegistServiceInner(LOCAL_NODE_INDEX, dispatcherId, mapper);
337 }
338
RegistRemoteService(NodeId nodeId,RemoteService * service)339 ErrorCode RegistRemoteService(NodeId nodeId, RemoteService *service)
340 {
341 HDF_STATUS status;
342 ErrorCode errCode;
343 if (service == NULL) {
344 return ME_ERROR_NULL_PTR;
345 }
346 if (service->serviceId >= MESSAGE_ENGINE_MAX_SERVICE) {
347 HDF_LOGE("%s:serviceId exceed max value! ServiceId=%d", __func__, service->serviceId);
348 return ME_ERROR_PARA_WRONG;
349 }
350 if (nodeId >= MAX_NODE_COUNT) {
351 HDF_LOGE("%s:NodeId exceed max value! NodeId=%d", __func__, nodeId);
352 return ME_ERROR_PARA_WRONG;
353 }
354 status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER);
355 if (status != HDF_SUCCESS) {
356 HDF_LOGE("Unable to get lock!status=%d", status);
357 return ME_ERROR_OPER_MUTEX_FAILED;
358 }
359
360 errCode = DoRegistService(nodeId, BAD_DISPATCHER_ID, service);
361 if (errCode != ME_SUCCESS) {
362 HDF_LOGE("%s:RegService failed! errCode=%d", __func__, errCode);
363 }
364
365 status = OsalMutexUnlock(&g_routerMutex);
366 if (status != HDF_SUCCESS) {
367 HDF_LOGE("Unable to unlock!status=%d", status);
368 }
369 return errCode;
370 }
UnregistServiceInner(const NodeId nodeId,const DispatcherId dispatcherId,const ServiceId serviceId)371 static ErrorCode UnregistServiceInner(const NodeId nodeId, const DispatcherId dispatcherId, const ServiceId serviceId)
372 {
373 RemoteService *service = NULL;
374 HDF_STATUS status;
375 ErrorCode errCode;
376 if (serviceId >= MESSAGE_ENGINE_MAX_SERVICE) {
377 return ME_ERROR_PARA_WRONG;
378 }
379
380 status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER);
381 if (status != HDF_SUCCESS) {
382 HDF_LOGE("Unable to get lock!status=%d", status);
383 return ME_ERROR_OPER_MUTEX_FAILED;
384 }
385 errCode = ME_SUCCESS;
386 do {
387 if (g_servicesIndex[serviceId].nodeIndex != nodeId || g_servicesIndex[serviceId].dispatcherId != dispatcherId) {
388 errCode = ME_ERROR_NO_SUCH_SERVICE;
389 break;
390 }
391 if (g_servicesIndex[serviceId].remoteService == NULL) {
392 errCode = ME_ERROR_NO_SUCH_SERVICE;
393 break;
394 }
395 service = g_servicesIndex[serviceId].remoteService;
396 ReleaseRemoteService(service);
397 g_servicesIndex[serviceId].remoteService = NULL;
398 g_servicesIndex[serviceId].nodeIndex = NO_SUCH_NODE_INDEX;
399 g_servicesIndex[serviceId].dispatcherId = BAD_DISPATCHER_ID;
400 NotifyAllNodesServiceDel(nodeId, serviceId);
401 } while (false);
402 status = OsalMutexUnlock(&g_routerMutex);
403 if (status != HDF_SUCCESS) {
404 HDF_LOGE("Unable to unlock!status=%d", status);
405 }
406 return errCode;
407 }
408
UnregistLocalService(const DispatcherId dispatcherId,ServiceId serviceId)409 ErrorCode UnregistLocalService(const DispatcherId dispatcherId, ServiceId serviceId)
410 {
411 return UnregistServiceInner(LOCAL_NODE_INDEX, dispatcherId, serviceId);
412 }
413
UnregistRemoteService(NodeId nodeId,ServiceId serviceId)414 ErrorCode UnregistRemoteService(NodeId nodeId, ServiceId serviceId)
415 {
416 (void)nodeId;
417 return UnregistServiceInner(REMOTE_NODE_INDEX, BAD_DISPATCHER_ID, serviceId);
418 }
CheckServiceID(ServiceId serviceId,bool allowSync)419 static bool CheckServiceID(ServiceId serviceId, bool allowSync)
420 {
421 if (serviceId >= MESSAGE_ENGINE_MAX_SERVICE) {
422 HDF_LOGE("receiverId exceed MaxServiceID.Route failed!");
423 return false;
424 }
425 (void)allowSync;
426
427 if (g_servicesIndex[serviceId].remoteService != NULL) {
428 return true;
429 }
430 #ifdef USERSPACE_CLIENT_SUPPORT
431 if (!allowSync) {
432 return false;
433 }
434 for (uint8_t i = 0; i < MAX_NODE_COUNT; i++) {
435 if (g_messageNodes[i] != NULL && g_messageNodes[i]->SyncService != NULL) {
436 (void)g_messageNodes[i]->SyncService(g_messageNodes[i]);
437 }
438 }
439 return CheckServiceID(serviceId, false);
440 #else
441 return false;
442 #endif
443 }
444
RefRemoteService(ServiceId serviceId)445 RemoteService *RefRemoteService(ServiceId serviceId)
446 {
447 HDF_STATUS status;
448 RemoteService *remoteService = NULL;
449 RemoteService *service = NULL;
450 if (serviceId >= MESSAGE_ENGINE_MAX_SERVICE) {
451 return NULL;
452 }
453
454 if (!CheckServiceID(serviceId, true)) {
455 return NULL;
456 }
457 status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER);
458 if (status != HDF_SUCCESS) {
459 HDF_LOGE("Unable to get lock!status=%d", status);
460 return NULL;
461 }
462
463 do {
464 remoteService = g_servicesIndex[serviceId].remoteService;
465 if (remoteService != NULL && remoteService->Ref != NULL) {
466 service = remoteService->Ref(remoteService);
467 }
468 } while (false);
469
470 status = OsalMutexUnlock(&g_routerMutex);
471 if (status != HDF_SUCCESS) {
472 HDF_LOGE("Unable to get lock!status=%d", status);
473 }
474 return service;
475 }
476
SendMessage(MessageContext * context)477 ErrorCode SendMessage(MessageContext *context)
478 {
479 RemoteService *service = NULL;
480 ErrorCode errCode;
481 service = RefRemoteService(context->receiverId);
482 if (service == NULL) {
483 return ME_ERROR_NO_SUCH_SERVICE;
484 }
485 do {
486 if (service->SendMessage == NULL) {
487 errCode = ME_ERROR_NOT_SUPPORTED;
488 break;
489 }
490 errCode = service->SendMessage(service, context);
491 } while (false);
492
493 if (service->Disref != NULL) {
494 service->Disref(service);
495 }
496 return errCode;
497 }
498
499 #if defined(KERNEL_SERVER_SUPPORT) || defined(USERSPACE_CLIENT_SUPPORT)
500 #error("define both KERNEL_SERVER_SUPPORT and USERSPACE_CLIENT_SUPPORT is not allowed!")
501 #endif
502
503 #if defined(KERNEL_SERVER_SUPPORT) || defined(USERSPACE_CLIENT_SUPPORT)
CreateRemoteMessageNode(uint8_t nodesConfig)504 static ErrorCode CreateRemoteMessageNode(uint8_t nodesConfig)
505 {
506 ErrorCode errCode = ME_SUCCESS;
507 (void)nodesConfig;
508
509 #ifdef KERNEL_SERVER_SUPPORT
510 if ((nodesConfig & MESSAGE_NODE_REMOTE_KERNEL_SERVER) != 0) {
511 HDF_LOGI("Creating kernel server node...");
512 errCode = CreateKernelServerNode(&g_messageNodes[REMOTE_NODE_INDEX]);
513 }
514 #endif
515
516 #ifdef USERSPACE_CLIENT_SUPPORT
517 if ((nodesConfig & MESSAGE_NODE_REMOTE_USERSPACE_CLIENT) != 0) {
518 HDF_LOGI("Creating UserspaceClient server node...");
519 errCode = CreateUserspaceClientNode(&g_messageNodes[REMOTE_NODE_INDEX]);
520 }
521 #endif
522 return errCode;
523 }
524 #endif
525
InitNodes(void)526 static ErrorCode InitNodes(void)
527 {
528 ErrorCode errCode = ME_SUCCESS;
529 uint8_t i;
530 for (i = 0; i < MAX_NODE_COUNT; i++) {
531 MessageNode *node = g_messageNodes[i];
532 if (node != NULL) {
533 if (node->Init != NULL) {
534 errCode = node->Init(node);
535 }
536 if (errCode != ME_SUCCESS) {
537 HDF_LOGE("%s: init node failed!id=%d,ret=%d", __func__, i, errCode);
538 return errCode;
539 }
540 }
541 }
542 HDF_LOGI("%s: InitNodes successful!", __func__);
543 return ME_SUCCESS;
544 }
545
ReleaseNodes(void)546 static void ReleaseNodes(void)
547 {
548 uint8_t i;
549 for (i = 0; i < MAX_NODE_COUNT; i++) {
550 MessageNode *node = g_messageNodes[i];
551 if (node == NULL) {
552 continue;
553 }
554 if (node->Disref != NULL) {
555 node->Disref(node);
556 }
557 g_messageNodes[i] = NULL;
558 }
559 HDF_LOGD("%s: ReleaseNodes finished!", __func__);
560 }
561
DoStartMessageRouter(uint8_t nodesConfig)562 static ErrorCode DoStartMessageRouter(uint8_t nodesConfig)
563 {
564 uint8_t i;
565 ErrorCode errCode = ME_SUCCESS;
566 if (g_routerStatus != ME_STATUS_STOPPED) {
567 HDF_LOGE("Router have already started!");
568 return ME_ERROR_MUTI_INIT_NOT_ALLOWED;
569 }
570
571 for (i = 0; i < MESSAGE_ENGINE_MAX_SERVICE; i++) {
572 g_servicesIndex[i].remoteService = NULL;
573 g_servicesIndex[i].nodeIndex = NO_SUCH_NODE_INDEX;
574 g_servicesIndex[i].dispatcherId = BAD_DISPATCHER_ID;
575 }
576 do {
577 HDF_LOGD("%s:Create local node ...", __func__);
578 errCode = CreateLocalNode(&g_messageNodes[LOCAL_NODE_INDEX]);
579 if (errCode != ME_SUCCESS) {
580 HDF_LOGE("%s:Create local node failed!ret=%d", __func__, errCode);
581 break;
582 }
583 #if defined(KERNEL_SERVER_SUPPORT) || defined(USERSPACE_CLIENT_SUPPORT)
584 HDF_LOGI("%s:Create remote node ...", __func__);
585 errCode = CreateRemoteMessageNode(nodesConfig);
586 if (errCode != ME_SUCCESS) {
587 HDF_LOGE("%s:Create remote node failed!ret=%d", __func__, errCode);
588 break;
589 }
590 #else
591 (void)nodesConfig;
592 #endif
593 errCode = InitNodes();
594 } while (false);
595
596 if (errCode == ME_SUCCESS) {
597 g_routerStatus = ME_STATUS_RUNNING;
598 return ME_SUCCESS;
599 }
600
601 ReleaseNodes();
602 HDF_LOGD("%s: DoStartMessageRouter successful!", __func__);
603 return ME_SUCCESS;
604 }
605
EnableDefaultDispatcher(void)606 ErrorCode EnableDefaultDispatcher(void)
607 {
608 ErrorCode errCode;
609 DispatcherConfig config = {
610 .dispatcherId = DEFAULT_DISPATCHER_ID,
611 .queueSize = DEFAULT_DISPATCHER_QUEUE_SIZE,
612 .priorityLevelCount = DEFAULT_DISPATCHER_PRIORITY_COUNT
613 };
614 HDF_LOGI("Register default dispatcher...");
615 errCode = AddDispatcher(&config);
616 if (errCode != ME_SUCCESS) {
617 HDF_LOGE("Register default dispatcher failed!ret=%d", errCode);
618 }
619 return errCode;
620 }
621
StartMessageRouter(uint8_t nodesConfig)622 ErrorCode StartMessageRouter(uint8_t nodesConfig)
623 {
624 HDF_STATUS status;
625 ErrorCode errCode;
626 if (g_routerMutex.realMutex == NULL) {
627 status = OsalMutexInit(&g_routerMutex);
628 if (status != HDF_SUCCESS) {
629 HDF_LOGE("%s: Init mutex failed! status=%d", __func__, status);
630 return ME_ERROR_OPER_MUTEX_FAILED;
631 }
632 }
633 status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER);
634 if (status != HDF_SUCCESS) {
635 HDF_LOGE("%s: Unable to get lock!status=%d", __func__, status);
636 return ME_ERROR_OPER_MUTEX_FAILED;
637 }
638 errCode = DoStartMessageRouter(nodesConfig);
639 status = OsalMutexUnlock(&g_routerMutex);
640 if (status != HDF_SUCCESS) {
641 HDF_LOGE("%s: Unable to get lock!status=%d", __func__, status);
642 }
643 HDF_LOGD("%s: StartMessageRouter finished! errCode=%d", __func__, errCode);
644 return errCode;
645 }
646
DoShutdownMessageRouter(void)647 static ErrorCode DoShutdownMessageRouter(void)
648 {
649 uint8_t i;
650 RemoteService *service = NULL;
651 if (g_routerStatus == ME_STATUS_STOPPED) {
652 HDF_LOGD("%s: Router Status is stoped!", __func__);
653 return ME_SUCCESS;
654 }
655
656 g_routerStatus = ME_STATUS_STOPPING;
657 for (i = 0; i < MESSAGE_ENGINE_MAX_SERVICE; i++) {
658 if (g_servicesIndex[i].remoteService == NULL) {
659 continue;
660 }
661 service = g_servicesIndex[i].remoteService;
662 g_servicesIndex[i].remoteService = NULL;
663 g_servicesIndex[i].nodeIndex = NO_SUCH_NODE_INDEX;
664 g_servicesIndex[i].dispatcherId = BAD_DISPATCHER_ID;
665
666 ReleaseRemoteService(service);
667 }
668
669 for (i = 0; i < MESSAGE_ENGINE_MAX_DISPATCHER; i++) {
670 if (g_dispatchers[i] != NULL && g_dispatchers[i]->Shutdown != NULL) {
671 g_dispatchers[i]->Shutdown(g_dispatchers[i]);
672 }
673 if (g_dispatchers[i] != NULL && g_dispatchers[i]->Disref != NULL) {
674 g_dispatchers[i]->Disref(g_dispatchers[i]);
675 }
676 g_dispatchers[i] = NULL;
677 }
678
679 ReleaseNodes();
680 g_routerStatus = ME_STATUS_STOPPED;
681 HDF_LOGD("%s: DoShutdownMessageRouter successful!", __func__);
682 return ME_SUCCESS;
683 }
684
ShutdownMessageRouter(void)685 ErrorCode ShutdownMessageRouter(void)
686 {
687 HDF_STATUS status;
688 ErrorCode errCode;
689 HDF_LOGW("%s:Shutdown router...", __func__);
690 status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER);
691 if (status != HDF_SUCCESS) {
692 HDF_LOGE("Unable to get lock!status=%d", status);
693 return ME_ERROR_OPER_MUTEX_FAILED;
694 }
695 errCode = DoShutdownMessageRouter();
696 status = OsalMutexUnlock(&g_routerMutex);
697 if (status != HDF_SUCCESS) {
698 HDF_LOGE("Unable to get lock!status=%d", status);
699 }
700 if (errCode == ME_SUCCESS) {
701 HDF_LOGW("%s:Router down.", __func__);
702 }
703 return errCode;
704 }
705
RefMessageNode(const NodeId nodeId,bool isRequireLock)706 MessageNode *RefMessageNode(const NodeId nodeId, bool isRequireLock)
707 {
708 MessageNode *node = NULL;
709 HDF_STATUS status;
710 if (nodeId >= MAX_NODE_COUNT) {
711 HDF_LOGE("Input nodeId >= MAX_NODE_COUNT");
712 return NULL;
713 }
714 if (isRequireLock) {
715 status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER);
716 if (status != HDF_SUCCESS) {
717 HDF_LOGE("%s:require lock failed!", __func__);
718 return NULL;
719 }
720 }
721
722 if (g_messageNodes[nodeId] != NULL && g_messageNodes[nodeId]->Ref != NULL) {
723 node = g_messageNodes[nodeId]->Ref(g_messageNodes[nodeId]);
724 }
725
726 if (isRequireLock) {
727 status = OsalMutexUnlock(&g_routerMutex);
728 if (status != HDF_SUCCESS) {
729 HDF_LOGE("%s:Unlock mutex failed!", __func__);
730 }
731 }
732 return node;
733 }
734