* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "dslm_rpc_process.h"
#include <stdbool.h>
#include <stddef.h>
#include <unistd.h>
#include "utils_log.h"
#include "device_security_defines.h"
#include "dslm_core_process.h"
#include "dslm_hievent.h"
#include "dslm_hitrace.h"
#include "dslm_messenger_wrapper.h"
#include "dslm_msg_serialize.h"
#ifdef L0_MINI
#include "dslm_ohos_credential.h"
#endif
#define SLEEP_TIME (1000 * 500)
#define TRY_TIMES 20
int32_t OnPeerMsgReceived(const DeviceIdentify *devId, const uint8_t *msg, uint32_t len)
{
if (devId == NULL || msg == NULL || len == 0) {
SECURITY_LOG_ERROR("invalid params, len = %{public}u", len);
return ERR_INVALID_PARA;
}
const MessageBuff buff = {.buff = (uint8_t *)msg, .length = len};
int32_t ret = SUCCESS;
MessagePacket *packet = ParseMessage(&buff);
if (packet == NULL) {
SECURITY_LOG_ERROR("packet is null");
return ERR_INVALID_PARA;
}
if (packet->payload == NULL) {
FreeMessagePacket(packet);
SECURITY_LOG_ERROR("packet->payload is null");
return ERR_INVALID_PARA;
}
switch (packet->type) {
case MSG_TYPE_DSLM_CRED_REQUEST:
ret = OnPeerMsgRequestInfoReceived(devId, packet->payload, packet->length);
break;
case MSG_TYPE_DSLM_CRED_RESPONSE:
ret = OnPeerMsgResponseInfoReceived(devId, packet->payload, packet->length);
break;
default:
ret = ERR_INVALID_PARA;
break;
}
if (ret != SUCCESS) {
SECURITY_LOG_ERROR("ret = %{public}d, packet->type = %{public}u", ret, packet->type);
}
FreeMessagePacket(packet);
return ret;
}
int32_t OnSendResultNotifier(const DeviceIdentify *devId, uint64_t transNo, uint32_t result)
{
return OnMsgSendResultNotifier(devId, transNo, result);
}
uint32_t InitService(void)
{
uint32_t times = 0;
SECURITY_LOG_INFO("InitService");
#ifdef L0_MINI
DslmStartProcessTrace("InitService");
DslmCredFunctionsConstructor();
InitDeviceManager();
#endif
uint32_t ret = InitMessenger(OnPeerMsgReceived, OnPeerStatusReceiver, OnSendResultNotifier);
if (ret != SUCCESS) {
DslmFinishProcessTrace();
ReportHiEventServiceStartFailed(ret);
SECURITY_LOG_ERROR("InitMessenger ret = %{public}u", ret);
return ret;
}
SECURITY_LOG_INFO("InitService InitMessenger success");
while (true) {
DslmCountTrace("InitDslmProcess", times);
if (InitDslmProcess()) {
break;
}
usleep(SLEEP_TIME);
if (times > TRY_TIMES) {
SECURITY_LOG_ERROR("wait SoftBus timeout");
break;
}
times++;
}
DslmFinishProcessTrace();
return SUCCESS;
}
void UnInitService(void)
{
DeinitDslmProcess();
DeinitMessenger();
}