10d163575Sopenharmony_ci/* 20d163575Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 30d163575Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. 40d163575Sopenharmony_ci * 50d163575Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification, 60d163575Sopenharmony_ci * are permitted provided that the following conditions are met: 70d163575Sopenharmony_ci * 80d163575Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of 90d163575Sopenharmony_ci * conditions and the following disclaimer. 100d163575Sopenharmony_ci * 110d163575Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list 120d163575Sopenharmony_ci * of conditions and the following disclaimer in the documentation and/or other materials 130d163575Sopenharmony_ci * provided with the distribution. 140d163575Sopenharmony_ci * 150d163575Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used 160d163575Sopenharmony_ci * to endorse or promote products derived from this software without specific prior written 170d163575Sopenharmony_ci * permission. 180d163575Sopenharmony_ci * 190d163575Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 200d163575Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 210d163575Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 220d163575Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 230d163575Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 240d163575Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 250d163575Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 260d163575Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 270d163575Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 280d163575Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 290d163575Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 300d163575Sopenharmony_ci */ 310d163575Sopenharmony_ci 320d163575Sopenharmony_ci#include "it_test_liteipc.h" 330d163575Sopenharmony_ci#include "signal.h" 340d163575Sopenharmony_ci#include "sys/wait.h" 350d163575Sopenharmony_ci 360d163575Sopenharmony_ci#include "unistd.h" 370d163575Sopenharmony_ci#include "liteipc.h" 380d163575Sopenharmony_ci#include "stdlib.h" 390d163575Sopenharmony_ci#include "stdio.h" 400d163575Sopenharmony_ci#include "string.h" 410d163575Sopenharmony_ci#include "sys/ioctl.h" 420d163575Sopenharmony_ci#include "sys/time.h" 430d163575Sopenharmony_ci 440d163575Sopenharmony_ci#include "smgr_demo.h" 450d163575Sopenharmony_ci 460d163575Sopenharmony_ciServiceName g_serviceNameMap[MAX_SREVICE_NUM]; 470d163575Sopenharmony_ciBOOL g_cmsRunningFlag = FALSE; 480d163575Sopenharmony_ci 490d163575Sopenharmony_cistatic void InitCms() 500d163575Sopenharmony_ci{ 510d163575Sopenharmony_ci (void)memset_s(g_serviceNameMap, sizeof(g_serviceNameMap), 0, sizeof(g_serviceNameMap)); 520d163575Sopenharmony_ci} 530d163575Sopenharmony_ci 540d163575Sopenharmony_ciuint32_t SetCms(int fd) 550d163575Sopenharmony_ci{ 560d163575Sopenharmony_ci return ioctl(fd, IPC_SET_CMS, 200); 570d163575Sopenharmony_ci} 580d163575Sopenharmony_ci 590d163575Sopenharmony_civoid SendReply(int fd, IpcMsg *dataIn, uint32_t result, uint32_t serviceHandle) 600d163575Sopenharmony_ci{ 610d163575Sopenharmony_ci IpcContent data1; 620d163575Sopenharmony_ci IpcMsg dataOut; 630d163575Sopenharmony_ci unsigned int ret; 640d163575Sopenharmony_ci uint32_t ptr[2]; 650d163575Sopenharmony_ci 660d163575Sopenharmony_ci data1.flag = SEND | BUFF_FREE; 670d163575Sopenharmony_ci data1.buffToFree = dataIn; 680d163575Sopenharmony_ci data1.outMsg = &dataOut; 690d163575Sopenharmony_ci (void)memset_s(data1.outMsg, sizeof(IpcMsg), 0, sizeof(IpcMsg)); 700d163575Sopenharmony_ci data1.outMsg->type = MT_REPLY; 710d163575Sopenharmony_ci data1.outMsg->target.handle = dataIn->taskID; 720d163575Sopenharmony_ci data1.outMsg->target.token = dataIn->target.token; 730d163575Sopenharmony_ci data1.outMsg->code = dataIn->code; 740d163575Sopenharmony_ci#if (USE_TIMESTAMP == 1) 750d163575Sopenharmony_ci data1.outMsg->timestamp = dataIn->timestamp; 760d163575Sopenharmony_ci#endif 770d163575Sopenharmony_ci ptr[0] = result; 780d163575Sopenharmony_ci ptr[1] = serviceHandle; 790d163575Sopenharmony_ci data1.outMsg->dataSz = 8; 800d163575Sopenharmony_ci data1.outMsg->data = ptr; 810d163575Sopenharmony_ci ret = ioctl(fd, IPC_SEND_RECV_MSG, &data1); 820d163575Sopenharmony_ci if (ret) { 830d163575Sopenharmony_ci printf("SendReply failed\n"); 840d163575Sopenharmony_ci } 850d163575Sopenharmony_ci} 860d163575Sopenharmony_ci 870d163575Sopenharmony_civoid FreeBuffer(int fd, IpcMsg *dataIn) 880d163575Sopenharmony_ci{ 890d163575Sopenharmony_ci IpcContent data1; 900d163575Sopenharmony_ci unsigned int ret; 910d163575Sopenharmony_ci data1.flag = BUFF_FREE; 920d163575Sopenharmony_ci data1.buffToFree = dataIn; 930d163575Sopenharmony_ci ret = ioctl(fd, IPC_SEND_RECV_MSG, &data1); 940d163575Sopenharmony_ci if (ret) { 950d163575Sopenharmony_ci printf("FreeBuffer failed\n"); 960d163575Sopenharmony_ci } 970d163575Sopenharmony_ci} 980d163575Sopenharmony_ci 990d163575Sopenharmony_cistatic uint32_t SendCmsCmd(int fd, CmsCmdContent *content) 1000d163575Sopenharmony_ci{ 1010d163575Sopenharmony_ci unsigned int ret; 1020d163575Sopenharmony_ci ret = ioctl(fd, IPC_CMS_CMD, content); 1030d163575Sopenharmony_ci if (ret) { 1040d163575Sopenharmony_ci printf("SendCmsCmd failed\n"); 1050d163575Sopenharmony_ci } 1060d163575Sopenharmony_ci return ret; 1070d163575Sopenharmony_ci} 1080d163575Sopenharmony_ci 1090d163575Sopenharmony_ciuint32_t RegService(int fd, char *serviceName, uint32_t nameLen, uint32_t *serviceHandle) 1100d163575Sopenharmony_ci{ 1110d163575Sopenharmony_ci IpcContent data1; 1120d163575Sopenharmony_ci IpcMsg dataIn; 1130d163575Sopenharmony_ci IpcMsg dataOut; 1140d163575Sopenharmony_ci uint32_t ret; 1150d163575Sopenharmony_ci uint32_t *ptr = nullptr; 1160d163575Sopenharmony_ci ServiceName name; 1170d163575Sopenharmony_ci 1180d163575Sopenharmony_ci if (nameLen > NAME_LEN_MAX) { 1190d163575Sopenharmony_ci return -1; 1200d163575Sopenharmony_ci } 1210d163575Sopenharmony_ci (void)memcpy_s(name.serviceName, nameLen, serviceName, nameLen); 1220d163575Sopenharmony_ci name.nameLen = nameLen; 1230d163575Sopenharmony_ci 1240d163575Sopenharmony_ci data1.flag = SEND | RECV; 1250d163575Sopenharmony_ci data1.outMsg = &dataOut; 1260d163575Sopenharmony_ci (void)memset_s(data1.outMsg, sizeof(IpcMsg), 0, sizeof(IpcMsg)); 1270d163575Sopenharmony_ci data1.outMsg->type = MT_REQUEST; 1280d163575Sopenharmony_ci data1.outMsg->target.handle = 0; 1290d163575Sopenharmony_ci data1.outMsg->code = REG_CODE; 1300d163575Sopenharmony_ci data1.outMsg->dataSz = sizeof(ServiceName); 1310d163575Sopenharmony_ci data1.outMsg->data = &name; 1320d163575Sopenharmony_ci 1330d163575Sopenharmony_ci ret = ioctl(fd, IPC_SEND_RECV_MSG, &data1); 1340d163575Sopenharmony_ci if (ret != 0) { 1350d163575Sopenharmony_ci printf("RegService failed\n"); 1360d163575Sopenharmony_ci return ret; 1370d163575Sopenharmony_ci } 1380d163575Sopenharmony_ci ptr = (uint32_t*)(data1.inMsg->data); 1390d163575Sopenharmony_ci *serviceHandle = ptr[1]; 1400d163575Sopenharmony_ci FreeBuffer(fd, data1.inMsg); 1410d163575Sopenharmony_ci return ptr[0]; 1420d163575Sopenharmony_ci} 1430d163575Sopenharmony_ci 1440d163575Sopenharmony_ciuint32_t GetService(int fd, char *serviceName, uint32_t nameLen, uint32_t *serviceHandle) 1450d163575Sopenharmony_ci{ 1460d163575Sopenharmony_ci IpcContent data1; 1470d163575Sopenharmony_ci IpcMsg dataIn; 1480d163575Sopenharmony_ci IpcMsg dataOut; 1490d163575Sopenharmony_ci uint32_t ret; 1500d163575Sopenharmony_ci uint32_t *ptr = nullptr; 1510d163575Sopenharmony_ci ServiceName name; 1520d163575Sopenharmony_ci 1530d163575Sopenharmony_ci if (nameLen > NAME_LEN_MAX) { 1540d163575Sopenharmony_ci return -1; 1550d163575Sopenharmony_ci } 1560d163575Sopenharmony_ci (void)memcpy_s(name.serviceName, nameLen, serviceName, nameLen); 1570d163575Sopenharmony_ci name.nameLen = nameLen; 1580d163575Sopenharmony_ci 1590d163575Sopenharmony_ci data1.flag = SEND | RECV; 1600d163575Sopenharmony_ci data1.outMsg = &dataOut; 1610d163575Sopenharmony_ci (void)memset_s(data1.outMsg, sizeof(IpcMsg), 0, sizeof(IpcMsg)); 1620d163575Sopenharmony_ci data1.outMsg->type = MT_REQUEST; 1630d163575Sopenharmony_ci data1.outMsg->target.handle = 0; 1640d163575Sopenharmony_ci data1.outMsg->code = GET_CODE; 1650d163575Sopenharmony_ci data1.outMsg->dataSz = sizeof(ServiceName); 1660d163575Sopenharmony_ci data1.outMsg->data = &name; 1670d163575Sopenharmony_ci 1680d163575Sopenharmony_ci ret = ioctl(fd, IPC_SEND_RECV_MSG, &data1); 1690d163575Sopenharmony_ci if (ret != 0) { 1700d163575Sopenharmony_ci return ret; 1710d163575Sopenharmony_ci } 1720d163575Sopenharmony_ci ptr = (uint32_t*)(data1.inMsg->data); 1730d163575Sopenharmony_ci *serviceHandle = ptr[1]; 1740d163575Sopenharmony_ci FreeBuffer(fd, data1.inMsg); 1750d163575Sopenharmony_ci return ptr[0]; 1760d163575Sopenharmony_ci} 1770d163575Sopenharmony_ci 1780d163575Sopenharmony_cistatic void HandleServiceRegAndGet(int fd, IpcMsg *data) 1790d163575Sopenharmony_ci{ 1800d163575Sopenharmony_ci uint32_t ret, i; 1810d163575Sopenharmony_ci 1820d163575Sopenharmony_ci if (data->code == STOP_CODE) { 1830d163575Sopenharmony_ci g_cmsRunningFlag = FALSE; 1840d163575Sopenharmony_ci return; 1850d163575Sopenharmony_ci } 1860d163575Sopenharmony_ci 1870d163575Sopenharmony_ci ServiceName *info = (ServiceName*)(data->data); 1880d163575Sopenharmony_ci CmsCmdContent content; 1890d163575Sopenharmony_ci if ((info->nameLen == 0) || (info->serviceName == NULL)) { 1900d163575Sopenharmony_ci goto ERROR_EXIT; 1910d163575Sopenharmony_ci } 1920d163575Sopenharmony_ci for (i = 0; i < MAX_SREVICE_NUM; i++) { 1930d163575Sopenharmony_ci if (g_serviceNameMap[i].serviceName != NULL && g_serviceNameMap[i].nameLen == info->nameLen) { 1940d163575Sopenharmony_ci if(memcmp(g_serviceNameMap[i].serviceName, info->serviceName, info->nameLen) == 0) { 1950d163575Sopenharmony_ci break; 1960d163575Sopenharmony_ci } 1970d163575Sopenharmony_ci } 1980d163575Sopenharmony_ci } 1990d163575Sopenharmony_ci printf("receive service request, code:%d, service name:%s\n", data->code, info->serviceName); 2000d163575Sopenharmony_ci switch (data->code) { 2010d163575Sopenharmony_ci case REG_CODE: 2020d163575Sopenharmony_ci if (i == MAX_SREVICE_NUM) { 2030d163575Sopenharmony_ci content.cmd = CMS_GEN_HANDLE; 2040d163575Sopenharmony_ci content.taskID = data->taskID; 2050d163575Sopenharmony_ci ret = SendCmsCmd(fd, &content); 2060d163575Sopenharmony_ci if (ret) { 2070d163575Sopenharmony_ci goto ERROR_EXIT; 2080d163575Sopenharmony_ci } 2090d163575Sopenharmony_ci if (g_serviceNameMap[content.serviceHandle].serviceName != NULL && g_serviceNameMap[content.serviceHandle].nameLen == info->nameLen) { 2100d163575Sopenharmony_ci printf("the task has already a service named:%s\n", g_serviceNameMap[content.serviceHandle].serviceName); 2110d163575Sopenharmony_ci goto ERROR_REG; 2120d163575Sopenharmony_ci } else { 2130d163575Sopenharmony_ci (void)memcpy_s(g_serviceNameMap[content.serviceHandle].serviceName, info->nameLen, 2140d163575Sopenharmony_ci info->serviceName, info->nameLen); 2150d163575Sopenharmony_ci g_serviceNameMap[content.serviceHandle].nameLen = info->nameLen; 2160d163575Sopenharmony_ci SendReply(fd, data, 0, content.serviceHandle); 2170d163575Sopenharmony_ci } 2180d163575Sopenharmony_ci }else { 2190d163575Sopenharmony_ci printf("this service already registered\n"); 2200d163575Sopenharmony_ci goto ERROR_EXIT; 2210d163575Sopenharmony_ci } 2220d163575Sopenharmony_ci break; 2230d163575Sopenharmony_ci case GET_CODE: 2240d163575Sopenharmony_ci if (i == MAX_SREVICE_NUM) { 2250d163575Sopenharmony_ci goto ERROR_EXIT; 2260d163575Sopenharmony_ci }else { 2270d163575Sopenharmony_ci content.cmd = CMS_ADD_ACCESS; 2280d163575Sopenharmony_ci content.taskID = data->taskID; 2290d163575Sopenharmony_ci content.serviceHandle = i; 2300d163575Sopenharmony_ci SendCmsCmd(fd, &content); 2310d163575Sopenharmony_ci SendReply(fd, data, 0, i); 2320d163575Sopenharmony_ci } 2330d163575Sopenharmony_ci break; 2340d163575Sopenharmony_ci default: 2350d163575Sopenharmony_ci break; 2360d163575Sopenharmony_ci } 2370d163575Sopenharmony_ci return; 2380d163575Sopenharmony_ciERROR_REG: 2390d163575Sopenharmony_ci content.cmd = CMS_REMOVE_HANDLE; 2400d163575Sopenharmony_ci SendCmsCmd(fd, &content); 2410d163575Sopenharmony_ciERROR_EXIT: 2420d163575Sopenharmony_ci SendReply(fd, data, -1, 0); 2430d163575Sopenharmony_ci} 2440d163575Sopenharmony_ci 2450d163575Sopenharmony_cistatic uint32_t CmsLoop(int fd) 2460d163575Sopenharmony_ci{ 2470d163575Sopenharmony_ci IpcContent data1; 2480d163575Sopenharmony_ci IpcMsg dataIn; 2490d163575Sopenharmony_ci IpcMsg dataOut; 2500d163575Sopenharmony_ci uint32_t ret; 2510d163575Sopenharmony_ci g_cmsRunningFlag = TRUE; 2520d163575Sopenharmony_ci while (g_cmsRunningFlag == TRUE) { 2530d163575Sopenharmony_ci data1.flag = RECV; 2540d163575Sopenharmony_ci ret = ioctl(fd, IPC_SEND_RECV_MSG, &data1); 2550d163575Sopenharmony_ci if (ret != 0) { 2560d163575Sopenharmony_ci printf("bad request!\n"); 2570d163575Sopenharmony_ci continue; 2580d163575Sopenharmony_ci } 2590d163575Sopenharmony_ci switch (data1.inMsg->type) { 2600d163575Sopenharmony_ci case MT_REQUEST: 2610d163575Sopenharmony_ci HandleServiceRegAndGet(fd, data1.inMsg); 2620d163575Sopenharmony_ci break; 2630d163575Sopenharmony_ci default: 2640d163575Sopenharmony_ci printf("request not support:%d!\n", data1.inMsg->type); 2650d163575Sopenharmony_ci FreeBuffer(fd, data1.inMsg); 2660d163575Sopenharmony_ci break; 2670d163575Sopenharmony_ci } 2680d163575Sopenharmony_ci } 2690d163575Sopenharmony_ci} 2700d163575Sopenharmony_ci 2710d163575Sopenharmony_civoid StartCms(int fd) 2720d163575Sopenharmony_ci{ 2730d163575Sopenharmony_ci InitCms(); 2740d163575Sopenharmony_ci CmsLoop(fd); 2750d163575Sopenharmony_ci} 2760d163575Sopenharmony_ci 2770d163575Sopenharmony_civoid StopCms(int fd) 2780d163575Sopenharmony_ci{ 2790d163575Sopenharmony_ci IpcContent data1; 2800d163575Sopenharmony_ci IpcMsg dataOut; 2810d163575Sopenharmony_ci int ret; 2820d163575Sopenharmony_ci 2830d163575Sopenharmony_ci data1.flag = SEND; 2840d163575Sopenharmony_ci data1.outMsg = &dataOut; 2850d163575Sopenharmony_ci (void)memset_s(data1.outMsg, sizeof(IpcMsg), 0, sizeof(IpcMsg)); 2860d163575Sopenharmony_ci data1.outMsg->type = MT_REQUEST; 2870d163575Sopenharmony_ci data1.outMsg->target.handle = 0; 2880d163575Sopenharmony_ci data1.outMsg->code = STOP_CODE; 2890d163575Sopenharmony_ci data1.outMsg->dataSz = 0; 2900d163575Sopenharmony_ci data1.outMsg->data = 0; 2910d163575Sopenharmony_ci 2920d163575Sopenharmony_ci ret = ioctl(fd, IPC_SEND_RECV_MSG, &data1); 2930d163575Sopenharmony_ci if (ret != 0) { 2940d163575Sopenharmony_ci printf("StopCms failed ioctl ret:%d!\n", ret); 2950d163575Sopenharmony_ci } 2960d163575Sopenharmony_ci} 2970d163575Sopenharmony_ci 298