blob: f5d127a4693cbb86001878e2ae06f51492282cb4 [file] [log] [blame]
rjw7ee7bb42023-01-18 11:34:28 +08001#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <arpa/inet.h>
5#include <string.h>
6#include <unistd.h>
7#include <binder/Parcel.h>
8#include <log/log.h>
9#include <cutils/jstring.h>
10#include <pthread.h>
11#include <list>
12#include "lynq_data.h"
13#include "lynq_data_urc.h"
14#include "liblog/lynq_deflog.h"
15#include "lynq_shm.h"
16
17#define LYNQ_REC_BUF 8192
18
19static std::list<Parcel*> s_urc_recv_parcel_list;
20
21int lynq_len_urc_addr_serv;
22struct sockaddr_in urc_local_addr;
23static int lynq_urc_sockfd = -1;
24bool data_urc_recive_status = 1;
25static pthread_mutex_t s_lynq_urc_mutex = PTHREAD_MUTEX_INITIALIZER;
26static pthread_cond_t s_lynq_urc_cond = PTHREAD_COND_INITIALIZER;
27
28/*recv*/
29pthread_t data_urc_recv_tid = -1;
30static pthread_mutex_t s_lynq_urc_recv_mutex = PTHREAD_MUTEX_INITIALIZER;
31static pthread_cond_t s_lynq_urc_recv_cond = PTHREAD_COND_INITIALIZER;
32
33/*process*/
34pthread_t data_urc_process_tid = -1;
35bool data_urc_process_status = 1;
36static pthread_mutex_t s_lynq_urc_process_mutex = PTHREAD_MUTEX_INITIALIZER;
37static pthread_cond_t s_lynq_urc_process_cond = PTHREAD_COND_INITIALIZER;
38
39#define SHM_BUFFER_INDEX_OFFSET 1
40#define SHM_BUFFER_SIZE_OFFSET 16
41#define SHM_BUFFER_INDEX_MASK 0x0000007F
42#define SHM_BUFFER_SIZE_MASK 0x0000FFFF
43
44bool urc_data_is_in_shm_data(int responseType,int& level, int& index, int& size)
45{
46 int shm_index=((responseType>>SHM_BUFFER_INDEX_OFFSET)&SHM_BUFFER_INDEX_MASK);
47 if (shm_index>0)
48 {
49 index=shm_index-1;
50 size=((responseType>>SHM_BUFFER_SIZE_OFFSET)&SHM_BUFFER_SIZE_MASK);
51 if(size>=sizeof(int32_t)*3 && get_shem_buffer_level(size,&level))
52 {
53 LYINFLOG("urc_data_is_in_shm_data level is %d, index is %d size is %d",level,index,size);
54 return true;
55 }
56 }
57 LYINFLOG("urc_data_is_in_shm_data return false, responseType is %d",responseType);
58 return false;
59}
60
61void cleanup_urc_process_mutex(void *arg)
62{
63 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
64}
65
66void *thread_urc_recv()
67{
68 Parcel *urc_p =NULL;
69 char urc_data[LYNQ_REC_BUF];
70 int res = 0;
71 lynq_head_t* phead;
rjwd2fe0982023-02-15 15:02:00 +080072 int level,index,size;
73 uint8_t * shm_buffer;
74
rjw7ee7bb42023-01-18 11:34:28 +080075 LYINFLOG("urc recv thread is running");
76 while(data_urc_recive_status)
77 {
78 bzero(urc_data,LYNQ_REC_BUF);
lh0e551da2023-03-28 09:50:20 +080079 res = recvfrom(lynq_urc_sockfd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&urc_local_addr,(socklen_t*)&lynq_len_urc_addr_serv);
Hong_Liu6149f182023-05-12 02:15:14 -070080 LYINFLOG("[%s][%d] res:%d",__FUNCTION__,__LINE__,res);
rjw7ee7bb42023-01-18 11:34:28 +080081 if(res<sizeof(int32_t)*2)
82 {
83 LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
84 continue;
85 }
86
87 phead=(lynq_head_t*) urc_data;
88 if(is_support_urc(phead->urcid)==false)
89 {
90 continue;
91 }
92 urc_p = new Parcel();
93 if(urc_p == NULL)
94 {
95 LYERRLOG("new parcel failure!!!");
96 continue;
97 }
rjw7ee7bb42023-01-18 11:34:28 +080098 if(urc_data_is_in_shm_data(phead->resp_type,level,index,size))
99 {
rjwd2fe0982023-02-15 15:02:00 +0800100 shm_buffer = (uint8_t *)get_shem_buffer(level,index); // p.setData((uint8_t *) buffer, buflen);
101 LYINFLOG("shm pointer is %p", shm_buffer);
102 urc_p->setData(shm_buffer,size);
rjw7ee7bb42023-01-18 11:34:28 +0800103 }
104 else if(res>=sizeof(int32_t)*3)
105 {
106 urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
107 }
108 else
109 {
110 LYERRLOG("res %d error!!!", res);
111 delete urc_p;
112 urc_p = NULL;
113 continue;
114 }
115 urc_p->setDataPosition(0);
116 if(urc_p->dataAvail()>0)
117 {
118 pthread_mutex_lock(&s_lynq_urc_process_mutex);
119 s_urc_recv_parcel_list.push_back(urc_p);
120 pthread_cond_broadcast(&s_lynq_urc_process_cond);
121 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
122 }
123 else
124 {
125 delete urc_p;
126 urc_p = NULL;
127 }
128 }
129 LYINFLOG("urc recv thread ended");
130 return NULL;
131}
132
133void *thread_urc_process()
134{
135 Parcel *urc_p =NULL;
136 std::list<Parcel*>::iterator iter;
137
138 LYINFLOG("urc process thread is running");
139 pthread_cleanup_push(cleanup_urc_process_mutex, NULL); // thread cleanup handler
140 while (data_urc_process_status)
141 {
142 pthread_mutex_lock(&s_lynq_urc_process_mutex);
143 while(s_urc_recv_parcel_list.empty())
144 {
145 pthread_cond_wait(&s_lynq_urc_process_cond,&s_lynq_urc_process_mutex);
146 }
147 iter=s_urc_recv_parcel_list.begin();
148 urc_p = (*iter);
149 s_urc_recv_parcel_list.erase(iter);
150 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
151 urc_p->setDataPosition(0);
152 if(urc_p->dataAvail()>0)
153 {
154 pthread_mutex_lock(&s_lynq_urc_mutex);
155 urc_msg_process(urc_p);
156 pthread_mutex_unlock(&s_lynq_urc_mutex);
157 }
158 delete urc_p;
159 urc_p = NULL;
160 }
161 pthread_cleanup_pop(0);
162 LYINFLOG("urc process thread ended");
163 return NULL;
164}
165
166int lynq_socket_recv_start()
167{
lh0e551da2023-03-28 09:50:20 +0800168 int rt=0;
169 int on=1;
170 struct sockaddr_in urc_local_addr;
171 pthread_attr_t attr;
172 lynq_urc_sockfd = socket(AF_INET,SOCK_DGRAM,0);
Hong_Liu6149f182023-05-12 02:15:14 -0700173 lynq_len_urc_addr_serv = sizeof(urc_local_addr);
lh0e551da2023-03-28 09:50:20 +0800174 if(lynq_urc_sockfd < 0)
175 {
176 LYERRLOG("create socket for udp fail");
177 return -1;
178 }
179 urc_local_addr.sin_family = AF_INET;
180 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
181 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
182 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
183 rt = setsockopt(lynq_urc_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
184 if(rt<0)
185 {
186 LYERRLOG("SO_REUSEADDR fail");
187 close(lynq_urc_sockfd);
188 lynq_urc_sockfd = -1;
189 return -1;
190 }
191 rt = bind(lynq_urc_sockfd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
192 if (rt == -1)
193 {
194 LYERRLOG("bind failed");
195 close(lynq_urc_sockfd);
196 lynq_urc_sockfd = -1;
197 return -1;
198 }
199 return 0;
rjw7ee7bb42023-01-18 11:34:28 +0800200}
201
202int lynq_socket_recv_stop()
203{
204 if (lynq_urc_sockfd >=0)
205 {
206 close(lynq_urc_sockfd);
207 lynq_urc_sockfd = -1;
208 }
209 return 0;
210}
211
212void lynq_urc_recv_thread_stop()
213{
214 int ret;
215
216 pthread_mutex_lock(&s_lynq_urc_process_mutex);
217 data_urc_recive_status = 0;
218 if (data_urc_recv_tid != -1)
219 {
220 ret = pthread_cancel(data_urc_recv_tid);
221 LYDBGLOG("pthread cancel ret = %d",ret);
222 }
223 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
224
225 if (data_urc_recv_tid != -1)
226 {
227 ret = pthread_join(data_urc_recv_tid,NULL);
228 LYDBGLOG("pthread join ret = %d",ret);
229 data_urc_recv_tid = -1;
230 }
231}
232
233void lynq_urc_process_thread_stop()
234{
235 int ret;
236
237 pthread_mutex_lock(&s_lynq_urc_process_mutex);
238 pthread_mutex_lock(&s_lynq_urc_mutex);
239
240 data_urc_process_status = 0;
241 if (data_urc_process_tid != -1)
242 {
243 ret = pthread_cancel(data_urc_process_tid);
244 LYDBGLOG("pthread cancel ret = %d",ret);
245 }
246 pthread_mutex_unlock(&s_lynq_urc_mutex);
247 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
248
249 if (data_urc_process_tid != -1)
250 {
251 ret = pthread_join(data_urc_process_tid,NULL);
252 LYDBGLOG("pthread join ret = %d",ret);
253 data_urc_process_tid = -1;
254 }
255}
256
257
258int lynq_init_data_urc_thread()
259{
260 int ret = 0;
261 if(ril_init_mem()!=0)
262 {
263 LYERRLOG("ril_init_mem fail");
264 return -1;
265 }
266
267 ret = lynq_socket_recv_start();
268 if (ret != 0)
269 {
270 LYERRLOG("lynq_socket_recv_start fail");
271 ril_deinit_mem();
272 return -1;
273 }
274
275 pthread_mutex_init(&s_lynq_urc_process_mutex,NULL);
276 pthread_mutex_init(&s_lynq_urc_recv_mutex,NULL);
277
278 pthread_mutex_lock(&s_lynq_urc_process_mutex);
279 std::list<Parcel*>::iterator iter;
280 for (iter=s_urc_recv_parcel_list.begin();iter!=s_urc_recv_parcel_list.end();++iter)
281 {
282 delete(*iter);
283 }
284 s_urc_recv_parcel_list.clear();
285 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
286
287 pthread_mutex_init(&s_lynq_urc_mutex,NULL);
288 data_urc_recive_status = 1;
289
290 ret = pthread_create(&data_urc_recv_tid,NULL,thread_urc_recv,NULL);
291 if (ret < 0)
292 {
293 LYERRLOG("urc recv pthread create error");
294 data_urc_recive_status = 0;
295 lynq_socket_recv_stop();
296 ril_deinit_mem();
297 return -1;
298 }
299
300 data_urc_process_status = 1;
301 ret = pthread_create(&data_urc_process_tid,NULL,thread_urc_process,NULL);
302 if (ret < 0)
303 {
304 LYERRLOG("urc recv pthread create error");
305
306 data_urc_process_status = 0;
307 lynq_socket_recv_stop();
308 lynq_urc_recv_thread_stop();
309
310 return -1;
311 }
312 return 0;
313}
314
315int lynq_deinit_data_urc_thread()
316{
317 lynq_socket_recv_stop();
318 lynq_urc_recv_thread_stop();
319 lynq_urc_process_thread_stop();
320
321 pthread_mutex_lock(&s_lynq_urc_process_mutex);
322 std::list<Parcel*>::iterator iter;
323 for (iter=s_urc_recv_parcel_list.begin();iter!=s_urc_recv_parcel_list.end();++iter)
324 {
325 delete(*iter);
326 }
327 s_urc_recv_parcel_list.clear();
328 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
329
330 ril_deinit_mem();
rjweb65a2f2023-02-01 16:43:23 +0800331 return 0;
332}