[Feature][T8TSK-100] RIL3.0 AT partial upgrade 2
Change-Id: I70c601f3cbc7e8b59aa5feaf2d4147727f227963
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
old mode 100644
new mode 100755
index cdb1977..6d5ecf5
--- a/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/atci/ATCI.cpp
@@ -462,11 +462,11 @@
memset(buf, 0, sizeof(buf));
if(error_code != 0)
{
- sprintf(buf,"%s%d","\r\n+CME ERROR: ",error_code);
+ sprintf(buf,"%s%d\r\n","\r\n+CME ERROR: ",error_code);
}
else
{
- sprintf(buf,"%s","\r\nOK");
+ sprintf(buf,"%s","\r\nOK\r\n");
}
int len_s = send(atci_client_connect, buf, strlen(buf), 0);
if(len_s != strlen(buf))
@@ -490,14 +490,14 @@
else
{
data_len = strlen(data);
- if(data_len > 124)// \r\r + \0
+ if(data_len > 122)// \r\n + \r\n\0
{
RLOGD("data too long");
- snprintf(buf,127,"\r\n%s",data);
+ snprintf(buf,127,"\r\n%s\r\n",data);
}
else
{
- snprintf(buf,data_len+3,"\r\n%s",data);// \r\r + \0
+ snprintf(buf,data_len+5,"\r\n%s\r\n",data);// \r\n + \r\n\0
}
int len_s = send(atci_client_connect, buf, strlen(buf), 0);
if(len_s != strlen(buf))
diff --git a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
index 8561e58..38c62da 100755
--- a/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/atci/atci_lynq_data_cmd.cpp
@@ -66,7 +66,7 @@
//wrire data to target
atci_data_req_t req;
-
+
if(state==1)
{
req.request_id = RIL_REQUEST_SETUP_DATA_CALL;
diff --git a/src/lynq/lib/liblynq-at-extension/include/lib_at/lynq_at.h b/src/lynq/lib/liblynq-at-extension/include/lib_at/lynq_at.h
index 1a17fe9..0049eb1 100755
--- a/src/lynq/lib/liblynq-at-extension/include/lib_at/lynq_at.h
+++ b/src/lynq/lib/liblynq-at-extension/include/lib_at/lynq_at.h
@@ -10,9 +10,9 @@
#ifndef __LYNQ_AT__
#define __LYNQ_AT__
-#ifdef __cplusplus
-extern "C" {
-#endif
+//#ifdef __cplusplus
+//extern "C" {
+//#endif
/**
* @brief
@@ -31,8 +31,8 @@
*/
int lynq_reg_third_at(const char *ext_at, LYNQ_AT_CALLBACK callback);
-#ifdef __cplusplus
-}
-#endif
+//#ifdef __cplusplus
+//}
+//#endif
#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-at-extension/lynq_at.cpp b/src/lynq/lib/liblynq-at-extension/lynq_at.cpp
index a7c6b2e..8785310 100755
--- a/src/lynq/lib/liblynq-at-extension/lynq_at.cpp
+++ b/src/lynq/lib/liblynq-at-extension/lynq_at.cpp
@@ -1,20 +1,25 @@
-#include<sys/types.h>
-#include<sys/socket.h>
-#include<unistd.h>
-#include<arpa/inet.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <log/log.h>
#include <pthread.h>
+#include <errno.h>
#include "liblog/lynq_deflog.h"
#include "include/lib_at/lynq_at.h"
#define LYNQ_AT_SERVICE_PORT 8087
#define OUT_MAX_SIZE 1024
#define USER_LOG_TAG "LYNQ_AT"
-
+#define AT_EXTERSION_SOCKET_NAME "/dev/socket/lynq_atsvc_socket_1"
+#define LINE __LINE__
+#define FUNC __FUNCTION__
+static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
typedef enum
{
A_SUCCESS = 0,
@@ -28,8 +33,15 @@
char *output = NULL;
char buffer_at[OUT_MAX_SIZE] = {0};
struct sockaddr_in addr_serv;
+struct sockaddr_un addr_server;
+
+
socklen_t len;
LYNQ_AT_CALLBACK tmp = NULL;
+bool connect_state = false;
+#define SOCKET_ZERO 0
+#define SOCKET_SUCC 1
+#define SOCKET_FAIL -1
/**
* @brief Catch exceptions and free malloc's memory
@@ -66,6 +78,84 @@
}
}
+
+int socket_local_client (char* name) {
+ //struct sockaddr_un server;
+ //int fd = 0;
+ LYINFLOG("[%d][%s] enter",LINE,FUNC);
+ sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sockfd < 0)
+ {
+ LYDBGLOG("Can't open stream socket (%s)", name);
+ return -1;
+ }
+ addr_server.sun_family = AF_UNIX;
+ memset(addr_server.sun_path, '\0', sizeof(addr_server.sun_path));
+ strncpy(addr_server.sun_path, name, sizeof(addr_server.sun_path) - 1);
+ if (connect(sockfd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
+ {
+ close(sockfd);
+ LYDBGLOG("Can't connect to server side, path: %s, errno:%d", name, errno);
+ return -1;
+ }
+ LYINFLOG("[%d][%s] connect %s success",LINE,FUNC,name);
+ return sockfd;
+}
+bool send_msg_to_service(int fd,char *msg,int size)
+{
+ LYDBGLOG("[%d][%s] enter",LINE,FUNC);
+ if (fd < 0)
+ {
+ LYDBGLOG("fd invalid when send to atci service. errno = %d", errno);
+ return false;
+ }
+ if(NULL == msg)
+ {
+ LYDBGLOG("atcmd is null.");
+ return false;
+ }
+ int sendLen = send(fd, msg, size, 0);
+ if (sendLen != size)
+ {
+ LYDBGLOG("lose data when send to atci service. errno = %d", errno);
+ return false;
+ }
+ LYDBGLOG("send to app demo: %s", msg);
+ return true;
+}
+
+int atsvc_cmd_recv(int fd, char *buf, int len)
+{
+ int ret = 0;
+ fd_set rfds;
+ //FD_CLR(fd, &rfds);
+ FD_SET(fd, &rfds);
+ ret = select(fd + 1, &rfds, NULL, NULL, NULL);
+ if (ret <= 0)
+ {
+ LYDBGLOG("acti_cmd_recv select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+ return SOCKET_FAIL;
+ }
+ if (FD_ISSET(fd, &rfds))
+ {
+ ret = recv(fd, buf, len, 0);
+ if (ret < 0)
+ {
+ LYDBGLOG("acti_cmd_recv select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+ return SOCKET_FAIL;
+ }
+ else if(ret == 0)
+ {
+ LYDBGLOG("acti_cmd_recv recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+ return SOCKET_ZERO;
+ }
+ else
+ {
+ //buf[ret] = '\0';
+ }
+ }
+ return SOCKET_SUCC;
+}
/**
* @brief send third cmd to service and receive input,then send output to service
*
@@ -74,53 +164,73 @@
*/
void *thread_recv(void *parm)
{
- signal(SIGPIPE, signal_handler);
- signal(SIGABRT, signal_handler);
- signal(SIGBUS, signal_handler);
- signal(SIGFPE, signal_handler);
- signal(SIGILL, signal_handler);
- signal(SIGSEGV, signal_handler);
+ //signal(SIGPIPE, signal_handler);
+ //signal(SIGABRT, signal_handler);
+ //signal(SIGBUS, signal_handler);
+ //signal(SIGFPE, signal_handler);
+ //signal(SIGILL, signal_handler);
+ //signal(SIGSEGV, signal_handler);
+ LYINFLOG("[%d][%s] enter",LINE,FUNC);
int recv = 0;
int send = 0;
char at_cmd[100] = {0};
- sockfd=socket(AF_INET,SOCK_DGRAM,0);
- memset(&addr_serv, 0, sizeof(addr_serv));
- addr_serv.sin_family =AF_INET;
- addr_serv.sin_port =htons(LYNQ_AT_SERVICE_PORT);
- addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
- len=sizeof(addr_serv);
- int len_buf = strlen(buffer_at);
- send = sendto(sockfd, buffer_at, len_buf,0,(struct sockaddr*)&addr_serv,len);
- if(send < 0)
+ int fd = -1;
+ int ret = 0;
+ fd = socket_local_client(AT_EXTERSION_SOCKET_NAME);
+ if(fd <= 0)
{
- LYDBGLOG("thread_recv send fail\n");
- result = send;
+ connect_state = false;
+ pthread_mutex_unlock(&s_startupMutex);
return NULL;
}
+ int len_buf = strlen(buffer_at);
+ if(!send_msg_to_service(fd,buffer_at,len_buf))
+ {
+ connect_state = false;
+ pthread_mutex_unlock(&s_startupMutex);
+ return NULL;
+ }
+ connect_state = true;
+ pthread_mutex_unlock(&s_startupMutex);
char *input = NULL;
output = (char *)malloc(sizeof(char)*OUT_MAX_SIZE);
if(NULL == output)
{
LYDBGLOG("thread_recv malloc fail\n");
- result = A_ERROR;
return NULL;
}
+ TryNewLink:
+ if(connect_state == false)
+ {
+ if (connect(fd, (struct sockaddr *) &addr_server, sizeof(struct sockaddr_un)) < 0)
+ {
+ close(fd);
+ LYDBGLOG("Can't connect to server side, path: %s, errno:%d", AT_EXTERSION_SOCKET_NAME, errno);
+ return NULL;
+ }
+ connect_state = true;
+ }
while (1)
{
/*receive at cmd*/
- LYDBGLOG("lynq_reg_third_at receive at cmd\n");
- recv = recvfrom(sockfd,at_cmd,sizeof(at_cmd),0,(struct sockaddr*)&addr_serv,&len);
- if(recv < 0)
+ memset(at_cmd, 0, sizeof(at_cmd));
+ ret = atsvc_cmd_recv(fd, at_cmd,sizeof(at_cmd));
+ if (ret < 0)
{
- LYDBGLOG("thread_recv recv fail\n");
+ LYDBGLOG("[%d][%s]receive CMD error",LINE,FUNC);
continue;
}
+ else if(ret == SOCKET_ZERO)
+ {
+ ALOGE("maybe client socket closed 1. retry new link!");
+ connect_state = false;
+ goto TryNewLink;
+ }
input = at_cmd;
//begin deal with callback
tmp(input, output, OUT_MAX_SIZE);
LYDBGLOG("lynq_reg_third_at send output to service\n");
- send = sendto(sockfd, output, strlen(output),0,(struct sockaddr*)&addr_serv,len);
- if(send < 0)
+ if(!send_msg_to_service(fd,output, strlen(output)))
{
LYDBGLOG("thread_recv send fail\n");
continue;
@@ -128,9 +238,9 @@
}
free(output);
output = NULL;
- if(sockfd != 0)
+ if(fd != 0)
{
- close(sockfd);
+ close(fd);
}
return NULL;
}
@@ -142,11 +252,15 @@
*/
int lynq_connect_service_start(void)
{
+ LYINFLOG("[%d][%s] enter",LINE,FUNC);
pthread_t lynq_at_tid = -1;
int rt = pthread_create(&lynq_at_tid, NULL, thread_recv, NULL);
- if(rt < 0)
+ pthread_mutex_lock(&s_startupMutex);
+ LYINFLOG("[%d][%s] pthread mutex unlock",LINE,FUNC);
+ LYINFLOG(",rt:%d,connect state:%d\n",rt,connect_state);
+ if((connect_state != true) && rt < 0)
{
- LYERRLOG("urc loop failure!!!\n");
+ LYERRLOG("connect fail,rt:%d,connect state:%d\n",rt,connect_state);
return -1;
}
return 0;
@@ -166,15 +280,17 @@
}
memcpy(buffer_at, ext_at, strlen(ext_at));
tmp = callback;
- LYLOGSET(LOG_INFO);
+ LYLOGSET(LOG_DEBUG);
LYLOGEINIT(USER_LOG_TAG);
LYDBGLOG("lynq_reg_third_at start\n");
int ret = lynq_connect_service_start();
+
if(ret != 0)
{
LYDBGLOG("lynq_connect_service_start start failed\n");
return A_ERROR;
}
- return result;
+ LYDBGLOG("lynq_connect_service_start success ret:%d\n",ret);
+ return A_SUCCESS;
}
diff --git a/src/lynq/lib/liblynq-at-extension/makefile b/src/lynq/lib/liblynq-at-extension/makefile
index 0a6c2d3..257de29 100755
--- a/src/lynq/lib/liblynq-at-extension/makefile
+++ b/src/lynq/lib/liblynq-at-extension/makefile
@@ -6,10 +6,7 @@
-g -Os \
-flto \
-DRIL_SHLIB \
- -DATCI_PARSE \
-fPIC \
- -DKEEP_ALIVE \
- -DECALL_SUPPORT \
-fpermissive \
@@ -19,6 +16,7 @@
LOCAL_C_INCLUDES = \
-I. \
+ -I$(ROOT)/usr/include/binder \
-I$(LOCAL_PATH)/include/lib_at \
-I$(ROOT)$(includedir)/logger \
-I$(ROOT)$(includedir)/liblog \
@@ -31,6 +29,7 @@
-llog \
-lpthread \
-llynq-log \
+ -lbinder \
SOURCES = $(wildcard *.cpp)
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid.c b/src/telephonyware/3.0/atcid/atci/src/atcid.c
index d5ee767..0eaff4f 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid.c
@@ -44,7 +44,7 @@
#include <netinet/in.h>
#include <sys/socket.h>
-#include "lynq_atsvc_controller.h"
+#include "lynq_atsvc_controller.h" /*warren add for lynq atsvc on 2022/12/06*/
/*misc global vars */
Serial serial;
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
index 9ae9f21..577b3c1 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.c
@@ -68,7 +68,9 @@
/*misc global vars */
-//extern Serial serial;
+#ifndef LYNQ_ATSVC
+extern Serial serial;
+#endif
extern At_Ril_Mmi_t atRilMmi_info;
#define CONN_VCOM 1
@@ -1269,6 +1271,17 @@
LOGATCI(LOG_INFO, "Command:%s",line);
/*warren add for lynq at svc on 2022/12/12 start*/
#ifdef LYNQ_ATSVC
+ if(has_registe_cmd == true)
+ {
+ if(lynq_check_extension_atcmd(line) == 0)
+ {
+ if(send_msg_to_at_extension(line,strlen(line))!=0)
+ {
+ ALOGD("send at fail,please try agin");
+ }
+ continue;
+ }
+ }
plugin_count = -1;
plugin_count = lynq_dispatch_atcmd(line);
ALOGD("plugin count:%d",plugin_count);
@@ -1277,7 +1290,6 @@
plugin_msg_array[plugin_count].atsvc_incb(line,strlen(line));
continue;
}
-//todo check whither plugin at cmd, if is plugin atcmd call cb and send msg to com,and continue
#endif
/*warren add for lynq at svc on 2022/12/12 end*/
dataType = process_cmd_line(line);
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
index 55d0868..3c0ed52 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid_serial.h
@@ -123,7 +123,9 @@
int currDevice;
} Serial;
-extern Serial serial;
+#ifdef LYNQ_ATSVC
+extern Serial serial;//warren add for atsvc on 20221214
+#endif
static const char *s_MsgResponses[] = {
"OK",
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
index 0f32469..9042d35 100755
--- a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
@@ -6,6 +6,7 @@
#include <libxml/tree.h>
#include <libxml/parser.h>
#include <dlfcn.h>
+#include <pthread.h>
#include "lynq_atsvc_controller.h"
#include "atcid.h"
#include "atcid_serial.h"
@@ -13,10 +14,19 @@
#include "transfer_controller.h"
#define FUNC __FUNCTION__
#define LINE __LINE__
+
+#define SOCKET_ZERO 0
+#define SOCKET_SUCC 1
+#define SOCKET_FAIL -1
+#define SOCKET_BUF_SIZE 512
+char register_atcmd_buff[SOCKET_BUF_SIZE] = {0};
+char *white_list[] = {"AT","ATD","ATV","ATA","ATE","ATH","ATL","ATI","ATP","ATO","ATQ",NULL};
int g_atsvc_socket_fd = 0;
+int g_atsvc_client_connect = 0;
//struct sockaddr_in server_addr;
//struct sockaddr_in lynqClient_addr;
-
+static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
+int has_registe_cmd = 0;
struct sockaddr_un g_remote_addr = {0};
struct sockaddr_un g_local_addr = {0};
@@ -96,7 +106,6 @@
return -1;
}
}
-
break;
}
case AF_INET:
@@ -139,7 +148,8 @@
char* line_cut = cut_cmd_line(atcmd);
if (line_cut == NULL)
{
- return 0;
+ ALOGD("[%d][%s]line_cut is null",LINE,FUNC);
+ return -1;
}
for(int i = 0;i < PLUGINE_MAX_COUNT;i++)
{
@@ -250,16 +260,197 @@
return 0;
}
+
+int lynq_check_extension_atcmd(char * atcmd)
+{
+ ALOGD("[%d][%s] enter",LINE,FUNC);
+ char *needleP = NULL;
+ if(NULL == atcmd)
+ {
+ ALOGD("[%d][%s] atcmd is null",LINE,FUNC);
+ return -1;
+ }
+ ALOGD("[%d][%s]atcmd:%s",LINE,FUNC,atcmd);
+ char* line_cut = cut_cmd_line(atcmd);
+ if (line_cut == NULL)
+ {
+ ALOGD("[%d][%s]line_cut is null",LINE,FUNC);
+ return -1;
+ }
+ for(int i = 0;white_list[i];i++)
+ {
+ if(strcmp(line_cut,white_list[i]) == 0)
+ {
+ ALOGD("[%d][%s]count %d,pass atcmd:%s",LINE,FUNC,i,line_cut);
+ return -1;
+ }
+ }
+ needleP =strstr(register_atcmd_buff,line_cut);
+ if(NULL != needleP)
+ {
+ ALOGD("[%d][%s] find atcmd:%s",LINE,FUNC,line_cut);
+ free(line_cut);
+ return 0;
+ }
+ free(line_cut);
+ return -1;
+}
+int send_msg_to_at_extension(char *atcmd,int size)
+{
+ LOGATCI(LOG_ERR,"[%d][%s] enter",LINE,FUNC);
+ if (g_atsvc_client_connect < 0)
+ {
+ LOGATCI(LOG_ERR, "fd invalid when send to atci service. errno = %d", errno);
+ return -1;
+ }
+ if(NULL == atcmd)
+ {
+ LOGATCI(LOG_ERR, "atcmd is null.");
+ return -1;
+ }
+ int sendLen = send(g_atsvc_client_connect, atcmd, size, 0);
+ if (sendLen != size)
+ {
+ LOGATCI(LOG_ERR, "lose data when send to atci service. errno = %d", errno);
+ return -1;
+ }
+ LOGATCI(LOG_DEBUG, "send to app demo: %s", atcmd);
+ return 0;
+}
+int actsvc_cmd_recv(int fd, char *buf, int len)
+{
+ int ret = 0;
+ fd_set rfds;
+ //FD_CLR(fd, &rfds);
+ FD_SET(fd, &rfds);
+ ret = select(fd + 1, &rfds, NULL, NULL, NULL);
+ if (ret <= 0)
+ {
+ ALOGE("acti_cmd_recv select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+ return SOCKET_FAIL;
+ }
+ if (FD_ISSET(fd, &rfds))
+ {
+ ret = recv(fd, buf, len, 0);
+ if (ret < 0)
+ {
+ ALOGE("acti_cmd_recv select error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+ return SOCKET_FAIL;
+ }
+ else if(ret == 0)
+ {
+ ALOGE("acti_cmd_recv recv error, ret=%d, error=%s(%d),fd=%d", ret,strerror(errno), errno, fd);
+ return SOCKET_ZERO;
+ }
+ else
+ {
+ ALOGD("[%d][%s] buf is:%s",LINE,FUNC,buf);
+ }
+ }
+ return SOCKET_SUCC;
+}
+
+void *start_at_extension_Socket(void * param)
+{
+ ALOGD("[%d][%s]enter",LINE,FUNC);
+ socklen_t client_len;
+ int ret;
+ char parser_buf[SOCKET_BUF_SIZE];
+ g_atsvc_socket_fd = create_socket(AF_UNIX, SOCK_STREAM,0, 0, NULL,RIL_SOCKET_NAME, (void *)&g_local_addr, 2);
+ if(0 > g_atsvc_socket_fd)
+ {
+ ALOGD("init socket fail and fd:%d",g_atsvc_socket_fd);
+ return NULL;
+ }
+ TryNewLink:
+ client_len = sizeof(g_local_addr);
+ int conn = accept(g_atsvc_socket_fd,(struct sockaddr *) &g_local_addr, &client_len);
+ if (conn <= 0)
+ {
+ ALOGE("[%d][%s] accept error!",LINE,FUNC);
+ close(conn);
+ return NULL;
+ }
+ ALOGD("Accept a client , fd is %d", conn);
+ if(g_atsvc_client_connect >= 0)
+ {
+ ALOGE("g_atsvc_client_connect need close!");
+ close(g_atsvc_client_connect);
+ g_atsvc_client_connect = -1;
+ }
+ g_atsvc_client_connect = conn;
+ /* tranlate data */
+ while (true)
+ {
+ memset(parser_buf, 0, sizeof(parser_buf));
+ if(has_registe_cmd == 0)
+ {
+ memset(register_atcmd_buff, 0, sizeof(register_atcmd_buff));
+ ret = actsvc_cmd_recv(conn, register_atcmd_buff, SOCKET_BUF_SIZE);
+ if (ret < 0)
+ {
+ ALOGE("[%d][%s]receive CMD error",LINE,FUNC);
+ continue;
+ }
+ else if(ret == SOCKET_ZERO)
+ {
+ ALOGE("maybe client socket closed 1. retry new link!");
+ goto TryNewLink;
+ }
+ has_registe_cmd = 1;
+ }
+ else
+ {
+ ret = actsvc_cmd_recv(conn, parser_buf, SOCKET_BUF_SIZE);
+ if (ret < 0)
+ {
+ ALOGE("[%d][%s]receive CMD error",LINE,FUNC);
+ continue;
+ }
+ else if(ret == SOCKET_ZERO)
+ {
+ ALOGE("maybe client socket closed 1. retry new link!");
+ goto TryNewLink;
+ }
+ lynq_write_data_to_serail(parser_buf,strlen(parser_buf),0);
+ }
+ }
+ return NULL;
+}
+
+void start_at_extension_loop(void)
+{
+ pthread_t at_extension_socket_thread;
+ ALOGD("[%d][%s]enter",LINE,FUNC);
+ pthread_mutex_lock(&s_startupMutex);
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ int result = pthread_create(&at_extension_socket_thread, &attr, start_at_extension_Socket, NULL);
+ if (result != 0)
+ {
+ ALOGE("Failed to create ATCI thread: %s", strerror(result));
+ goto done;
+ }
+done:
+ pthread_mutex_unlock(&s_startupMutex);
+}
+
int lynq_atsvc_init(int count,const char * plugin_conf_path)
{
ALOGD("start [%d][%s]",LINE,FUNC);
int res = 0;
+ /*
g_atsvc_socket_fd = create_socket(AF_UNIX, SOCK_STREAM,0, 0, NULL,RIL_SOCKET_NAME, (void *)&g_local_addr, 2);
if(0 > g_atsvc_socket_fd)
{
ALOGD("init socket fail and fd:%d",g_atsvc_socket_fd);
//return INIT_SOCKET_FAIL;
}
+ */
+ start_at_extension_loop();
res = load_pulgin(PLUGIN_CONF_PATH);
if(0 > res)
{
@@ -285,6 +476,7 @@
{
ALOGD("init pseudo terminal fail");
}
+ //todo at liblynq-at-extension
/*create thread for reacive ril msg*/
/*load pulgin from plugin config*/
return 0;
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h
index a49400cf..549f6a7 100755
--- a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.h
@@ -19,24 +19,35 @@
#define PLUGIN_CONF_PATH "/data/atsvc/lynq_atsvc_plugin.xml"
#define RIL_SOCKET_NAME "/dev/socket/lynq_atsvc_socket_1"
#define PLUGINE_MAX_COUNT 16
+
+
+
/**********************************************************************************************
-/**函数列表是第六部分
-* @brief initalize lynq atsvc,it will load plugin and create socket process
-* @param plugin_conf_path [IN] plugin config file path
-* @param sum [OUT](OUT 表示出参) 参数b 说明
-* @return
-* 0:success
-* 1:load pugin config file fail
-* 2:create socket fail
-* 3:create thread fail
+* @brief this is a callback function,atsvc will call this function if the at command is this \
+**module command
+* @param input [IN] at command
+* @param length [IN] at command length
+* @return NULL
************************************************************************************************/
typedef void ( *lynq_atsvc_incb )(const char *input,const int length);
-/*type:
+
+/**********************************************************************************************
+* @brief this is a callback function,plugin will call this function when the plugin needs to \
+**return the response or urc
+* @param input [IN] response or urc
+* @param length [IN] response or urc length
+* @param type
** 0:response
** 1:unsolictedresponse
-*/
+* @return NULL
+************************************************************************************************/
typedef void ( *lynq_atsvc_outcb )(char *output,int out_size,int type);
+/**********************************************************************************************
+* @brief this is a register function, atsvc will call this function when a plugin register in atsvc.
+* @param lynq_atsvc_outcb [IN]
+* @return lynq_atsvc_incb
+************************************************************************************************/
typedef lynq_atsvc_incb (*lynq_register_module)(lynq_atsvc_outcb out_cb);
@@ -50,9 +61,19 @@
}plugin_msg_t;
extern plugin_msg_t plugin_msg_array[PLUGINE_MAX_COUNT];
-
+extern int has_registe_cmd;
+/**********************************************************************************************
+* @brief initalize lynq atsvc,it will load plugin and create socket process
+* @param plugin_conf_path [IN] plugin config file path
+* @return
+* 0:success
+* 1:load pugin config file fail
+* 2:create socket fail
+* 3:create thread fail
+************************************************************************************************/
int lynq_atsvc_init(int count,const char * plugin_conf_path);
-
+int lynq_check_extension_atcmd(char * atcmd);
+int send_msg_to_at_extension(char *atcmd,int size);
int create_socket(const int domain, const int type, const int protocol,const int port,const char *IP,const char *socket_name,void * addr,int backlog);
int send_msg(int socket_fd,const struct sockaddr *dest_addr,const char *msg);
int lynq_dispatch_atcmd(char* atcmd);