[Bugfix][API-1395]the patch from MTK to add register-callback return value and retry machine-made(500ms once,total 20 times) when mnld-gpshal socket fail
Only Configure:No
Affected branch:GSW3.0-No-Connman
Affected module:GNSS
Is it affected on both ZXIC and MTK:only MTK,
Self-test:Yes,
Doc Update:NO.
Change-Id: Ide815437e1e08dffade4b8a8291b18fa36b46a67
diff --git a/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_utility.h b/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_utility.h
index 9b6d74b..30d3aa5 100644
--- a/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_utility.h
+++ b/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_utility.h
@@ -21,6 +21,7 @@
#define DUMP_BYTES_PER_LINE 16
#define DUMP_MAX_PRINT_LINE 10
+#define SOCKET_RETRY_MAX_COUNT 20
#define MNLDINF_DUMP_MEM(addr, len) do{\
int i = 0, j = 0;\
diff --git a/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_utility.c b/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_utility.c
index f6dd4b5..052a9ba 100755
--- a/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_utility.c
+++ b/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_utility.c
@@ -427,6 +427,7 @@
int fd;
int size;
struct sockaddr_un addr;
+ int socket_retry_counter=0;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
@@ -447,13 +448,23 @@
strerror(errno), errno);
return -1;
}
- if(connect(fd, (struct sockaddr*)&addr, size) == -1) {
- LOGE("mnldinf_socket_tcp_client_connect_local() connect() failed, abstruct=%d name=[%s] reason=[%s]%d",
+/* retry connection if socket connection fail, 500000us*20 times */
+ while (1){
+ if(connect(fd, (struct sockaddr*)&addr, size) == -1) {
+ LOGE("mnldinf_socket_tcp_client_connect_local() connect() failed, abstruct=%d name=[%s] reason=[%s]%d",
abstract, name, strerror(errno), errno);
- close(fd);
- return -1;
+ }else{
+ break;
+ }
+ if(socket_retry_counter >= SOCKET_RETRY_MAX_COUNT) {
+ LOGE("retry connect() for 20 times");
+ close(fd);
+ return -1;
+ }
+ socket_retry_counter++;
+ LOGE("retry connect() socket_retry_counter=%d", socket_retry_counter);
+ usleep(500000);
}
-
return fd;
}
diff --git a/src/connectivity/gps/2.0/gps_hal/src/gpshal.c b/src/connectivity/gps/2.0/gps_hal/src/gpshal.c
old mode 100644
new mode 100755
index 3240013..9aad141
--- a/src/connectivity/gps/2.0/gps_hal/src/gpshal.c
+++ b/src/connectivity/gps/2.0/gps_hal/src/gpshal.c
@@ -139,7 +139,7 @@
// Do not deinit resources
// We want to have a simple design for a built-in service
// "Deinit" is for an installable / removable service
-static void gpshal_resource_init(GpsCallbacks_ext* src) {
+static int gpshal_resource_init(GpsCallbacks_ext* src) {
unsigned int capabilities = 0;
unsigned int year = 0;
char *name = g_gpshal_ctx.gps_name;//"Version: MNLD, MNL";
@@ -155,50 +155,56 @@
system_info.size = sizeof(GnssSystemInfo);
g_gpshal_ctx.gps_cbs->set_system_info_cb(&system_info);
- if (GPSHAL_STATE_UNKNOWN != g_gpshal_ctx.gps_state_intent) return; // at most once
+ if (GPSHAL_STATE_UNKNOWN != g_gpshal_ctx.gps_state_intent){
+ return 0; // already set
+ } // at most once
g_gpshal_ctx.fd_mnl2hal_basic = create_mnl2hal_fd_basic();
- if (-1 == g_gpshal_ctx.fd_mnl2hal_basic) return; // error
+ if (-1 == g_gpshal_ctx.fd_mnl2hal_basic){
+ return -1; // error
+ }
g_gpshal_ctx.fd_mnl2hal_ext = create_mnl2hal_fd_ext();
- if (-1 == g_gpshal_ctx.fd_mnl2hal_ext) return; // error
+ if (-1 == g_gpshal_ctx.fd_mnl2hal_ext){
+ return -1; // error
+ }
g_gpshal_ctx.fd_worker_epoll = epoll_create(MAX_EPOLL_EVENT);
if (-1 == g_gpshal_ctx.fd_worker_epoll) {
LOGE("Fail to create epoll reason=[%s]%d",
strerror(errno), errno);
- return; // error
+ return -1; // error
}
if (mnldinf_epoll_add_fd(
g_gpshal_ctx.fd_worker_epoll,
g_gpshal_ctx.fd_mnl2hal_basic) == -1) {
LOGE("Fail to add fd_mnl2hal basic");
- return; // error
+ return -1; // error
}
if (mnldinf_epoll_add_fd(
g_gpshal_ctx.fd_worker_epoll,
g_gpshal_ctx.fd_mnl2hal_ext) == -1) {
LOGE("Fail to add fd_mnl2hal ext");
- return; // error
+ return -1; // error
}
g_gpshal_ctx.thd_worker = g_gpshal_ctx.gps_cbs->create_thread_cb(
GPSHAL_WORKER_THREAD_NAME, gpshal_worker_thread, NULL);
if (!g_gpshal_ctx.thd_worker) {
LOGE("Fail to create %s", GPSHAL_WORKER_THREAD_NAME);
- return; // error
+ return -1; // error
}
gpshal_set_gps_state(GPSHAL_STATE_RESOURCE);
+ return 0;
}
int gpshal_gpscbs_save(GpsCallbacks_ext* src) {
// assert(NULL != src);
if (sizeof(GpsCallbacks_ext) == src->size) {
LOGD("Use GpsCallbacks");
- gpshal_resource_init(src);
- return 0;
+ return gpshal_resource_init(src);
}
LOGE("Bad callback, size: %zd, expected: %zd",
src->size, sizeof(GpsCallbacks_ext));