[Feature][T8TSK-189] chang urc report address to 127.0.0.1
Change-Id: Ibfd79b8ed38fe6f4835cf596f167e5636fa3c379
diff --git a/src/lynq/lib/liblynq-shm/include/lynq_urc_socket.h b/src/lynq/lib/liblynq-shm/include/lynq_urc_socket.h
new file mode 100755
index 0000000..866d5c2
--- /dev/null
+++ b/src/lynq/lib/liblynq-shm/include/lynq_urc_socket.h
@@ -0,0 +1,24 @@
+/**
+ * @file shm.h
+ * @author hq
+ * @brief
+ * @version 1.0
+ * @date 2022-12-16
+ *
+ * @copyright Copyright (c) 2022
+ *
+ */
+#ifndef __LYNQ_URC_SOCKET__
+#define __LYNQ_URC_SOCKET__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+int lynq_open_broadcast_urc_socket();
+int lynq_broadcast_urc_msg(void * msg, int size);
+int lynq_register_urc_socket();
+int lynq_recv_urc_msg(void * buffer, int size);
+#ifdef __cplusplus
+}
+#endif
+#endif //#ifndef __LYNQ_URC_SOCKET__
diff --git a/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp b/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp
new file mode 100755
index 0000000..2ebf85f
--- /dev/null
+++ b/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp
@@ -0,0 +1,278 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+//#include <binder/Parcel.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "lynq_urc_socket.h"
+#include "log/log.h"
+#include <list>
+
+static int lynq_urc_socket_fd = 0;
+static int registered_urc_socket_port = 0;
+static int registered_urc_socket_fd = 0;
+
+static pthread_mutex_t s_urc_broadcast_mtx = PTHREAD_MUTEX_INITIALIZER;
+static std::list<struct sockaddr*> s_urc_broadcast_clients;
+
+static pthread_mutex_t s_urc_register_mtx = PTHREAD_MUTEX_INITIALIZER;
+
+#define LYNQ_URC_SERVER_LISTEN_PORT 8086
+#define LYNQ_URC_SERVER_LISTEN_ADDRESS "127.0.0.1"
+
+#define LYNQ_URC_CLIENT_PORT_START 7050
+#define LYNQ_URC_CLIENT_PORT_END 7099
+#define LYNQ_URC_CLIENT_LISTEN_ADDRESS "127.0.0.1"
+
+static void * receive_client_heartbeat(void *parm);
+static void find_all_client_to_notify_online();
+int lynq_open_broadcast_urc_socket()
+{
+ int ret = 0;
+ int on = 1;
+ pthread_mutex_lock(&s_urc_broadcast_mtx);
+
+ struct sockaddr_in addr_serv;
+ //Creating a Socket object
+ lynq_urc_socket_fd=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_URC_SERVER_LISTEN_PORT);
+ addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_SERVER_LISTEN_ADDRESS);
+ ret = setsockopt(lynq_urc_socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+ if (ret < 0){
+ goto open_socket_exit;
+ }
+ ret = bind(lynq_urc_socket_fd,(struct sockaddr*)&addr_serv,sizeof(addr_serv));
+ if (ret < 0){
+ goto open_socket_exit;
+ }
+ //receive registion and display on at port
+ pthread_t thid;
+ if(pthread_create(&thid, NULL, receive_client_heartbeat, NULL) != 0) {
+ RLOGE("thread creation failed\n");
+ ret = -1;
+ goto open_socket_exit;
+ }
+
+ find_all_client_to_notify_online();
+
+open_socket_exit:
+ pthread_mutex_unlock(&s_urc_broadcast_mtx);
+ return ret == 0 ? lynq_urc_socket_fd: -1;
+}
+
+int lynq_broadcast_urc_msg(void * msg, int size)
+{
+ int all_ok = 1;
+ pthread_mutex_lock(&s_urc_broadcast_mtx);
+ for(auto it=s_urc_broadcast_clients.begin(); it != s_urc_broadcast_clients.end(); )
+ {
+ int len = sendto(lynq_urc_socket_fd, msg, size, 0, *it, sizeof(struct sockaddr_in));
+ if (len < 0)
+ {
+ struct sockaddr_in *addr_cli = (struct sockaddr_in *) *it;
+ printf("remove client %d now\n", ntohs(addr_cli->sin_port));
+ it = s_urc_broadcast_clients.erase(it);
+ free(addr_cli);
+ all_ok = 0;
+ continue;
+ }
+ it++;
+ }
+ pthread_mutex_unlock(&s_urc_broadcast_mtx);
+ return all_ok;
+}
+
+int lynq_register_urc_socket()
+{
+ int on = 0;
+ int ret = 0;
+ int len_s;
+ struct sockaddr_in addr_serv;
+ //Creating a Socket object
+ pthread_mutex_lock(&s_urc_register_mtx);
+ registered_urc_socket_fd=socket(AF_INET,SOCK_DGRAM,0);
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ addr_serv.sin_family =AF_INET;
+ addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_CLIENT_LISTEN_ADDRESS);
+ if (registered_urc_socket_port > 0) {
+ on = 1;
+ ret = setsockopt(registered_urc_socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+ addr_serv.sin_port = htons(registered_urc_socket_port);
+ ret = bind(registered_urc_socket_fd,(struct sockaddr*)&addr_serv,sizeof(addr_serv));
+ if (ret < 0){
+ goto register_socket_exit;
+ }
+ }
+ else
+ {
+ for(registered_urc_socket_port = LYNQ_URC_CLIENT_PORT_START; registered_urc_socket_port < LYNQ_URC_CLIENT_PORT_END; registered_urc_socket_port ++)
+ {
+ addr_serv.sin_port = htons(registered_urc_socket_port);
+ ret = bind(registered_urc_socket_fd,(struct sockaddr*)&addr_serv,sizeof(addr_serv));
+ if (ret < 0){
+ printf("bind socket %d fail\n", registered_urc_socket_port);
+ continue;
+ }
+ break;
+ }
+ }
+
+ addr_serv.sin_port = htons(LYNQ_URC_SERVER_LISTEN_PORT);
+ len_s = sendto(registered_urc_socket_fd, ®istered_urc_socket_port, sizeof(registered_urc_socket_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));
+ printf("send result %d %d\n", len_s, errno);
+register_socket_exit:
+ pthread_mutex_unlock(&s_urc_register_mtx);
+ printf("init result %d\n", ret);
+ return ret ==0 ? registered_urc_socket_fd : -1;
+}
+
+int lynq_recv_urc_msg(void * buffer, int size)
+{
+ int ret = 0;
+ struct sockaddr_in addr_serv;
+ socklen_t len_addr_serv = sizeof(addr_serv);
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ printf("client %ul to recv now\n", pthread_self());
+ pthread_mutex_lock(&s_urc_register_mtx);
+ if (registered_urc_socket_fd <= 0) {
+ pthread_mutex_unlock(&s_urc_register_mtx);
+ return -1;
+ }
+ while(1)
+ {
+ memset(buffer, 0, 4);
+ ret = recvfrom(registered_urc_socket_fd, buffer, size,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ if (ret > 0 && LYNQ_URC_SERVER_LISTEN_PORT == ntohs(addr_serv.sin_port))
+ {
+ if (ret == 4 && LYNQ_URC_SERVER_LISTEN_PORT == *((int*)buffer))
+ {
+ sendto(registered_urc_socket_fd, ®istered_urc_socket_port, sizeof(registered_urc_socket_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));
+ printf("to send ack of headbeat\n");
+ continue;
+ }
+ }
+ else
+ {
+ printf("not a server packet\n");
+ continue;
+ }
+ break;
+ }
+ pthread_mutex_unlock(&s_urc_register_mtx);
+ printf("client %ul recv %d\n", pthread_self(), ret);
+ return ret;
+}
+
+static void *receive_client_heartbeat(void *parm)
+{
+ RLOGE("receive_at thread start\n");
+ int recv = 0;
+ char buffer[1024] = {0};
+ while(1)
+ {
+ RLOGE("receive third at cmd\n");
+
+ socklen_t len = sizeof(struct sockaddr_in);
+ struct sockaddr* cli = (struct sockaddr*)malloc(len);
+ bzero(cli, len);
+ printf("to recv now\n");
+ recv = recvfrom(lynq_urc_socket_fd, buffer, 1024, 0, cli, &len);
+ if(recv < 0)
+ {
+ RLOGE("recv fail\n");
+ printf("recv fail\n");
+ free(cli);
+ continue;
+ }
+ printf("recv a packet %d \n", recv);
+ struct sockaddr_in * register_socket = (struct sockaddr_in*)cli;
+
+ int port = ntohs(register_socket->sin_port);
+ if (recv == 4 && port == *((int*)buffer))
+ {
+ printf("port is %d\n", port);
+ pthread_mutex_lock(&s_urc_broadcast_mtx);
+ s_urc_broadcast_clients.push_back(cli);
+ pthread_mutex_unlock(&s_urc_broadcast_mtx);
+ RLOGE("recvfrom from client\n");
+ }
+ }
+ return NULL;
+}
+static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len)
+{
+ FILE *fp;
+ //printf("to exec cmd:%s\n", str_cmd);
+ if((fp=popen(str_cmd,"r"))==NULL)
+ {
+ perror("popen error!");
+ return -1;
+ }
+ if((fread(str_cmd_ret,max_len,1,fp))<0)
+ {
+ perror("fread fail!");
+ fclose(fp);
+ return -1;
+ }
+ fclose(fp);
+ return 0;
+}
+
+static int lynq_split(char * str, int len, char delimiter, char * results[]) {
+ int ret = 0;
+ char * end = str + len - 1;
+ results[ret++] = str;
+ while(str < end) {
+ if (*str == delimiter) {
+ *str++ = '\0';
+ results[ret++] = str;
+ continue;
+ }
+ str++;
+ }
+ if (*str == delimiter) {
+ *str = '\0';
+ }
+
+ return ret;
+}
+
+static void find_all_client_to_notify_online()
+{
+ char buffer[1024] = {0};
+ char * split_lines[128]= {0};
+ int count = 0;
+ int port, len;
+ int local_port = LYNQ_URC_SERVER_LISTEN_PORT;
+ printf("find_all_client_to_notify_online\n");
+ if (exec_cmd("netstat -an | grep -e \"127\\.0\\.0\\.1:70[5-9][0-9]\" | awk '{print $4}' | awk -F \":\" '{print $2}'", buffer, 1024) == 0)
+ {
+ count = lynq_split(buffer, 1024, '\n', split_lines);
+ for(int i=0; i < count;i++)
+ {
+ port = atoi(split_lines[i]);
+ printf("got %s port:%d\n", split_lines[i], port);
+ if (port < LYNQ_URC_CLIENT_PORT_START || port > LYNQ_URC_CLIENT_PORT_END)
+ continue;
+
+ struct sockaddr_in addr_serv;
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ addr_serv.sin_family =AF_INET;
+ addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_CLIENT_LISTEN_ADDRESS);
+ addr_serv.sin_port = htons(port);
+ len = sendto(lynq_urc_socket_fd, &local_port, sizeof(local_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));
+ printf("send result %d %d\n", len, errno);
+ }
+ }
+ else
+ {
+ printf("net stat fail\n");
+ }
+}
diff --git a/src/lynq/lib/liblynq-shm/makefile b/src/lynq/lib/liblynq-shm/makefile
index 806cc77..d49d358 100755
--- a/src/lynq/lib/liblynq-shm/makefile
+++ b/src/lynq/lib/liblynq-shm/makefile
@@ -20,8 +20,9 @@
-L. \
-ldl \
-llog \
-# -lbinder \
-lpthread \
+
+# -lbinder \
# -lutils \
# -lcutils \