blob: d12bb0df72abf7c26a4ec662116e6f15d60d9742 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001/*******************************************************************************
2* °æÈ¨ËùÓÐ (C)2023, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
3*
4* ÎļþÃû³Æ: nvserver_rpc.c
5* Îļþ±êʶ: nvserver_rpc.c
6* ÄÚÈÝÕªÒª: nvserverת½ÓcapµÄnvserver
7*
8* ÐÞ¸ÄÈÕÆÚ °æ±¾ºÅ Ð޸ıê¼Ç ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ
9* ------------------------------------------------------------------------------
10* 2016/06/13 V1.0 Create ÁõÑÇÄÏ ´´½¨
11*
12*******************************************************************************/
13
14/*******************************************************************************
15* Í·Îļþ *
16*******************************************************************************/
17#include <unistd.h>
18#include <errno.h>
19#include <stdio.h>
20#include <stdlib.h>
xf.li742dd022023-06-08 01:43:32 -070021#include <assert.h>
lh9ed821d2023-04-07 01:36:19 -070022#include <dirent.h>
23#include <string.h>
24#include <sys/file.h>
25#include <sys/types.h>
26#include <sys/stat.h>
27#include <sys/ipc.h>
28#include <sys/msg.h>
29
30#include "nvserver.h"
31#include "nv_typedef.h"
32#include <message.h>
33#include "sc_rpc.h"
xf.lidf7f8ba2024-09-12 23:53:34 -070034#include "soft_timer.h"
35#include "zxicbasic_api.h"
36#include "pub_debug_info.h"
lh9ed821d2023-04-07 01:36:19 -070037
lh9ed821d2023-04-07 01:36:19 -070038#ifdef __cplusplus
39extern "C"
40{
41#endif
42
43/*******************************************************************************
44* ³£Á¿¶¨Òå *
45*******************************************************************************/
46
47/*******************************************************************************
48* ºê¶¨Òå *
49*******************************************************************************/
50#define RPC_RPMSG_DEV "/dev/rpmsg8"
xf.lidf7f8ba2024-09-12 23:53:34 -070051#define NVSERVER_LOG_START_TIME (120) /* 2 minutes */
52#define MODULE_ID_AP_SERVER "ap_nvserver"
53#define NVSERVER_LOG_TIMER_ID (0x1984)
lh9ed821d2023-04-07 01:36:19 -070054
55/*******************************************************************************
56* Êý¾ÝÀàÐͶ¨Òå *
57*******************************************************************************/
58
59/*******************************************************************************
60* ¾Ö²¿º¯ÊýÉùÃ÷ *
61*******************************************************************************/
62
63/*******************************************************************************
64* ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå *
65*******************************************************************************/
66
67/*******************************************************************************
68* È«¾Ö±äÁ¿¶¨Òå *
69*******************************************************************************/
70static int g_rpc_fd = -1;
xf.li742dd022023-06-08 01:43:32 -070071static unsigned int g_msgRcvCnt = 0;
72static unsigned int g_msgRcvErrCnt = 0;
73static unsigned int g_msgSndCnt = 0;
74static unsigned int g_msgSndErrCnt = 0;
xf.lidf7f8ba2024-09-12 23:53:34 -070075static int g_debug_info_flag = 0; /* not log debug info */
lh9ed821d2023-04-07 01:36:19 -070076
77/*******************************************************************************
78* ¾Ö²¿º¯ÊýʵÏÖ *
79*******************************************************************************/
80/*******************************************************************************
81* ¹¦ÄÜÃèÊö: analyMsg
82* ²ÎÊý˵Ã÷:
83* (´«Èë²ÎÊý) msgrecv:½ÓÊÕÏûÏ¢
84* (´«³ö²ÎÊý) msgsnd:·¢ËÍÏûÏ¢
85* ·µ »Ø Öµ: 0±íʾ³É¹¦
86* ÆäËü˵Ã÷: void
87*******************************************************************************/
lh758261d2023-07-13 05:52:04 -070088static void analyMsg(T_NV_MSG_INFO *msgrecv, T_NV_MSG_RESULT *msgsnd, T_sc_rpc_msg *rpc_data, T_sc_rpc_msg *rpc_data2)
lh9ed821d2023-04-07 01:36:19 -070089{
xf.libdd93d52023-05-12 07:10:14 -070090 unsigned int timeout = 10;
lh758261d2023-07-13 05:52:04 -070091 int send_once_flag = 0;
92 int ret;
lh9ed821d2023-04-07 01:36:19 -070093
lh758261d2023-07-13 05:52:04 -070094 rpc_data->header.msg_type = RPC_MSG_TYPE_REQUEST;
95 rpc_data->header.func_id = RPC_FUNC_ID_NV;
96 rpc_data->header.data_len = sizeof(T_NV_MSG_INFO) - NV_MAX_FILE_LEN - NV_MAX_KEY_LEN - NV_MAX_VAL_LEN;
97 rpc_data->header.file_len = strlen(msgrecv->file) + 1;
98 rpc_data->header.data_len += rpc_data->header.file_len;
99 memcpy(rpc_data->data, msgrecv, rpc_data->header.data_len);
100 rpc_data->header.key_len = strlen(msgrecv->key) + 1;
101 memcpy(rpc_data->data+rpc_data->header.data_len, msgrecv->key, rpc_data->header.key_len);
102 rpc_data->header.data_len += rpc_data->header.key_len;
103 rpc_data->header.value_len = strlen(msgrecv->value);
104 if (rpc_data->header.value_len > 0)
105 {
106 rpc_data->header.value_len += 1;
107 memcpy(rpc_data->data+rpc_data->header.data_len, msgrecv->value, rpc_data->header.value_len);
108 rpc_data->header.data_len += rpc_data->header.value_len;
109 }
lh9ed821d2023-04-07 01:36:19 -0700110
xf.libdd93d52023-05-12 07:10:14 -0700111 do
lh9ed821d2023-04-07 01:36:19 -0700112 {
lh758261d2023-07-13 05:52:04 -0700113 if (send_once_flag == 0)
xf.libdd93d52023-05-12 07:10:14 -0700114 {
lh758261d2023-07-13 05:52:04 -0700115 ret = sc_rpc_send(g_rpc_fd, rpc_data, 0);
116 if (ret == 0)
117 {
118 send_once_flag = 1; // send success
119 }
120 else
121 {
122 assert(0); // send fail
123 }
xf.libdd93d52023-05-12 07:10:14 -0700124 }
lh758261d2023-07-13 05:52:04 -0700125
126 ret = sc_rpc_recv(g_rpc_fd, rpc_data2, timeout);
127 if (ret == 0)
128 {
129 break; // recv success and break
130 }
131
132 } while (1); //µÈ´ýÍê³É
133
134 if (rpc_data2->header.msg_type != RPC_MSG_TYPE_REPLY)
xf.li742dd022023-06-08 01:43:32 -0700135 assert(0);
lh9ed821d2023-04-07 01:36:19 -0700136
lh758261d2023-07-13 05:52:04 -0700137 memcpy(msgsnd, rpc_data2->data, rpc_data2->header.data_len);
lh9ed821d2023-04-07 01:36:19 -0700138}
139
xf.li742dd022023-06-08 01:43:32 -0700140static int nv_rpc_wait_ready(int fd)
141{
142 T_sc_rpc_header *rpc_data;
lh758261d2023-07-13 05:52:04 -0700143 unsigned int timeout = 100; // ms
xf.li742dd022023-06-08 01:43:32 -0700144
145 rpc_data = malloc(sizeof(T_sc_rpc_header));
146 if (rpc_data == NULL)
147 return -1;
lh758261d2023-07-13 05:52:04 -0700148
xf.li742dd022023-06-08 01:43:32 -0700149 while(1)
150 {
151 rpc_data->msg_type = RPC_MSG_TYPE_READY;
lh758261d2023-07-13 05:52:04 -0700152 if (write(fd, rpc_data, sizeof(T_sc_rpc_header)) == sizeof(T_sc_rpc_header))
153 break;
154 else
xf.li742dd022023-06-08 01:43:32 -0700155 usleep(timeout * 1000);
xf.li742dd022023-06-08 01:43:32 -0700156 }
157
158 free(rpc_data);
159 return 0;
160}
161
xf.lidf7f8ba2024-09-12 23:53:34 -0700162static void log_timer_callback(void *argc)
163{
164 g_debug_info_flag = 1;
165 //logmsg("log_timer_callback\n");
166}
167
168// return -1 error; 1 active; 0 sleep
169int cap_is_active(void)
170{
171 char buf[4];
172 int ret = -1;
173
174 memset(buf, 0, sizeof(buf));
175 ret = open_read_close("/sys/zte_pm/cap_state", buf, sizeof(buf));
176 if (ret < 0)
177 return -1;
178 //logmsg("cap_is_active:%s\n", buf);
179 if (buf[0] == '1')
180 {
181 //logmsg("cap_is_active:active\n");
182 return 1;
183 }
184 else
185 {
186 if (buf[0] == '0')
187 {
188 //logmsg("cap_is_active:sleeping\n");
189 return 0;
190 }
191 else
192 {
193 //logmsg("cap_is_active:error\n");
194 return -1;
195 }
196 }
197}
198
199static void log_nv_info(T_NV_MSG_INFO *msg)
200{
201 //logmsg("log_nv_info\n");
202 switch(msg->nvType)
203 {
204 case MSG_GET:
205 //printf("[nvrpc] cfg_get key:%s\n", msg->key);
206 sc_debug_info_record(MODULE_ID_AP_SERVER, "cfg_get key:%s\n", msg->key);
207 break;
208 case MSG_SET:
209 //printf("[nvrpc] cfg_set key:%s value:%s\n", msg->key, msg->value);
210 sc_debug_info_record(MODULE_ID_AP_SERVER, "cfg_set key:%s value:%s\n", msg->key, msg->value);
211 break;
212 case MSG_UNSET:
213 //printf("[nvrpc] cfg_unset key:%s\n", msg->key);
214 sc_debug_info_record(MODULE_ID_AP_SERVER, "cfg_unset key:%s\n", msg->key);
215 break;
216 case MSG_CLEAR:
217 //printf("[nvrpc] cfg_clear\n");
218 sc_debug_info_record(MODULE_ID_AP_SERVER, "cfg_clear\n");
219 break;
220 case MSG_RESET:
221 //printf("[nvrpc] cfg_reset\n");
222 sc_debug_info_record(MODULE_ID_AP_SERVER, "cfg_reset\n");
223 break;
224 case MSG_SHOW:
225 //printf("[nvrpc] cfg_show\n");
226 sc_debug_info_record(MODULE_ID_AP_SERVER, "cfg_show\n");
227 break;
228 case MSG_COMMIT:
229 //printf("[nvrpc] cfg_save\n");
230 sc_debug_info_record(MODULE_ID_AP_SERVER, "cfg_save\n");
231 break;
232 default:
233 //printf("[nvrpc] cfg other action\n");
234 sc_debug_info_record(MODULE_ID_AP_SERVER, "error cfg other action\n");
235 break;
236 }
237}
238
lh9ed821d2023-04-07 01:36:19 -0700239/*******************************************************************************
240* È«¾Öº¯ÊýʵÏÖ *
241*******************************************************************************/
242
243/*******************************************************************************
244* ¹¦ÄÜÃèÊö: main
245* ²ÎÊý˵Ã÷:
246* (´«Èë²ÎÊý) void
247* (´«³ö²ÎÊý) void
248* ·µ »Ø Öµ: void
249* ÆäËü˵Ã÷: void
250*******************************************************************************/
251int nvserver_main(int argc, char *argv[])
252{
253 int msgId = 0;
254 T_NV_MSG_INFO rcvBuf;
255 T_NV_MSG_RESULT sndBuf;
256 struct msqid_ds msgInfo;
lh758261d2023-07-13 05:52:04 -0700257 T_sc_rpc_msg *rpc_data;
258 T_sc_rpc_msg *rpc_data2;
xf.li742dd022023-06-08 01:43:32 -0700259 long pid_backup; /* app-libnvram pid backup */
lh9ed821d2023-04-07 01:36:19 -0700260
lh758261d2023-07-13 05:52:04 -0700261 prctl(PR_SET_NAME, "nvserver_rpc", 0, 0, 0);
lh9ed821d2023-04-07 01:36:19 -0700262
263 memset(&msgInfo, 0, sizeof(msgInfo));
264
xf.lidf7f8ba2024-09-12 23:53:34 -0700265 if (0 != sc_timer_create(NVSERVER_LOG_TIMER_ID, TIMER_FLAG_ONCE, NVSERVER_LOG_START_TIME*1000, log_timer_callback, NULL))
266 {
267 abort(); // create timer error
268 }
269
lh9ed821d2023-04-07 01:36:19 -0700270 g_rpc_fd = sc_rpc_open(RPC_RPMSG_DEV);
271
272 msgId = msgget(MODULE_ID_NV, IPC_CREAT | 0600);
273 if (-1 == msgId)
274 {
275 printf("nvserver error: msgget msgId fail, errno = %d\n", errno);
276 return -1;
277 }
278
279 if (-1 != msgctl(msgId, IPC_STAT, &msgInfo))
280 {
281 msgInfo.msg_qbytes = 262144; // 256k
282 if (-1 == msgctl(msgId, IPC_SET, &msgInfo))
283 {
284 printf("nvserver error: msgctl msgId fail, errno = %d\n", errno);
285 }
286 }
287
lh758261d2023-07-13 05:52:04 -0700288 rpc_data = malloc(sizeof(T_sc_rpc_msg));
xf.libdd93d52023-05-12 07:10:14 -0700289 if (rpc_data == NULL)
290 {
291 perror("[error]nvrpc malloc error\n");
292 return -2;
293 }
lh758261d2023-07-13 05:52:04 -0700294 rpc_data2 = malloc(sizeof(T_sc_rpc_msg));
xf.libdd93d52023-05-12 07:10:14 -0700295 if (rpc_data2 == NULL)
296 {
297 perror("[error]nvrpc malloc2 error\n");
298 free(rpc_data);
299 return -3;
300 }
301
xf.li742dd022023-06-08 01:43:32 -0700302 if (nv_rpc_wait_ready(g_rpc_fd) < 0)
303 {
lh758261d2023-07-13 05:52:04 -0700304 assert(0);
xf.li742dd022023-06-08 01:43:32 -0700305 }
306 sc_rpc_clear(g_rpc_fd);
307 printf("apnv and nv-rpc-daemon are ready both.");
308
lh9ed821d2023-04-07 01:36:19 -0700309 // ÏûÏ¢½»»¥
310 while (1)
311 {
312 memset(&rcvBuf, 0, sizeof(rcvBuf));
313 memset(&sndBuf, 0, sizeof(sndBuf));
xf.li742dd022023-06-08 01:43:32 -0700314 if (g_msgRcvCnt != g_msgSndCnt)
315 {
316 printf("[nvserver_rpc]Rcv:%u Snd:%u RcvErr:%u SndErr:%u\n", g_msgRcvCnt, g_msgSndCnt, g_msgRcvErrCnt, g_msgSndErrCnt);
317 assert(0);
318 }
lh9ed821d2023-04-07 01:36:19 -0700319 if (-1 == msgrcv(msgId, &rcvBuf, sizeof(T_NV_MSG_INFO) - sizeof(long), MSG_TYPE_NV, 0))
320 {
xf.li742dd022023-06-08 01:43:32 -0700321 g_msgRcvErrCnt++;
lh9ed821d2023-04-07 01:36:19 -0700322 printf("nvserver error: nvserver msgrcv fail, errno = %d!\n", errno);
323 continue;
324 }
xf.li742dd022023-06-08 01:43:32 -0700325 //printf("apnv nvserver_rpc msgrcv pid:%d\n", rcvBuf.pid);
326 pid_backup = rcvBuf.pid;
327 g_msgRcvCnt++; /* msgrcv success count */
lh9ed821d2023-04-07 01:36:19 -0700328
xf.lidf7f8ba2024-09-12 23:53:34 -0700329 if (g_debug_info_flag && (cap_is_active() == 0))
330 { //start log and cap is sleeping
331 log_nv_info(&rcvBuf);
332 }
xf.libdd93d52023-05-12 07:10:14 -0700333 analyMsg(&rcvBuf, &sndBuf, rpc_data, rpc_data2);
lh9ed821d2023-04-07 01:36:19 -0700334
xf.li742dd022023-06-08 01:43:32 -0700335 //printf("apnv nvserver_rpc msgsnd pid:%d, backup:%d\n", sndBuf.msgType, pid_backup);
lh9ed821d2023-04-07 01:36:19 -0700336 if (-1 == msgsnd(msgId, &sndBuf, sizeof(T_NV_MSG_RESULT) - sizeof(long), 0))
337 {
xf.li742dd022023-06-08 01:43:32 -0700338 g_msgSndErrCnt++;
lh9ed821d2023-04-07 01:36:19 -0700339 printf("nvserver error: nvserver msgsnd fail, errno = %d!\n", errno);
340 continue;
341 }
xf.li742dd022023-06-08 01:43:32 -0700342 g_msgSndCnt++; /* msgsnd success count */
343 if (sndBuf.msgType != pid_backup)
344 {
345 assert(0);
346 }
lh9ed821d2023-04-07 01:36:19 -0700347 }
348
xf.libdd93d52023-05-12 07:10:14 -0700349 free(rpc_data);
350 free(rpc_data2);
lh9ed821d2023-04-07 01:36:19 -0700351 return (0);
352}
353
354#ifdef __cplusplus
355}
356#endif