blob: aa38f0d9c5a09d555dad93dfcf2294e317604cf6 [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;
72
73 LYINFLOG("urc recv thread is running");
74 while(data_urc_recive_status)
75 {
76 bzero(urc_data,LYNQ_REC_BUF);
77 res = recvfrom(lynq_urc_sockfd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&urc_local_addr,(socklen_t*)&lynq_len_urc_addr_serv);
78
79 if(res<sizeof(int32_t)*2)
80 {
81 LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
82 continue;
83 }
84
85 phead=(lynq_head_t*) urc_data;
86 if(is_support_urc(phead->urcid)==false)
87 {
88 continue;
89 }
90 urc_p = new Parcel();
91 if(urc_p == NULL)
92 {
93 LYERRLOG("new parcel failure!!!");
94 continue;
95 }
96 int level,index,size;
97 if(urc_data_is_in_shm_data(phead->resp_type,level,index,size))
98 {
99 urc_p->setData((uint8_t *)get_shem_buffer(level,index),size); // p.setData((uint8_t *) buffer, buflen);
100 }
101 else if(res>=sizeof(int32_t)*3)
102 {
103 urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
104 }
105 else
106 {
107 LYERRLOG("res %d error!!!", res);
108 delete urc_p;
109 urc_p = NULL;
110 continue;
111 }
112 urc_p->setDataPosition(0);
113 if(urc_p->dataAvail()>0)
114 {
115 pthread_mutex_lock(&s_lynq_urc_process_mutex);
116 s_urc_recv_parcel_list.push_back(urc_p);
117 pthread_cond_broadcast(&s_lynq_urc_process_cond);
118 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
119 }
120 else
121 {
122 delete urc_p;
123 urc_p = NULL;
124 }
125 }
126 LYINFLOG("urc recv thread ended");
127 return NULL;
128}
129
130void *thread_urc_process()
131{
132 Parcel *urc_p =NULL;
133 std::list<Parcel*>::iterator iter;
134
135 LYINFLOG("urc process thread is running");
136 pthread_cleanup_push(cleanup_urc_process_mutex, NULL); // thread cleanup handler
137 while (data_urc_process_status)
138 {
139 pthread_mutex_lock(&s_lynq_urc_process_mutex);
140 while(s_urc_recv_parcel_list.empty())
141 {
142 pthread_cond_wait(&s_lynq_urc_process_cond,&s_lynq_urc_process_mutex);
143 }
144 iter=s_urc_recv_parcel_list.begin();
145 urc_p = (*iter);
146 s_urc_recv_parcel_list.erase(iter);
147 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
148 urc_p->setDataPosition(0);
149 if(urc_p->dataAvail()>0)
150 {
151 pthread_mutex_lock(&s_lynq_urc_mutex);
152 urc_msg_process(urc_p);
153 pthread_mutex_unlock(&s_lynq_urc_mutex);
154 }
155 delete urc_p;
156 urc_p = NULL;
157 }
158 pthread_cleanup_pop(0);
159 LYINFLOG("urc process thread ended");
160 return NULL;
161}
162
163int lynq_socket_recv_start()
164{
165 int rt=0;
166 int on=1;
167 struct sockaddr_in urc_local_addr;
168 pthread_attr_t attr;
169 lynq_urc_sockfd = socket(AF_INET,SOCK_DGRAM,0);
170 if(lynq_urc_sockfd < 0)
171 {
172 perror("creaet socket for udp fail");
173 return -1;
174 }
175 urc_local_addr.sin_family = AF_INET;
176 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
177 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
178 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
179 rt = setsockopt(lynq_urc_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
180 if(rt<0)
181 {
182 perror("SO_REUSEADDR fail\n");
183 close(lynq_urc_sockfd);
184 lynq_urc_sockfd = -1;
185 return -1;
186 }
187 rt = bind(lynq_urc_sockfd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
188 if (rt == -1)
189 {
190 perror("bind failed");
191 close(lynq_urc_sockfd);
192 lynq_urc_sockfd = -1;
193 return -1;
194 }
195 return 0;
196}
197
198int lynq_socket_recv_stop()
199{
200 if (lynq_urc_sockfd >=0)
201 {
202 close(lynq_urc_sockfd);
203 lynq_urc_sockfd = -1;
204 }
205 return 0;
206}
207
208void lynq_urc_recv_thread_stop()
209{
210 int ret;
211
212 pthread_mutex_lock(&s_lynq_urc_process_mutex);
213 data_urc_recive_status = 0;
214 if (data_urc_recv_tid != -1)
215 {
216 ret = pthread_cancel(data_urc_recv_tid);
217 LYDBGLOG("pthread cancel ret = %d",ret);
218 }
219 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
220
221 if (data_urc_recv_tid != -1)
222 {
223 ret = pthread_join(data_urc_recv_tid,NULL);
224 LYDBGLOG("pthread join ret = %d",ret);
225 data_urc_recv_tid = -1;
226 }
227}
228
229void lynq_urc_process_thread_stop()
230{
231 int ret;
232
233 pthread_mutex_lock(&s_lynq_urc_process_mutex);
234 pthread_mutex_lock(&s_lynq_urc_mutex);
235
236 data_urc_process_status = 0;
237 if (data_urc_process_tid != -1)
238 {
239 ret = pthread_cancel(data_urc_process_tid);
240 LYDBGLOG("pthread cancel ret = %d",ret);
241 }
242 pthread_mutex_unlock(&s_lynq_urc_mutex);
243 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
244
245 if (data_urc_process_tid != -1)
246 {
247 ret = pthread_join(data_urc_process_tid,NULL);
248 LYDBGLOG("pthread join ret = %d",ret);
249 data_urc_process_tid = -1;
250 }
251}
252
253
254int lynq_init_data_urc_thread()
255{
256 int ret = 0;
257 if(ril_init_mem()!=0)
258 {
259 LYERRLOG("ril_init_mem fail");
260 return -1;
261 }
262
263 ret = lynq_socket_recv_start();
264 if (ret != 0)
265 {
266 LYERRLOG("lynq_socket_recv_start fail");
267 ril_deinit_mem();
268 return -1;
269 }
270
271 pthread_mutex_init(&s_lynq_urc_process_mutex,NULL);
272 pthread_mutex_init(&s_lynq_urc_recv_mutex,NULL);
273
274 pthread_mutex_lock(&s_lynq_urc_process_mutex);
275 std::list<Parcel*>::iterator iter;
276 for (iter=s_urc_recv_parcel_list.begin();iter!=s_urc_recv_parcel_list.end();++iter)
277 {
278 delete(*iter);
279 }
280 s_urc_recv_parcel_list.clear();
281 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
282
283 pthread_mutex_init(&s_lynq_urc_mutex,NULL);
284 data_urc_recive_status = 1;
285
286 ret = pthread_create(&data_urc_recv_tid,NULL,thread_urc_recv,NULL);
287 if (ret < 0)
288 {
289 LYERRLOG("urc recv pthread create error");
290 data_urc_recive_status = 0;
291 lynq_socket_recv_stop();
292 ril_deinit_mem();
293 return -1;
294 }
295
296 data_urc_process_status = 1;
297 ret = pthread_create(&data_urc_process_tid,NULL,thread_urc_process,NULL);
298 if (ret < 0)
299 {
300 LYERRLOG("urc recv pthread create error");
301
302 data_urc_process_status = 0;
303 lynq_socket_recv_stop();
304 lynq_urc_recv_thread_stop();
305
306 return -1;
307 }
308 return 0;
309}
310
311int lynq_deinit_data_urc_thread()
312{
313 lynq_socket_recv_stop();
314 lynq_urc_recv_thread_stop();
315 lynq_urc_process_thread_stop();
316
317 pthread_mutex_lock(&s_lynq_urc_process_mutex);
318 std::list<Parcel*>::iterator iter;
319 for (iter=s_urc_recv_parcel_list.begin();iter!=s_urc_recv_parcel_list.end();++iter)
320 {
321 delete(*iter);
322 }
323 s_urc_recv_parcel_list.clear();
324 pthread_mutex_unlock(&s_lynq_urc_process_mutex);
325
326 ril_deinit_mem();
327}