[Bugfix][MD310/R307/R306][bug-view-1170][fota] Pressing the reset button during FOTA upgrade leads to upgrade failure, and disabling the reset button during wefota and web upgrade
Change-Id: I1bf6ffc635c8e70af2c6de4caaa1bb28be12f57d
diff --git a/lynq/CPE_COMMON/ap/app/cgi/cgi.c b/lynq/CPE_COMMON/ap/app/cgi/cgi.c
index 5f56ca5..a7c86f3 100755
--- a/lynq/CPE_COMMON/ap/app/cgi/cgi.c
+++ b/lynq/CPE_COMMON/ap/app/cgi/cgi.c
@@ -4,6 +4,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
+#include "cfg_api.h"
#define BUFFER_SIZE (1024 * 20) // Define the buffer size for each read
#define FIND_STR_LEN 128 // Define the length of the string to find
@@ -291,10 +292,12 @@
result = fota_get_update_status(&upgradeStatus);
if(result < 0)
{
+ cfg_set("fota_update_flag", "0");
print_json_response(0, "Fail to read update file");
}
else if(upgradeStatus != 0)
{
+ cfg_set("fota_update_flag", "0");
print_json_response(0, "Verify update file failed");
}
else
@@ -331,12 +334,13 @@
print_json_response(0, "Invalid CONTENT_LENGTH");
return 1;
}
-
+ cfg_set("fota_update_flag", "1");
// Call the file upload handling function
if (handle_file_upload(source_filename, target_filename, content_length) != 0)
{
system("rm -rf /tmp/firmware_tmp_file");
print_json_response(0, "File upload failed");
+ cfg_set("fota_update_flag", "0");
return 1;
}
diff --git a/lynq/CPE_COMMON/ap/app/wefota/wefota_device.c b/lynq/CPE_COMMON/ap/app/wefota/wefota_device.c
index b294271..0736e32 100755
--- a/lynq/CPE_COMMON/ap/app/wefota/wefota_device.c
+++ b/lynq/CPE_COMMON/ap/app/wefota/wefota_device.c
@@ -76,6 +76,12 @@
return 0;
}
+int set_wefota_upgrade_flag_cfg(const char *state)
+{
+ cfg_set("fota_update_flag", state);
+
+ return 0;
+}
int get_last_work_time(int *time, int *interval)
{
if (time == NULL || interval == NULL) {
@@ -99,7 +105,7 @@
return 0;
}
-static int fota_is_file_exist(const char* path)
+int fota_is_file_exist(const char* path)
{
if ( (path == NULL) || (*path == '\0') )
return 0;
@@ -109,7 +115,7 @@
return 1;
}
-static int fota_read_file(const char*path, char*buf, size_t sz)
+int fota_read_file(const char*path, char*buf, size_t sz)
{
int fd = -1;
size_t cnt;
@@ -140,7 +146,7 @@
return cnt;
}
-static int fota_read_file_int(const char* path, int *val)
+int fota_read_file_int(const char* path, int *val)
{
char buf[32];
char *end;
@@ -162,21 +168,24 @@
return 0;
}
-static int fota_get_update_status(int *fota_status)
+int fota_get_update_status(int *fota_status)
{
int status = 0;
int ret = 0;
if(!fota_is_file_exist(FOTA_UPDATE_STATUS_FILE))
{
+ printf("fota_get_update_status file not exist\n");
*fota_status = -1;
return -1;
}
ret = fota_read_file_int(FOTA_UPDATE_STATUS_FILE, &status);
if(ret < 0) {
+ printf("fota_get_update_status read update_status error\n");
*fota_status = -1;
return -1;
}
+ printf("fota_get_update_status read status:%d\n", status);
*fota_status = status;
return 0;
}
@@ -207,6 +216,13 @@
return 0;
}
+void wefota_upgrade_without_verify(void)
+{
+ system("fota_upi -u recovery");
+
+ return;
+}
+
int wait_fota_conditions(void)
{
// wait for data connected
diff --git a/lynq/CPE_COMMON/ap/app/wefota/wefota_device.h b/lynq/CPE_COMMON/ap/app/wefota/wefota_device.h
index d374db0..8fc5d63 100755
--- a/lynq/CPE_COMMON/ap/app/wefota/wefota_device.h
+++ b/lynq/CPE_COMMON/ap/app/wefota/wefota_device.h
@@ -7,6 +7,7 @@
#define FOTA_INTERVAL_RANDOM (3600 * 2)
#define FOTA_DOWNLOAD_FILEPATH "/cache/zte_fota/delta.package"
#define FOTA_UPDATE_STATUS_FILE "/cache/zte_fota/update_status"
+#define FOTA_NEED_CONTINUE_PREVIOUS_UPGRADE 2
int get_iccid(char *iccid);
int get_imei(char *imei);
@@ -18,5 +19,11 @@
int set_last_work_time(int time, int interval);
int start_wefota_install(void);
int wait_fota_conditions(void);
+int set_wefota_upgrade_flag_cfg(const char *state);
+int fota_is_file_exist(const char* path);
+int fota_read_file(const char*path, char*buf, size_t sz);
+int fota_read_file_int(const char* path, int *val);
+int fota_get_update_status(int *fota_status);
+void wefota_upgrade_without_verify(void);
#endif
\ No newline at end of file
diff --git a/lynq/CPE_COMMON/ap/app/wefota/wefota_main.c b/lynq/CPE_COMMON/ap/app/wefota/wefota_main.c
index d04be2a..099c073 100755
--- a/lynq/CPE_COMMON/ap/app/wefota/wefota_main.c
+++ b/lynq/CPE_COMMON/ap/app/wefota/wefota_main.c
@@ -2,6 +2,7 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include <fcntl.h>
#include "wefota_main.h"
#include "wefota_socket.h"
#include "wefota_device.h"
@@ -122,7 +123,7 @@
if (hdr->code == s_wefota_msg_table[s_status].resp_code && hdr->count == s_pack_date_count)
{
DiffPackDataResp * data = (DiffPackDataResp *)(s_resp + WEFOTA_HEADER_SIZE);
- printf("proc_get_diff_pack_data recv [data->offset %d offset:%d][data->length %d length:%d]\n",
+ printf("proc_get_diff_pack_data recv [data->offset %u offset:%u][data->length %u length:%u]\n",
data->offset, s_diffpack_data_req.offset, data->length, s_diffpack_data_req.length);
if (data->offset == s_diffpack_data_req.offset || data->length == s_diffpack_data_req.length) {
return received;
@@ -320,7 +321,7 @@
}
FotaTask * data = (FotaTask *)(s_resp + WEFOTA_HEADER_SIZE);
- printf("proc_check_task recv:[flag:%d][interval:%d][delay:%d][destVersion:%s]\n", data->flag, data->interval, data->delay, data->destVersion);
+ printf("proc_check_task recv:[flag:%d][interval:%u][delay:%u][destVersion:%s]\n", data->flag, data->interval, data->delay, data->destVersion);
if (data->flag == 1) {
strncpy(s_destVersion, data->destVersion, sizeof(s_destVersion));
printf("exist fota task\n");
@@ -379,7 +380,7 @@
DiffPackInfo * data = (DiffPackInfo *)(s_resp + WEFOTA_HEADER_SIZE);
s_diffpack_info = *data;
- printf("proc_get_diff_pack_id [diffPackID:%s][MD5:%s][size:%d]\n", s_diffpack_info.diffPackID, s_diffpack_info.MD5, s_diffpack_info.size);
+ printf("proc_get_diff_pack_id [diffPackID:%s][MD5:%s][size:%u]\n", s_diffpack_info.diffPackID, s_diffpack_info.MD5, s_diffpack_info.size);
if (s_diffpack_info.size == 0) {
printf("diff pack size==0\n");
return ret;
@@ -387,6 +388,7 @@
return 0;
}
+#if 0
int proc_get_diff_pack_data(int sock) {
set_fota_status(FOTA_STATUS_GET_DIFF_PACK_DATA);
@@ -445,6 +447,193 @@
s_costTime = time(NULL) - startTime;
return 0;
}
+#endif
+
+static void send_request(int sockfd, struct sockaddr_in *server_addr, int offset)
+{
+ char request[16];
+ snprintf(request, sizeof(request), "%d", offset);
+ sendto(sockfd, request, strlen(request), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
+}
+
+static int receive_data(int sockfd, int filefd, struct sockaddr_in *server_addr, socklen_t addr_len, int *received)
+{
+ ssize_t bytes_received;
+ struct sockaddr_in from_addr;
+ socklen_t from_len = sizeof(from_addr);
+
+ bytes_received = recvfrom(sockfd, s_resp, WEFOTA_RESP_MAX_LEN, 0, (struct sockaddr *)&from_addr, &from_len);
+ if (bytes_received < 0)
+ {
+ printf("receive_data received < 0\n");
+ perror("recvfrom failed");
+ return -1;
+ }
+
+ DiffPackDataResp * data = (DiffPackDataResp *)(s_resp + WEFOTA_HEADER_SIZE);
+ int offset = data->offset / 1024;
+
+ printf("receive_data received offset:%u\n", data->offset);
+
+ if (received[offset])
+ {
+ return 0;
+ }
+
+ usleep(10000);
+ if (lseek(filefd, offset * 1024, SEEK_SET) < 0)
+ {
+ printf("receive_data lseek error\n");
+ perror("lseek failed");
+ return -1;
+ }
+ if (write(filefd, data->data, bytes_received - WEFOTA_HEADER_SIZE - 39) < 0)
+ {
+ printf("receive_data write error\n");
+ perror("write failed");
+ return -1;
+ }
+
+ received[offset] = 1;
+ printf("write packet %d,%u\n", offset, data->offset);
+
+ return 0;
+}
+
+int proc_get_diff_pack_data(int sock)
+{
+ set_fota_status(FOTA_STATUS_GET_DIFF_PACK_DATA);
+
+ unsigned int startTime = time(NULL);
+ int ret = -1;
+ int i = 0;
+ int recv_packet_retry = 0;
+ int upgradeStatus = -1;
+ WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;
+ int count = wefota_header_init(hdr);
+ printf("proc_get_diff_pack_data send code=%d, count=%d)\n", hdr->code, count);
+
+ fota_get_update_status(&upgradeStatus);
+ printf("proc_get_diff_pack_data fota_get_update_status upgradeStatus=%d\n", upgradeStatus);
+ if (upgradeStatus == 0)
+ {
+ if(fota_is_file_exist(FOTA_DOWNLOAD_FILEPATH))
+ {
+ printf("proc_get_diff_pack_data upgradeStatus=0, Continue upgrading!!\n");
+ return FOTA_NEED_CONTINUE_PREVIOUS_UPGRADE;
+ }
+ }
+
+ system("rm -rf /cache/zte_fota");
+ system("mkdir /cache/zte_fota");
+
+ int filefd = open(FOTA_DOWNLOAD_FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (filefd < 0)
+ {
+ printf("proc_get_diff_pack_data open failed\n");
+ perror("file open failed");
+ return ret;
+ }
+
+ unsigned int size = s_diffpack_info.size;
+ int total_packets = size / 1024;
+ if (size % 1024 != 0)
+ {
+ total_packets += 1;
+ }
+ int received[total_packets];
+ fd_set read_fds;
+ int max_fd;
+ struct timeval timeout;
+ int select_result = 0;
+ int max_retry_count = 0;
+
+ memset(received, 0, sizeof(received));
+ while (size > 0)
+ {
+ unsigned int len = size > WEFOTA_DIFF_PACK_DATA_MAX_LEN ? WEFOTA_DIFF_PACK_DATA_MAX_LEN : size;
+ s_pack_date_count = len + 39;
+ unsigned int offset = s_diffpack_info.size - size;
+ DiffPackDataReq req = {0};
+ memcpy(req.diffPackID, s_diffpack_info.diffPackID, sizeof(req.diffPackID));
+ req.length = len;
+ req.offset = offset;
+ printf("proc_get_diff_pack_data send request [offset %u][req.diffPackID %s][len %u][s_pack_date_count:%u][offset %u]\n",
+ offset, req.diffPackID, len, s_pack_date_count, offset);
+ memcpy(s_req + WEFOTA_HEADER_SIZE, &req, sizeof(req));
+ s_diffpack_data_req = req;
+ send_message(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr);
+ size -= len;
+ }
+
+ while (1)
+ {
+ FD_ZERO(&read_fds);
+ FD_SET(sock, &read_fds);
+ max_fd = sock;
+ while (1)
+ {
+ timeout.tv_sec = 3;
+ timeout.tv_usec = 0;
+ select_result = select(max_fd + 1, &read_fds, NULL, NULL, &timeout);
+ if (select_result < 0)
+ {
+ printf("proc_get_diff_pack_data select failed\n");
+ perror("select failed");
+ break;
+ }
+ else if (select_result == 0)
+ {
+ printf("proc_get_diff_pack_data No data to read, or timeout\n");
+ break;
+ }
+ if (FD_ISSET(sock, &read_fds))
+ {
+ if (receive_data(sock, filefd, &s_server2_addr, sizeof(s_server2_addr), received) < 0)
+ {
+ break;
+ }
+ }
+ }
+
+ if (max_retry_count++ > WEFOTA_MAX_RETRY_COUNT)
+ {
+ printf("proc_get_diff_pack_data reach the maximum retry count, break!!!\n");
+ break;
+ }
+
+ int all_received = 1;
+ for (i = 0; i < total_packets; i++)
+ {
+ if (!received[i])
+ {
+ all_received = 0;
+ unsigned int len = s_diffpack_info.size - i * 1024 > WEFOTA_DIFF_PACK_DATA_MAX_LEN ? WEFOTA_DIFF_PACK_DATA_MAX_LEN : s_diffpack_info.size - i * 1024;
+ s_pack_date_count = len + 39;
+ unsigned int offset = i * 1024;
+ DiffPackDataReq req = {0};
+ memcpy(req.diffPackID, s_diffpack_info.diffPackID, sizeof(req.diffPackID));
+ req.length = len;
+ req.offset = offset;
+ printf("Re request, send request [offset %u]\n", offset);
+ memcpy(s_req + WEFOTA_HEADER_SIZE, &req, sizeof(req));
+ s_diffpack_data_req = req;
+ send_message(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr);
+ }
+ }
+
+ if (all_received)
+ {
+ printf("All packets received successfully.\n");
+ break;
+ }
+ }
+
+ close(filefd);
+ s_costTime = time(NULL) - startTime;
+ return 0;
+}
+
int proc_get_diff_pack_end(int sock) {
set_fota_status(FOTA_STATUS_GET_DIFF_PACK_END);
@@ -531,6 +720,7 @@
printf("**********wefota_proc\n");
int ret = -1;
int sock = -1;
+ set_wefota_upgrade_flag_cfg("1");
do {
sock = create_udp_socket();
if (sock < 0) {
@@ -579,6 +769,14 @@
printf("**********proc_get_diff_pack_data error \n");
break;
}
+ else if (ret == FOTA_NEED_CONTINUE_PREVIOUS_UPGRADE)
+ {
+ printf("**********wefota_proc,The last upgrade was not completed, continue upgrading \n");
+ close_udp_socket(sock);
+ sock = -1;
+ wefota_upgrade_without_verify();
+ break;
+ }
ret = proc_get_diff_pack_end(sock);
@@ -587,7 +785,8 @@
ret = proc_install_diff_pack();
}while(0);
-
+
+ set_wefota_upgrade_flag_cfg("0");
if (sock >= 0) {
close_udp_socket(sock);
}
diff --git a/lynq/CPE_COMMON/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c b/lynq/CPE_COMMON/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
index 57944da..bc1a809 100755
--- a/lynq/CPE_COMMON/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
+++ b/lynq/CPE_COMMON/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
@@ -1664,6 +1664,7 @@
cfg_set(LOCK_CELL_STATE_FLAG, "0");
cfg_set("ussd_cancel_flag","no");//ussd
+ cfg_set("fota_update_flag", "");
}