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