lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | /******************************************************************************* |
| 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.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 21 | #include <assert.h> |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 22 | #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.li | df7f8ba | 2024-09-12 23:53:34 -0700 | [diff] [blame] | 34 | #include "soft_timer.h" |
| 35 | #include "zxicbasic_api.h" |
| 36 | #include "pub_debug_info.h" |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 37 | |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 38 | #ifdef __cplusplus |
| 39 | extern "C" |
| 40 | { |
| 41 | #endif |
| 42 | |
| 43 | /******************************************************************************* |
| 44 | * ³£Á¿¶¨Òå * |
| 45 | *******************************************************************************/ |
| 46 | |
| 47 | /******************************************************************************* |
| 48 | * ºê¶¨Òå * |
| 49 | *******************************************************************************/ |
| 50 | #define RPC_RPMSG_DEV "/dev/rpmsg8" |
xf.li | df7f8ba | 2024-09-12 23:53:34 -0700 | [diff] [blame] | 51 | #define NVSERVER_LOG_START_TIME (120) /* 2 minutes */ |
| 52 | #define MODULE_ID_AP_SERVER "ap_nvserver" |
| 53 | #define NVSERVER_LOG_TIMER_ID (0x1984) |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 54 | |
| 55 | /******************************************************************************* |
| 56 | * Êý¾ÝÀàÐͶ¨Òå * |
| 57 | *******************************************************************************/ |
| 58 | |
| 59 | /******************************************************************************* |
| 60 | * ¾Ö²¿º¯ÊýÉùÃ÷ * |
| 61 | *******************************************************************************/ |
| 62 | |
| 63 | /******************************************************************************* |
| 64 | * ¾Ö²¿¾²Ì¬±äÁ¿¶¨Òå * |
| 65 | *******************************************************************************/ |
| 66 | |
| 67 | /******************************************************************************* |
| 68 | * È«¾Ö±äÁ¿¶¨Òå * |
| 69 | *******************************************************************************/ |
| 70 | static int g_rpc_fd = -1; |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 71 | static unsigned int g_msgRcvCnt = 0; |
| 72 | static unsigned int g_msgRcvErrCnt = 0; |
| 73 | static unsigned int g_msgSndCnt = 0; |
| 74 | static unsigned int g_msgSndErrCnt = 0; |
xf.li | df7f8ba | 2024-09-12 23:53:34 -0700 | [diff] [blame] | 75 | static int g_debug_info_flag = 0; /* not log debug info */ |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 76 | |
| 77 | /******************************************************************************* |
| 78 | * ¾Ö²¿º¯ÊýʵÏÖ * |
| 79 | *******************************************************************************/ |
| 80 | /******************************************************************************* |
| 81 | * ¹¦ÄÜÃèÊö: analyMsg |
| 82 | * ²ÎÊý˵Ã÷: |
| 83 | * (´«Èë²ÎÊý) msgrecv:½ÓÊÕÏûÏ¢ |
| 84 | * (´«³ö²ÎÊý) msgsnd:·¢ËÍÏûÏ¢ |
| 85 | * ·µ »Ø Öµ: 0±íʾ³É¹¦ |
| 86 | * ÆäËü˵Ã÷: void |
| 87 | *******************************************************************************/ |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 88 | static void analyMsg(T_NV_MSG_INFO *msgrecv, T_NV_MSG_RESULT *msgsnd, T_sc_rpc_msg *rpc_data, T_sc_rpc_msg *rpc_data2) |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 89 | { |
xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 90 | unsigned int timeout = 10; |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 91 | int send_once_flag = 0; |
| 92 | int ret; |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 93 | |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 94 | 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 | } |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 110 | |
xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 111 | do |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 112 | { |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 113 | if (send_once_flag == 0) |
xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 114 | { |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 115 | 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.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 124 | } |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 125 | |
| 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.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 135 | assert(0); |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 136 | |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 137 | memcpy(msgsnd, rpc_data2->data, rpc_data2->header.data_len); |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 138 | } |
| 139 | |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 140 | static int nv_rpc_wait_ready(int fd) |
| 141 | { |
| 142 | T_sc_rpc_header *rpc_data; |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 143 | unsigned int timeout = 100; // ms |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 144 | |
| 145 | rpc_data = malloc(sizeof(T_sc_rpc_header)); |
| 146 | if (rpc_data == NULL) |
| 147 | return -1; |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 148 | |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 149 | while(1) |
| 150 | { |
| 151 | rpc_data->msg_type = RPC_MSG_TYPE_READY; |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 152 | if (write(fd, rpc_data, sizeof(T_sc_rpc_header)) == sizeof(T_sc_rpc_header)) |
| 153 | break; |
| 154 | else |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 155 | usleep(timeout * 1000); |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 156 | } |
| 157 | |
| 158 | free(rpc_data); |
| 159 | return 0; |
| 160 | } |
| 161 | |
xf.li | df7f8ba | 2024-09-12 23:53:34 -0700 | [diff] [blame] | 162 | static 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 |
| 169 | int 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 | |
| 199 | static 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 | |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 239 | /******************************************************************************* |
| 240 | * È«¾Öº¯ÊýʵÏÖ * |
| 241 | *******************************************************************************/ |
| 242 | |
| 243 | /******************************************************************************* |
| 244 | * ¹¦ÄÜÃèÊö: main |
| 245 | * ²ÎÊý˵Ã÷: |
| 246 | * (´«Èë²ÎÊý) void |
| 247 | * (´«³ö²ÎÊý) void |
| 248 | * ·µ »Ø Öµ: void |
| 249 | * ÆäËü˵Ã÷: void |
| 250 | *******************************************************************************/ |
| 251 | int 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; |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 257 | T_sc_rpc_msg *rpc_data; |
| 258 | T_sc_rpc_msg *rpc_data2; |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 259 | long pid_backup; /* app-libnvram pid backup */ |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 260 | |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 261 | prctl(PR_SET_NAME, "nvserver_rpc", 0, 0, 0); |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 262 | |
| 263 | memset(&msgInfo, 0, sizeof(msgInfo)); |
| 264 | |
xf.li | df7f8ba | 2024-09-12 23:53:34 -0700 | [diff] [blame] | 265 | 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 | |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 270 | 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 | |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 288 | rpc_data = malloc(sizeof(T_sc_rpc_msg)); |
xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 289 | if (rpc_data == NULL) |
| 290 | { |
| 291 | perror("[error]nvrpc malloc error\n"); |
| 292 | return -2; |
| 293 | } |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 294 | rpc_data2 = malloc(sizeof(T_sc_rpc_msg)); |
xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 295 | if (rpc_data2 == NULL) |
| 296 | { |
| 297 | perror("[error]nvrpc malloc2 error\n"); |
| 298 | free(rpc_data); |
| 299 | return -3; |
| 300 | } |
| 301 | |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 302 | if (nv_rpc_wait_ready(g_rpc_fd) < 0) |
| 303 | { |
lh | 758261d | 2023-07-13 05:52:04 -0700 | [diff] [blame] | 304 | assert(0); |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 305 | } |
| 306 | sc_rpc_clear(g_rpc_fd); |
| 307 | printf("apnv and nv-rpc-daemon are ready both."); |
| 308 | |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 309 | // ÏûÏ¢½»»¥ |
| 310 | while (1) |
| 311 | { |
| 312 | memset(&rcvBuf, 0, sizeof(rcvBuf)); |
| 313 | memset(&sndBuf, 0, sizeof(sndBuf)); |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 314 | 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 | } |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 319 | if (-1 == msgrcv(msgId, &rcvBuf, sizeof(T_NV_MSG_INFO) - sizeof(long), MSG_TYPE_NV, 0)) |
| 320 | { |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 321 | g_msgRcvErrCnt++; |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 322 | printf("nvserver error: nvserver msgrcv fail, errno = %d!\n", errno); |
| 323 | continue; |
| 324 | } |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 325 | //printf("apnv nvserver_rpc msgrcv pid:%d\n", rcvBuf.pid); |
| 326 | pid_backup = rcvBuf.pid; |
| 327 | g_msgRcvCnt++; /* msgrcv success count */ |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 328 | |
xf.li | df7f8ba | 2024-09-12 23:53:34 -0700 | [diff] [blame] | 329 | if (g_debug_info_flag && (cap_is_active() == 0)) |
| 330 | { //start log and cap is sleeping |
| 331 | log_nv_info(&rcvBuf); |
| 332 | } |
xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 333 | analyMsg(&rcvBuf, &sndBuf, rpc_data, rpc_data2); |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 334 | |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 335 | //printf("apnv nvserver_rpc msgsnd pid:%d, backup:%d\n", sndBuf.msgType, pid_backup); |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 336 | if (-1 == msgsnd(msgId, &sndBuf, sizeof(T_NV_MSG_RESULT) - sizeof(long), 0)) |
| 337 | { |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 338 | g_msgSndErrCnt++; |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 339 | printf("nvserver error: nvserver msgsnd fail, errno = %d!\n", errno); |
| 340 | continue; |
| 341 | } |
xf.li | 742dd02 | 2023-06-08 01:43:32 -0700 | [diff] [blame] | 342 | g_msgSndCnt++; /* msgsnd success count */ |
| 343 | if (sndBuf.msgType != pid_backup) |
| 344 | { |
| 345 | assert(0); |
| 346 | } |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 347 | } |
| 348 | |
xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 349 | free(rpc_data); |
| 350 | free(rpc_data2); |
lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 351 | return (0); |
| 352 | } |
| 353 | |
| 354 | #ifdef __cplusplus |
| 355 | } |
| 356 | #endif |