blob: a42bfc251c2ca446f2707137233c3247d4dd0c33 [file] [log] [blame]
xf.li6c8fc1e2023-08-12 00:11:09 -07001/*******************************************************************************
2 * Include header files *
3 ******************************************************************************/
4#include <linux/module.h>
5#include <net/sock.h>
6#include <net/af_unix.h>
7#include <linux/syscalls.h>
8#include <linux/file.h>
xf.liaa4d92f2023-09-13 00:18:58 -07009#include <linux/debugfs.h>
10#include <linux/seq_file.h>
xf.li6c8fc1e2023-08-12 00:11:09 -070011//#include "ram_config.h"
12#include <linux/socket_rpmsg.h>
13
14#define SOCK_DATA_ALIGN(X) ALIGN(X, SMP_CACHE_BYTES)
15#define SOCK_DATA_MAX_LEN 8*1024
16#define ICP_CHN_SOCKET 32
17#define sock_init_sema sema_init
18#define sock_get_sema down_interruptible
19#define sock_put_sema up
20
xf.liaa4d92f2023-09-13 00:18:58 -070021extern int socket_rpmsg_enable;
22
xf.li6c8fc1e2023-08-12 00:11:09 -070023struct sock_channel g_sock_chn_info;
24struct sock_rpmsg g_sock_rpmsg;
25struct ipc_socket *g_socket_ipc;
26
27struct semaphore g_sock_sem;
28unsigned int g_sock_timeout = 5*1000;
29//´æ·ÅÁ´Â·ÐÅÏ¢£¬Ò»¶Ësocket¹Ø±Õ£¬ÆäËùÓйØÁªµÄsocket¾ùɾ³ý£¬Á´Â·ÐÅÏ¢Öдæ·Å5Ôª×飨¿Í»§¶Ë¡¢·þÎñ¶Ë¡¢ºÍ´úÀí£©
30struct hlist_head g_ipc_sockets;
31struct hlist_head g_sock_rpmsg_info;
32struct hlist_head g_sockets_info;
xf.liaa4d92f2023-09-13 00:18:58 -070033struct hlist_head g_sunaddr_info;
xf.li6c8fc1e2023-08-12 00:11:09 -070034char* flag_value[] ={
35 "SOCK_DEAD",
36 "SOCK_DONE",
37 "SOCK_URGINLINE",
38 "SOCK_KEEPOPEN",
39 "SOCK_LINGER",
40 "SOCK_DESTROY",
41 "SOCK_BROADCAST",
42 "SOCK_TIMESTAMP",
43 "SOCK_ZAPPED",
44 "SOCK_USE_WRITE_QUEUE", /* whether to call sk->sk_write_space in sock_wfree */
45 "SOCK_DBG", /* %SO_DEBUG setting */
46 "SOCK_RCVTSTAMP", /* %SO_TIMESTAMP setting */
47 "SOCK_RCVTSTAMPNS", /* %SO_TIMESTAMPNS setting */
48 "SOCK_LOCALROUTE", /* route locally only, %SO_DONTROUTE setting */
49 "SOCK_QUEUE_SHRUNK", /* write queue has been shrunk recently */
50 "SOCK_TIMESTAMPING_TX_HARDWARE", /* %SOF_TIMESTAMPING_TX_HARDWARE */
51 "SOCK_TIMESTAMPING_TX_SOFTWARE", /* %SOF_TIMESTAMPING_TX_SOFTWARE */
52 "SOCK_TIMESTAMPING_RX_HARDWARE", /* %SOF_TIMESTAMPING_RX_HARDWARE */
53 "SOCK_TIMESTAMPING_RX_SOFTWARE", /* %SOF_TIMESTAMPING_RX_SOFTWARE */
54 "SOCK_TIMESTAMPING_SOFTWARE", /* %SOF_TIMESTAMPING_SOFTWARE */
55 "SOCK_TIMESTAMPING_RAW_HARDWARE", /* %SOF_TIMESTAMPING_RAW_HARDWARE */
56 "SOCK_TIMESTAMPING_SYS_HARDWARE", /* %SOF_TIMESTAMPING_SYS_HARDWARE */
57 "SOCK_FASYNC", /* fasync() active */
58 "SOCK_RXQ_OVFL",
59 "SOCK_ZEROCOPY", /* buffers from userspace */
60 "SOCK_WIFI_STATUS", /* push wifi status to userspace */
61 "SOCK_NOFCS",
62 "SOCK_IPCSOCK"
63};
64
65DEFINE_SPINLOCK(sock_table_lock);
66EXPORT_SYMBOL_GPL(sock_table_lock);
67
68DEFINE_SPINLOCK(sock_rpmsg_table_lock);
69EXPORT_SYMBOL_GPL(sock_rpmsg_table_lock);
70
71DEFINE_SPINLOCK(sock_socket_table_lock);
72EXPORT_SYMBOL_GPL(sock_socket_table_lock);
73
74DEFINE_SPINLOCK(sock_release_table_lock);
75EXPORT_SYMBOL_GPL(sock_release_table_lock);
76
77DEFINE_SPINLOCK(sock_release_lock);
78EXPORT_SYMBOL_GPL(sock_release_lock);
79
80DEFINE_SPINLOCK(sock_release_peer_lock);
81EXPORT_SYMBOL_GPL(sock_release_peer_lock);
82
xf.liaa4d92f2023-09-13 00:18:58 -070083static struct dentry *ipcsocket_debugfs_dir_entry_root;
84static struct dentry *ipcsocket_debugfs_dir_entry_proc;
85
xf.li6c8fc1e2023-08-12 00:11:09 -070086#define unix_peer(sk) (unix_sk(sk)->peer)
87
88extern struct sock *unix_find_other_proxy(struct net *net,
89 struct sockaddr_un *sunname, int len,
90 int type, unsigned int hash, int *error);
91
92extern int unix_dgram_peer_wake_connect_proxy(struct sock *sk, struct sock *other);
93
94extern void unix_dgram_peer_wake_disconnect_proxy(struct sock *sk, struct sock *other);
95
96extern void unix_dgram_peer_wake_disconnect_wakeup_proxy(struct sock *sk,
97 struct sock *other);
98extern long unix_wait_for_peer_proxy(struct sock *other, long timeo);
99extern int unix_recvq_full_proxy(const struct sock *sk);
100extern int unix_recvq_full_proxy_lockless_and_deadstate(const struct sock *other);
101extern int unix_stream_connect_proxy(struct socket *sock, struct sockaddr *uaddr,
102 int addr_len, int flags);
103extern void unix_dgram_disconnected_proxy(struct sock *sk, struct sock *other);
104extern int unix_mkname_proxy(struct sockaddr_un *sunaddr, int len, unsigned *hashp);
105extern void unix_release_sock_proxy(struct sock *sk);
xf.liaa4d92f2023-09-13 00:18:58 -0700106extern void init_peercred_proxy(struct sock *sk);
xf.li6c8fc1e2023-08-12 00:11:09 -0700107
108//static void delayed_release(struct work_struct *unused);
109int sock_soc_socket_is_valid(struct socket* proxysock, struct socket* localsock);
110int sock_soc_release_peer(struct release_socket* rsock);
111
112static LIST_HEAD(delayed_release_list);
113
xf.liaa4d92f2023-09-13 00:18:58 -0700114#define DEFINE_SHOW_ATTRIBUTE(__name) \
115static int __name##_open(struct inode *inode, struct file *file) \
116{ \
117 return single_open(file, __name##_show, inode->i_private); \
118} \
119 \
120static const struct file_operations __name##_fops = { \
121 .owner = THIS_MODULE, \
122 .open = __name##_open, \
123 .read = seq_read, \
124 .llseek = seq_lseek, \
125 .release = single_release, \
126}
127
128static int ipc_socket_info_show(struct seq_file *m, void *unused);
129DEFINE_SHOW_ATTRIBUTE(ipc_socket_info);
130
xf.li6c8fc1e2023-08-12 00:11:09 -0700131enum sock_flags_cap {
132 SOCK_DEAD_CAP,
133 SOCK_DONE_CAP,
134 SOCK_URGINLINE_CAP,
135 SOCK_KEEPOPEN_CAP,
136 SOCK_LINGER_CAP,
137 SOCK_DESTROY_CAP,
138 SOCK_BROADCAST_CAP,
139 SOCK_TIMESTAMP_CAP,
140 SOCK_ZAPPED_CAP,
141 SOCK_USE_WRITE_QUEUE_CAP, /* whether to call sk->sk_write_space in sock_wfree */
142 SOCK_DBG_CAP, /* %SO_DEBUG setting */
143 SOCK_RCVTSTAMP_CAP, /* %SO_TIMESTAMP setting */
144 SOCK_RCVTSTAMPNS_CAP, /* %SO_TIMESTAMPNS setting */
145 SOCK_LOCALROUTE_CAP, /* route locally only, %SO_DONTROUTE setting */
146 SOCK_MEMALLOC_CAP, /* VM depends on this socket for swapping */
147 SOCK_TIMESTAMPING_RX_SOFTWARE_CAP, /* %SOF_TIMESTAMPING_RX_SOFTWARE */
148 SOCK_FASYNC_CAP, /* fasync() active */
149 SOCK_RXQ_OVFL_CAP,
150 SOCK_ZEROCOPY_CAP, /* buffers from userspace */
151 SOCK_WIFI_STATUS_CAP, /* push wifi status to userspace */
152 SOCK_NOFCS_CAP, /* Tell NIC not to do the Ethernet FCS.
153 * Will use last 4 bytes of packet sent from
154 * user-space instead.
155 */
156 SOCK_FILTER_LOCKED_CAP, /* Filter cannot be changed anymore */
157 SOCK_SELECT_ERR_QUEUE_CAP, /* Wake select on error queue */
158 SOCK_RCU_FREE_CAP, /* wait rcu grace period in sk_destruct() */
159 SOCK_TXTIME_CAP,
160 SOCK_XDP_CAP, /* XDP is attached */
161 SOCK_TSTAMP_NEW_CAP, /* Indicates 64 bit timestamps always */
162
163 SOCK_IPCSOCK_CAP, /*Indicates whether it is a cross core socket */
164
165};
166
167
168enum sock_flags_cap convert_to_cap_sock_flag(enum sock_flags flag)
169{
170 switch(flag){
171 case SOCK_DEAD:
172 return SOCK_DEAD_CAP;
173 case SOCK_DONE:
174 return SOCK_DONE_CAP;
175 case SOCK_URGINLINE:
176 return SOCK_URGINLINE_CAP;
177 case SOCK_KEEPOPEN:
178 return SOCK_KEEPOPEN_CAP;
179 case SOCK_LINGER:
180 return SOCK_LINGER_CAP;
181 case SOCK_DESTROY:
182 return SOCK_DESTROY_CAP;
183 case SOCK_BROADCAST:
184 return SOCK_BROADCAST_CAP;
185 case SOCK_TIMESTAMP:
186 return SOCK_TIMESTAMP_CAP;
187 case SOCK_ZAPPED:
188 return SOCK_ZAPPED_CAP;
189 case SOCK_USE_WRITE_QUEUE:
190 return SOCK_USE_WRITE_QUEUE_CAP;
191 case SOCK_DBG:
192 return SOCK_DBG_CAP;
193 case SOCK_RCVTSTAMP:
194 return SOCK_RCVTSTAMP_CAP;
195 case SOCK_RCVTSTAMPNS:
196 return SOCK_RCVTSTAMPNS_CAP;
197 case SOCK_LOCALROUTE:
198 return SOCK_LOCALROUTE_CAP;
199 case SOCK_QUEUE_SHRUNK:
200 return -1;
201 case SOCK_TIMESTAMPING_TX_HARDWARE:
202 return -1;
203 case SOCK_TIMESTAMPING_TX_SOFTWARE:
204 return -1;
205 case SOCK_TIMESTAMPING_RX_HARDWARE:
206 return -1;
207 case SOCK_TIMESTAMPING_RX_SOFTWARE:
208 return SOCK_TIMESTAMPING_RX_SOFTWARE_CAP;
209 case SOCK_TIMESTAMPING_SOFTWARE:
210 return -1;
211 case SOCK_TIMESTAMPING_RAW_HARDWARE:
212 return -1;
213 case SOCK_TIMESTAMPING_SYS_HARDWARE:
214 return -1;
215 case SOCK_FASYNC:
216 return SOCK_FASYNC_CAP;
217 case SOCK_RXQ_OVFL:
218 return SOCK_RXQ_OVFL_CAP;
219 case SOCK_ZEROCOPY:
220 return SOCK_ZEROCOPY_CAP;
221 case SOCK_WIFI_STATUS:
222 return SOCK_WIFI_STATUS_CAP;
223 case SOCK_NOFCS:
224 return SOCK_NOFCS_CAP;
225 default:
226 return -1;
227 }
228}
229
xf.liaa4d92f2023-09-13 00:18:58 -0700230static int ipc_socket_info_show(struct seq_file *m, void *unused)
231{
232 struct task_struct *task = NULL;
233 char taskname[TASK_COMM_LEN] = {0};
234 struct ipc_socket *p;
235 struct hlist_node *pos,*n;
236 struct socket* localsocket;
237
238 spin_lock(&sock_table_lock);
239 if(hlist_empty(&g_ipc_sockets))
240 {
241 sk_soc_warn("sock_print_ipc_socket_info g_ipc_sockets is empty");
242 spin_unlock(&sock_table_lock);
243 return 0;
244 }
245 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
246 memset(taskname, 0, TASK_COMM_LEN);
247 localsocket = p->localsocket;
248 task = localsocket->task;
249 get_task_comm(taskname, task);
250 sk_soc_warn("pid=%d, taskname=%s", task->pid, taskname);
251 }
252 spin_unlock(&sock_table_lock);
253 return 0;
254}
255
xf.li6c8fc1e2023-08-12 00:11:09 -0700256static int sock_soc_is_socket_peer(struct socket* socket, struct socket* peer)
257{
258 struct socket_info *p;
259 struct hlist_node *n, *pos;
260 spin_lock(&sock_release_peer_lock);
261 hlist_for_each_entry_safe(p, pos, n, &socket->peer, hlist_node) {
262 if(p->proxysocket == peer){
263 spin_unlock(&sock_release_peer_lock);
264 return 0;
265 }
266 }
267 spin_unlock(&sock_release_peer_lock);
268 return -1;
269}
270
271static inline void sock_soc_insert_socket_peer(struct socket* socket, struct socket* peer)
272{
273 struct socket_info *psock_socket_info = NULL;
274
275 //ÏȲ鿴peerÊÇ·ñÒѾ­ÔÚsocketµÄpeer_listÖÐ
276 if(0 == sock_soc_is_socket_peer(socket, peer)){
277 sk_soc_info("sock_soc_insert_socket_peer, peer already exist");
278 return;
279 }
280 psock_socket_info = (struct socket_info *)kzalloc(sizeof(struct socket_info), GFP_ATOMIC);
281 if(psock_socket_info == NULL){
282 return;
283 }
284 memset(psock_socket_info, 0, sizeof(struct socket_info));
285 psock_socket_info->proxysocket = peer;
286 psock_socket_info->localsocket = socket;
287
288 sk_soc_info("sock_soc_insert_socket_peer sucess, proxysocket=%x, localsock=%x", psock_socket_info->proxysocket, psock_socket_info->localsocket);
289
290 spin_lock(&sock_release_peer_lock);
291 INIT_HLIST_NODE(&psock_socket_info->hlist_node);
292 hlist_add_head(&psock_socket_info->hlist_node, &socket->peer);
293 spin_unlock(&sock_release_peer_lock);
294}
295
296static int sock_soc_del_socket_peer(struct socket* socket, struct socket* peer)
297{
298 struct socket_info *p;
299 struct hlist_node *n, *pos;
300 spin_lock(&sock_release_peer_lock);
301 hlist_for_each_entry_safe(p, pos, n, &socket->peer, hlist_node) {
302 if(p->proxysocket == peer){
303 hlist_del(&p->hlist_node);
304 spin_unlock(&sock_release_peer_lock);
305 kfree(p);
306 return 0;
307 }
308 }
309 spin_unlock(&sock_release_peer_lock);
310 return -1;
311}
312
313static inline void sock_soc_insert_socket(struct hlist_node *list_node)
314{
315 spin_lock(&sock_table_lock);
316 hlist_add_head(list_node, &g_ipc_sockets);
317 spin_unlock(&sock_table_lock);
318}
319
320//ÓÃÓÚÅжϱ¾µØsocketÊÇ·ñÔÚipcÁбíÖУ¬¿ÉÄÜ´æÔÚ¶àÌõ¼Ç¼
321static struct ipc_socket *sock_soc_get_ipcsocket_by_localsocket(struct socket *localsocket)
322{
323 struct ipc_socket *p;
324 struct hlist_node *pos,*n;
325 spin_lock(&sock_table_lock);
326 if(hlist_empty(&g_ipc_sockets))
327 {
328 sk_soc_info("sock_soc_get_ipcsocket_by_proxysock g_ipc_sockets is empty");
329 spin_unlock(&sock_table_lock);
330 return NULL;
331 }
332 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
333 if(p->localsocket == localsocket){
334 spin_unlock(&sock_table_lock);
335 return p;
336 }
337 }
338 spin_unlock(&sock_table_lock);
339 return NULL;
340}
341
342//´Ë´¦µÄsockΪ´úÀísocket¶ÔÓ¦µÄsock£¬ÒòΪÿ¸ö´úÀísocketÔÚg_ipc_sockets±íÖÐÊÇΨһµÄ
343static struct ipc_socket *sock_soc_get_ipcsocket_by_proxysock(struct sock *s)
344{
345 struct ipc_socket *p;
346 struct hlist_node *pos,*n;
347 spin_lock(&sock_table_lock);
348 if(hlist_empty(&g_ipc_sockets))
349 {
350 sk_soc_info("sock_soc_get_ipcsocket_by_proxysock g_ipc_sockets is empty");
351 spin_unlock(&sock_table_lock);
352 return NULL;
353 }
354 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
355 if(p->sock == s){
356 spin_unlock(&sock_table_lock);
357 return p;
358 }
359 }
360 spin_unlock(&sock_table_lock);
361 return NULL;
362}
363
364//¸ù¾Ý¿Í»§¶ËsocketºÍ·þÎñ¶Ësocket²éÕÒ¶ÔÓ¦µÄipc_socket
365static struct ipc_socket *sock_get_ipcsocket_by_local_and_remote(void* localsock, void* remotesock)
366{
367 struct ipc_socket *p;
368 struct hlist_node *pos,*n;
369 spin_lock(&sock_table_lock);
370 if(hlist_empty(&g_ipc_sockets))
371 {
372 sk_soc_info("sock_get_ipcsocket_by_local_and_remote g_ipc_sockets is empty");
373 spin_unlock(&sock_table_lock);
374 return NULL;
375 }
376 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
377 if((p->localsocket == localsock)&&(p->remotesocket == remotesock)){
378 spin_unlock(&sock_table_lock);
379 return p;
380 }
381 }
382 spin_unlock(&sock_table_lock);
383 return NULL;
384}
385
386int sock_del_ipc_socket_by_proxysocket(struct socket* socket)
387{
388 struct ipc_socket *p;
389 struct hlist_node *pos, *n;
390 spin_lock(&sock_table_lock);
391 if(hlist_empty(&g_ipc_sockets))
392 {
393 sk_soc_info("sock_del_ipc_socket_by_proxysocket g_ipc_sockets is empty");
394 spin_unlock(&sock_table_lock);
395 return -1;
396 }
397 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
398 if(p->socket == socket){
399 hlist_del(&p->hlist_node);
400 spin_unlock(&sock_table_lock);
401 kfree(p);
402 return 0;
403 }
404 }
405 spin_unlock(&sock_table_lock);
406 return -1;
407}
408
409//ĿǰÏȸù¾Ý¿Í»§¶Ësocket¡¢±¾¶Ë´úÀísocketºÍ·þÎñ¶Ësocket½øÐÐÆ¥Åä
410int sock_is_valide_ipc_socket(struct socket* localsocket, struct socket* proxysocket, struct socket* remotesocket/*, struct socket* remoteproxysocket*/)
411{
412 struct ipc_socket *p;
413 struct hlist_node *pos, *n;
414 spin_lock(&sock_table_lock);
415 if(hlist_empty(&g_ipc_sockets))
416 {
417 sk_soc_info("sock_is_valide_ipc_socket g_ipc_sockets is empty");
418 spin_unlock(&sock_table_lock);
419 return -1;
420 }
421 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
422 if((p->localsocket == localsocket)&&(p->proxysocket == proxysocket)&&(p->remotesocket == remotesocket)/*&&(p->remoteproxysocket == remoteproxysocket)*/){
423
424 spin_unlock(&sock_table_lock);
425
426 return 0;
427 }
428 }
429 spin_unlock(&sock_table_lock);
430 sk_soc_info("sock_is_valide_ipc_socket failed, localsocket=%x, proxysocket=%x, remotesocket=%x", localsocket, proxysocket, remotesocket);
431 return -1;
432}
433
434struct socket *sock_get_local_socket(int fd, int *err)
435{
436 struct socket* sock;
437 sock = sockfd_lookup(fd, err);
438 if(NULL == sock){
439 return NULL;
440 }
441 sockfd_put(sock);
442 sk_soc_info("sock_get_local_socket fd=%d, file->f_count=%d ", fd, sock->file->f_count);
443 return sock;
444}
445
446static inline void sock_soc_insert_rpmsg_info(struct hlist_node *list_node)
447{
448 spin_lock(&sock_rpmsg_table_lock);
449 hlist_add_head(list_node, &g_sock_rpmsg_info);
450 spin_unlock(&sock_rpmsg_table_lock);
451}
452
453struct sock_rpmsg_info * sock_soc_create_rpmsg_info(void* key)
454{
455 struct sock_rpmsg_info *psock_sock_rpmsg_info = NULL;
456
457 psock_sock_rpmsg_info = (struct sock_rpmsg_info *)kzalloc(sizeof(struct sock_rpmsg_info), GFP_ATOMIC);
458 if(psock_sock_rpmsg_info == NULL){
459 sk_soc_info("sock_soc_create_rpmsg_info kzalloc failed \n");
460 return NULL;
461 }
462 memset(psock_sock_rpmsg_info, 0, sizeof(struct sock_rpmsg_info));
463 psock_sock_rpmsg_info->key = key;
464 sema_init(&psock_sock_rpmsg_info->sock_sem, 0);
465 sk_soc_info("sock_soc_create_rpmsg_info sucess, key=%x", key);
466 sock_soc_insert_rpmsg_info(&psock_sock_rpmsg_info->hlist_node);
467 return psock_sock_rpmsg_info;
468}
469
470struct sock_rpmsg_info * sock_soc_get_rpmsg_info(void* key)
471{
472 struct sock_rpmsg_info *p;
473 struct hlist_node *pos,*n;
474 //sk_soc_info("sock_soc_get_rpmsg_info key=%x \n", key);
475 spin_lock(&sock_rpmsg_table_lock);
476 hlist_for_each_entry_safe(p, pos, n, &g_sock_rpmsg_info, hlist_node) {
477 if(p->key == key){
478 spin_unlock(&sock_rpmsg_table_lock);
479 return p;
480 }
481 }
482 spin_unlock(&sock_rpmsg_table_lock);
483 return NULL;
484}
485
486struct sock_rpmsg_info * sock_soc_del_rpmsg_info(void* key)
487{
488 struct sock_rpmsg_info *p;
489 struct hlist_node *pos,*n;
490 //sk_soc_info("sock_soc_del_rpmsg_info key=%x \n", key);
491 spin_lock(&sock_rpmsg_table_lock);
492 hlist_for_each_entry_safe(p, pos, n, &g_sock_rpmsg_info, hlist_node) {
493 if(p->key == key){
494 hlist_del(&p->hlist_node);
495 spin_unlock(&sock_rpmsg_table_lock);
496 sk_soc_info("sock_soc_del_rpmsg_info sucess, key=%x \n", key);
497 kfree(p);
498 return 0;
499 }
500 }
501 spin_unlock(&sock_rpmsg_table_lock);
502 sk_soc_info("sock_soc_del_rpmsg_info failed, key=%x \n", key);
503 return -1;
504}
505
506static inline void sock_soc_insert_socket_info(struct hlist_node *list_node)
507{
508 spin_lock(&sock_socket_table_lock);
509 hlist_add_head(list_node, &g_sockets_info);
510 spin_unlock(&sock_socket_table_lock);
511}
512
513struct socket_info * sock_soc_set_socket_info(struct socket* proxysock, struct socket* localsock)
514{
515 struct socket_info *psock_socket_info = NULL;
516
517 if(0 == sock_soc_socket_is_valid(proxysock, localsock)){
518 sk_soc_info("sock_soc_socket_is_valid is true , do not add again");
519 return NULL;
520 }
521 psock_socket_info = (struct socket_info *)kzalloc(sizeof(struct socket_info), GFP_ATOMIC);
522 if(psock_socket_info == NULL){
523 return NULL;
524 }
525 memset(psock_socket_info, 0, sizeof(struct socket_info));
526 psock_socket_info->proxysocket = proxysock;
527 psock_socket_info->localsocket = localsock;
528 //sk_soc_info("sock_soc_set_socket_info sucess, key=%x", sock);
529 sock_soc_insert_socket_info(&psock_socket_info->hlist_node);
530 sk_soc_info("sock_soc_set_socket_info sucess, proxysocket=%x, localsock=%x", psock_socket_info->proxysocket, psock_socket_info->localsocket);
531 return psock_socket_info;
532}
533
534int sock_soc_socket_is_valid(struct socket* proxysock, struct socket* localsock)
535{
536 struct ipc_socket *p;
537 struct hlist_node *pos,*n;
538 spin_lock(&sock_table_lock);
539 if(hlist_empty(&g_ipc_sockets))
540 {
541 sk_soc_info("sock_soc_socket_is_valid g_ipc_sockets is empty");
542 spin_unlock(&sock_table_lock);
543 return -1;
544 }
545 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
546 if((p->proxysocket == proxysock)&&(p->localsocket == localsock)){
547 spin_unlock(&sock_table_lock);
548 return 0;
549 }
550 }
551 spin_unlock(&sock_table_lock);
552 return -1;
553}
554
555int sock_soc_del_socket_info(struct socket* proxysock, struct socket* localsock)
556{
557 struct ipc_socket *p;
558 struct hlist_node *pos,*n;
559 //sk_soc_info("sock_soc_del_socket_info key=%x \n", sock);
560 spin_lock(&sock_table_lock);
561 if(hlist_empty(&g_ipc_sockets))
562 {
563 sk_soc_info("sock_soc_del_socket_info g_ipc_sockets is empty");
564 spin_unlock(&sock_table_lock);
565 return -1;
566 }
567 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
568 if((p->proxysocket == proxysock)&&(p->localsocket == localsock)){
569 hlist_del(&p->hlist_node);
570 spin_unlock(&sock_table_lock);
571 sk_soc_info("sock_soc_del_socket_info sucess, proxysock=%x, localsock=%x \n", proxysock, localsock);
572 kfree(p);
573 return 0;
574 }
575 }
576 spin_unlock(&sock_table_lock);
577 sk_soc_info("sock_soc_del_socket_info failed, proxysock=%x,localsock=%x \n", proxysock, localsock);
578 return -1;
579}
580
581int sock_soc_socket_is_valid_other(struct socket* other)
582{
583 return 0;
584}
585
586int sock_soc_socket_is_valid_ipc(struct socket* localsocket, struct socket* remotesocket)
587{
588 struct ipc_socket *p;
589 struct hlist_node *pos,*n;
590 spin_lock(&sock_table_lock);
591 if(hlist_empty(&g_ipc_sockets))
592 {
593 sk_soc_info("sock_soc_socket_is_valid_ipc g_ipc_sockets is empty");
594 spin_unlock(&sock_table_lock);
595 return -1;
596 }
597 hlist_for_each_entry_safe(p, pos, n, &g_ipc_sockets, hlist_node) {
598 if((p->localsocket == localsocket)&&(p->remotesocket == remotesocket)){
599 spin_unlock(&sock_table_lock);
600 return 0;
601 }
602 }
603 spin_unlock(&sock_table_lock);
604 return -1;
605}
606
607struct sock_rpmsg_info * sock_soc_rsp_proc(struct sock_rpmsg* psock_rpmsg)
608{
609 struct sock_rpmsg_info *psock_rpmsg_info;
610 psock_rpmsg_info = sock_soc_get_rpmsg_info(psock_rpmsg->key);
611 if(NULL == psock_rpmsg_info){
612 sk_soc_err("sock_soc_get_rpmsg_info failed!");
613 return NULL;
614 }
615 memset(&psock_rpmsg_info->sock_rpmsg, 0, sizeof(struct sock_rpmsg));
616 memcpy(&psock_rpmsg_info->sock_rpmsg, psock_rpmsg, sizeof(struct sock_rpmsg));
617 up(&psock_rpmsg_info->sock_sem);
618 return psock_rpmsg_info;
619}
xf.liaa4d92f2023-09-13 00:18:58 -0700620
621bool sock_soc_ipc_sunaddr_exist(struct sockaddr_un *psockaddr_un)
622{
623 struct sock_sunaddr_info *p;
624 struct hlist_node *pos,*n;
625
626 hlist_for_each_entry_safe(p, pos, n, &g_sunaddr_info, hlist_node) {
627 if((p->sockaddr.sun_family == psockaddr_un->sun_family) \
628 &&(0 == memcmp(p->sockaddr.sun_path, psockaddr_un->sun_path, UNIX_PATH_MAX))){
629
630 return true;
631 }
632 }
633
634 return false;
635}
636
637static void sock_soc_insert_ipc_sunaddr(struct sockaddr_un *psockaddr_un)
638{
639 struct sock_sunaddr_info *psock_sunaddr_info = NULL;
640
641 //ÏȲ鿴sunaddrÊÇ·ñÒѾ­ÔÚg_sunaddr_infoÖÐ
642 if(true == sock_soc_ipc_sunaddr_exist(psockaddr_un)){
643 sk_soc_info("sock_soc_insert_ipc_sunaddr, sunaddr already exist");
644 return;
645 }
646
647 psock_sunaddr_info = (struct sock_sunaddr_info *)kzalloc(sizeof(struct sock_sunaddr_info), GFP_ATOMIC);
648 if(psock_sunaddr_info == NULL){
649 sk_soc_info("sock_soc_insert_ipc_sunaddr, alloc failed");
650 return;
651 }
652 memset(psock_sunaddr_info, 0, sizeof(struct sock_sunaddr_info));
653 memcpy(&psock_sunaddr_info->sockaddr, psockaddr_un, sizeof(struct sockaddr_un));
654
655 INIT_HLIST_NODE(&psock_sunaddr_info->hlist_node);
656 hlist_add_head(&psock_sunaddr_info->hlist_node, &g_sunaddr_info);
657}
658
659static int sock_soc_del_ipc_sunaddr(struct sockaddr_un *psockaddr_un)
660{
661 struct sock_sunaddr_info *p;
662 struct hlist_node *pos,*n;
663 int ret;
664 hlist_for_each_entry_safe(p, pos, n, &g_sunaddr_info, hlist_node) {
665 if(psockaddr_un->sun_path[0]){
666 ret = strncmp(p->sockaddr.sun_path, psockaddr_un->sun_path, strlen(psockaddr_un->sun_path));
667 }else{
668 ret = strncmp(&p->sockaddr.sun_path[1], &psockaddr_un->sun_path[1], strlen(&psockaddr_un->sun_path[1]));
669 }
670
671 if((p->sockaddr.sun_family == psockaddr_un->sun_family) && (0 == ret)){
672 hlist_del(&p->hlist_node);
673 kfree(p);
674 sk_soc_info("sun_path=%s, del sucess.", psockaddr_un->sun_path);
675 return 0;
676 }
677 }
678 sk_soc_info("sun_path=%s, del failed", psockaddr_un->sun_path);
679 return -1;
680}
681
xf.li6c8fc1e2023-08-12 00:11:09 -0700682int unix_is_ipc_socket(struct sock *sock)
683{
684 int result;
685 result = test_bit(SOCK_IPCSOCK, &sock->sk_flags);
686 //sk_soc_info("unix_is_ipc_socket result=%d", result);
687 return result;
688}
689EXPORT_SYMBOL_GPL(unix_is_ipc_socket);
690
691int unix_is_ipc_local_socket(struct sock *sock)
692{
693 int result;
694 result = test_bit(SOCK_IPC_LOCAL, &sock->sk_flags);
695 //sk_soc_info("unix_is_ipc_socket result=%d", result);
696 return result;
697}
698EXPORT_SYMBOL_GPL(unix_is_ipc_local_socket);
699
700/*·µ»ØÖµ´óÓÚµÈÓÚ0£¬±íʾдͨµÀ³É¹¦£»Ð¡ÓÚ0±íʾдͨµÀʧ°Ü*/
701static int sock_channel_write(struct sock_channel *chninfo, void *buf, unsigned int len)
702{
703 T_ZDrvRpMsg_Msg msg;
704
705 if(NULL == buf) {
706 return -EINVAL;
707 }
708 memset(&msg, 0, sizeof(msg));
709 msg.actorID = chninfo->core_id;
710 msg.chID = chninfo->channel_id;
711 msg.flag |= RPMSG_WRITE_INT; //| RPMSG_WRITE_IRQLOCK;
712 msg.buf = buf;
713 msg.len = len;
714 //sk_soc_info("sock_channel_write process, len=%d", len);
715 return sockSocWrite(&msg);
716}
717
718/*·µ»ØÖµ´óÓÚ0£¬±íʾ¶ÁȡͨµÀ³É¹¦£»Ð¡ÓÚµÈÓÚ0±íʾͨµÀÊý¾ÝΪ¿Õ»òʧ°Ü*/
719static int sock_channel_read(struct sock_channel *chninfo, void *buf, unsigned int len)
720{
721 T_ZDrvRpMsg_Msg msg;
722 int ret = 0;
723
724 if(NULL == buf) {
725 return -EINVAL;
726 }
727 sk_soc_info("sock_channel_read enter");
728 memset(&msg, 0, sizeof(msg));
729 msg.actorID = chninfo->core_id;
730 msg.chID = chninfo->channel_id;
731 msg.buf = buf;
732 msg.len = len;
733
734 ret = sockSocRead(&msg);
735 if (ret <= 0) {
736 sk_soc_err("rpm read err=%d!",ret);
737 return ret;
738 }
739
740 return ret;
741}
742
743static int sock_thread_enqueue_data(struct sock_rpmsg *sock_rpmsg)
744{
745 unsigned long flags;
746 struct sock_thread_info* p_main_thread_info;
747 p_main_thread_info = &g_sock_chn_info.main_thread_info;
748
749 spin_lock_irqsave(&p_main_thread_info->p_sock_lock,flags);
750 list_add_tail(&sock_rpmsg->list, &p_main_thread_info->p_sock_list);
751 spin_unlock_irqrestore(&p_main_thread_info->p_sock_lock,flags);
752 sock_put_sema(&p_main_thread_info->p_sock_sem);
753
754 return 0;
755}
756
757struct sock_rpmsg* sock_create_rpmsg(unsigned int size)
758{
759 struct sock_rpmsg* sock_rpmsg;
760
761 size = SOCK_DATA_ALIGN(size);
762 size += SOCK_DATA_ALIGN(sizeof(struct sock_rpmsg));
763 if(size > SOCK_DATA_MAX_LEN){
764 sk_soc_err("size of data is too large, max support size is %d", SOCK_DATA_MAX_LEN-sizeof(struct sock_rpmsg));
765 }
766 sock_rpmsg = kzalloc(size, GFP_KERNEL);
767 if (sock_rpmsg == NULL) {
768 sk_soc_err("kzalloc fial!!");
769 return NULL;
770 }
771 return sock_rpmsg;
772}
773
774static int sock_send_ipc_msg(struct sock_rpmsg* psock_rpmsg)
775{
776 struct sock_rpmsg* sock_rpmsg;
777 sock_rpmsg = sock_create_rpmsg(0);
778 if(NULL == sock_rpmsg){
779 sk_soc_err("kzalloc fial!!");
780 return -1;
781 }
782 memcpy(sock_rpmsg, psock_rpmsg, sizeof(struct sock_rpmsg));
783 sock_rpmsg->dir = DIR_DOWNLINK;
784 sock_thread_enqueue_data(sock_rpmsg);
785 //sk_soc_info("sock_send_ipc_msg write len=%d", len);
786 return 0;
787}
788
789static int sock_send_ipc_msg_data(struct sock_rpmsg* psock_rpmsg)
790{
791 if(NULL == psock_rpmsg){
792 sk_soc_err("psock_rpmsg is NULL!!");
793 return -1;
794 }
795
796 psock_rpmsg->dir = DIR_DOWNLINK;
797 sock_thread_enqueue_data(psock_rpmsg);
798 //sk_soc_info("sock_send_ipc_msg write len=%d", len);
799 return 0;
800}
801
802static int sock_recv_ipc_msg(struct sock_rpmsg* psock_rpmsg)
803{
804 struct sock_rpmsg* sock_rpmsg;
805 sk_soc_info("sock_receive_thread sock_rpmsg.msg_type=%d,index=%d", psock_rpmsg->msg_type, psock_rpmsg->index);
806 sock_rpmsg = sock_create_rpmsg(psock_rpmsg->data_len);
807 if(NULL == sock_rpmsg){
808 sk_soc_err("kzalloc fial!!");
809 return -1;
810 }
811 memcpy(sock_rpmsg, psock_rpmsg, psock_rpmsg->data_len+sizeof(struct sock_rpmsg));
812 sock_rpmsg->dir = DIR_UPLINK;
813 sock_thread_enqueue_data(sock_rpmsg);
814 //sk_soc_info("sock_send_ipc_msg write len=%d", len);
815 return 0;
816}
817
818int sock_lookup_fd_by_sock(struct sock *sock)
819{
820 struct socket *socket;
821 socket = sock->sk_socket;
822 sk_soc_info("sock_lookup_fd_by_sock socket=%x, socket->fd=%d\n", socket, socket->fd);
823 return socket->fd;
824}
825
826static int sock_channel_clear(struct sock_channel *chninfo)
827{
828 char *tbuf = NULL;
829 unsigned int tlen = chninfo->channel_size/2;
830 int ret = 0;
831
832 tbuf = (char *)kzalloc(tlen,GFP_ATOMIC);
833 if(IS_ERR(tbuf)) {
834 sk_soc_err("kzalloc fail! %d byte.", tlen);
835 return -ENOMEM;
836 }
837 ret = sock_channel_read(chninfo, tbuf, tlen);
838 if(ret < 0) {
839 sk_soc_err("zvnet_channel_read fail!");
840 ret = 0;
841 }
842 kfree(tbuf);
843 sk_soc_err("Drop channel data. %d byte.",ret);
844
845 return ret;
846}
847
848void usock_print(struct unix_sock* usock){
849 sk_soc_info("usock->rsock.localfd=%d", usock->rsock.localfd);
850 sk_soc_info("usock->rsock.localsocket=%x", usock->rsock.localsocket);
851 sk_soc_info("usock->rsock.proxyfd=%d", usock->rsock.proxyfd);
852 sk_soc_info("usock->rsock.proxysocket=%x", usock->rsock.proxysocket);
853 sk_soc_info("usock->rsock.remotefd=%d", usock->rsock.remotefd);
854 sk_soc_info("usock->rsock.remotesocket=%x", usock->rsock.remotesocket);
855}
856
857void usock_init(struct sock* sock, int localfd, struct socket* localsocket, int proxyfd, struct socket* proxysocket, int remotefd, struct socket* remotesocket){
858 struct unix_sock* usock;
859 if(NULL == sock){
860 return;
861 }
862 usock = unix_sk(sock);
863 usock->rsock.localfd = localfd;
864 usock->rsock.localsocket = localsocket;
865 usock->rsock.proxyfd = proxyfd;
866 usock->rsock.proxysocket = proxysocket;
867 usock->rsock.remotefd = remotefd;
868 usock->rsock.remotesocket = remotesocket;
869}
870
xf.liaa4d92f2023-09-13 00:18:58 -0700871//±¾µØsocket¸üк󣬸üдúÀísocketÖÐrsockÐÅÏ¢
872void usock_update(struct sock* sock, int localfd, struct socket* localsocket)
873{
874 struct unix_sock* usock;
875 if(NULL == sock){
876 return;
877 }
878 usock = unix_sk(sock);
879 usock->rsock.localfd = localfd;
880 usock->rsock.localsocket = localsocket;
881}
882
xf.li6c8fc1e2023-08-12 00:11:09 -0700883void usock_update_remote_proxy_socket(struct sock* sock, struct socket* remoteproxysocket)
884{
885 struct unix_sock* usock;
886 usock = unix_sk(sock);
887 usock->rsock.remoteproxysocket = remoteproxysocket;
888}
889
890static struct ipc_socket * sock_create_proxy_socket_server(struct sock_rpmsg* psock_rpmsg)
891{
892 struct ipc_socket *psocket_ipc = NULL;
893 struct socket *sock;
894
895 int err;
896
897 sk_soc_info("clientsock=%x, serversock=%x!\n", psock_rpmsg->clientsock, psock_rpmsg->serversock);
898 psocket_ipc = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->clientsock, psock_rpmsg->serversock);
899 if(NULL != psocket_ipc) { //Èç¹ûÒѾ­´´½¨¹ýͬһ·þÎñ¶ËµÄ´úÀí£¬Ôò²»ÔÙÖØ¸´´´½¨
900 sk_soc_info("socket_server already exist, do not create again!\n");
901 sock_hold(psocket_ipc->sock); //0705
902 return psocket_ipc;
903 }
904
905 psocket_ipc = (struct ipc_socket *)kzalloc(sizeof(struct ipc_socket), GFP_ATOMIC);
906 if(NULL == psocket_ipc){
907 sk_soc_err("kzalloc failed!\n");
908 return NULL;
909 }
910 psocket_ipc->sockfd = sys_socket(AF_UNIX, psock_rpmsg->socktype, 0); //´´½¨·þÎñ¶Ësocket´úÀí
911 sk_soc_info("sock_create_proxy_socket_server socktype=%d, socket->fd=%d", psock_rpmsg->socktype, psocket_ipc->sockfd);
912 //memcpy(&psocket_ipc->sock, &g_sock_rpmsg.sock, sizeof(struct sock));
913 //psocket_ipc->socket.sk = &psocket_ipc->sock;
914 psocket_ipc->socket = sock_get_local_socket(psocket_ipc->sockfd, &err);
915 if(NULL != psocket_ipc->socket){
916 sk_soc_info("sock_create_proxy_socket_server sucess\n");
917 psocket_ipc->sock = psocket_ipc->socket->sk;
918 psocket_ipc->proxysocket = psocket_ipc->socket;
919 psocket_ipc->socktype = psock_rpmsg->socktype;
920 set_bit(SOCK_IPCSOCK,&psocket_ipc->sock->sk_flags);
921 psocket_ipc->sock->ipc_flag = 1;
922 psocket_ipc->sock->sk_fd = psocket_ipc->sockfd;
923 //sock_soc_set_socket_info(psocket_ipc->socket, psock_rpmsg->clientsock);
924 sock_hold(psocket_ipc->sock); //0704
xf.liaa4d92f2023-09-13 00:18:58 -0700925 init_peercred_proxy(psocket_ipc->sock);
xf.li6c8fc1e2023-08-12 00:11:09 -0700926 //³õʼ»¯´úÀísocketµÄusockÐÅÏ¢
927 usock_init(psocket_ipc->sock, psock_rpmsg->clientfd, psock_rpmsg->clientsock, psocket_ipc->sockfd, psocket_ipc->socket, psock_rpmsg->serverfd, psock_rpmsg->serversock);
928 usock_update_remote_proxy_socket(psocket_ipc->sock, psock_rpmsg->serverproxysock);
929 //usock_print(usock);
930 }
931 else{
932 sk_soc_info("sock_create_proxy_socket_server failed, socket = NULL\n");
933 }
934 //ͬ²½·þÎñÆ÷¶ËÅäÖÃ
935 //psocket_ipc->sock->sk_flags = g_sock_rpmsg.sock.sk_flags;
936 //psocket_ipc->sock->sk_state = g_sock_rpmsg.sock.sk_state;
937 //psocket_ipc->sock->sk_shutdown = g_sock_rpmsg.sock.sk_shutdown;
938 //psocket_ipc->sock->sk_receive_queue.qlen = g_sock_rpmsg.sock.sk_receive_queue.qlen;
939 //psocket_ipc->sock->sk_max_ack_backlog = g_sock_rpmsg.sock.sk_max_ack_backlog;
940 psocket_ipc->localfd = psock_rpmsg->clientfd;
941 psocket_ipc->localsocket = psock_rpmsg->clientsock;
942 psocket_ipc->remotefd = psock_rpmsg->serverfd;
943 psocket_ipc->remotesocket = psock_rpmsg->serversock;
944 psocket_ipc->remoteproxyfd = psock_rpmsg->serverproxyfd;
945 psocket_ipc->remoteproxysocket = psock_rpmsg->serverproxysock;
946 psocket_ipc->key = psock_rpmsg->serversock;
947 sk_soc_info("sock_create_proxy_socket_server sockfd=%d, remotefd=%d, key=%x\n", psocket_ipc->sockfd, psocket_ipc->remotefd, psocket_ipc->key);
948 INIT_HLIST_NODE(&psocket_ipc->hlist_node);
949 sock_soc_insert_socket(&psocket_ipc->hlist_node);
950 return psocket_ipc;
951}
952
953static struct ipc_socket * sock_create_proxy_socket_client(struct sock_rpmsg* psock_rpmsg)
954{
955 struct ipc_socket *psocket_ipc = NULL;
956 struct socket *sock;
957 struct unix_sock* usock;
958 int err;
959 //½öƾÕâÁ½¸ö²ÎÊý»¹²»ÄÜÈ·¶¨ÊÇ·ñͬһ¿Í»§¶ËµÄ´úÀí£¬ÒòΪ¶Ô¶Ë¿ÉÄܹرղ¢ÖØÐÂÉú³ÉÒ»¸öÏàͬµØÖ·µÄsocket
960 if(0 == psock_rpmsg->isfistfind){
961 psocket_ipc = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
962 if(NULL != psocket_ipc) { //Èç¹ûÒѾ­´´½¨¹ýͬһ¿Í»§¶ËµÄ´úÀí£¬Ôò²»ÔÙÖØ¸´´´½¨
963 //sock_hold(psocket_ipc->sock); //0703
964 return psocket_ipc;
965 }
966 }
967
968 psocket_ipc = (struct ipc_socket *)kzalloc(sizeof(struct ipc_socket), GFP_ATOMIC);
969 if(NULL == psocket_ipc){
970 sk_soc_err("kzalloc failed!\n");
971 return NULL;
972 }
973 sk_soc_info("sock_create_proxy_socket_client socktype=%d\n", psock_rpmsg->socktype);
974 psocket_ipc->sockfd = sys_socket(AF_UNIX, psock_rpmsg->socktype, 0); //´´½¨¿Í»§¶Ësocket´úÀí
975 sk_soc_info("sock_create_proxy_socket_client socket->fd=%d\n", psocket_ipc->sockfd);
976 psocket_ipc->socket = sock_get_local_socket(psocket_ipc->sockfd, &err);
977
978 //usock_print(usock);
979
980 if(NULL != psocket_ipc->socket){
981 sk_soc_info("sockfd_lookup sucess, socket=%x \n", psocket_ipc->socket);
982 //³õʼ»¯´úÀísocketµÄusockÐÅÏ¢
983 usock_init(psocket_ipc->socket->sk, psock_rpmsg->serverfd, psock_rpmsg->serversock, psocket_ipc->sockfd, psocket_ipc->socket, psock_rpmsg->clientfd, psock_rpmsg->clientsock);
984
985 psocket_ipc->sock = psocket_ipc->socket->sk;
986 set_bit(SOCK_IPCSOCK,&psocket_ipc->sock->sk_flags);
987 psocket_ipc->sock->ipc_flag = 1;
988 psocket_ipc->sock->sk_fd = psocket_ipc->sockfd;
989 //sock_hold(psocket_ipc->sock); //todo: clientÊDz»ÊDz»Ó¦¸Ãµ÷ÓÃsock_hold?
990 }
991 else{
992 sk_soc_info("server socket = NULL");
993 }
994 //ÒòΪ´Ëʱ¶Ô¶ËµÄ´úÀísocket»¹Î´´´½¨£¬ËùÒÔÎÞ·¨»ñÈ¡remoteproxyfdºÍremoteproxysocket
995 psocket_ipc->localfd = psock_rpmsg->serverfd;
996 psocket_ipc->localsocket = psock_rpmsg->serversock;
997 psocket_ipc->remotefd = psock_rpmsg->clientfd;
998 psocket_ipc->remotesocket = psock_rpmsg->clientsock;
999 psocket_ipc->proxysocket = psocket_ipc->socket;
1000
1001 psocket_ipc->key = psock_rpmsg->clientsock;
1002 sk_soc_info("sock_create_proxy_socket_client sockfd=%d,remotefd=%d,key=%x", psocket_ipc->sockfd, psocket_ipc->remotefd,psocket_ipc->key);
1003 INIT_HLIST_NODE(&psocket_ipc->hlist_node);
1004 sock_soc_insert_socket(&psocket_ipc->hlist_node);
1005 return psocket_ipc;
1006}
1007
1008int sock_soc_recvq_full(const struct sock *other)
1009{
1010 struct sock_rpmsg sock_rpmsg = {0};
1011 struct ipc_socket * ipc_socket;
1012 struct sock_rpmsg_info *psock_rpmsg_info;
1013 int sockfd;
1014 int result;
1015 sk_soc_info("sock_soc_recvq_full enter");
1016 sock_rpmsg.msg_type = MSG_TYPE_RECVQ_FULL;
1017 sockfd = sock_lookup_fd_by_sock(other);
1018 //sock_rpmsg.serverfd = sock_lookup_serverfd_by_clientfd(sockfd);
1019 //ipc_socket = sock_lookup_server_by_clientfd(sockfd);
1020 ipc_socket = sock_soc_get_ipcsocket_by_proxysock(other);
1021 if(NULL == ipc_socket){
1022 sk_soc_info("sock_soc_recvq_full get ipc_socket faild \n");
1023 return -1;
1024 }
1025 sock_rpmsg.serverfd = ipc_socket->remotefd;
1026 sock_rpmsg.serversock = ipc_socket->remotesocket;
1027 sock_rpmsg.clientsock = ipc_socket->localsocket;
1028 sock_rpmsg.key = other;
1029 psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);
1030 if(NULL == psock_rpmsg_info){
1031 sk_soc_info("sock_soc_recvq_full create rpmsg faild \n");
1032 return -1;
1033 }
1034 sock_send_ipc_msg(&sock_rpmsg);
1035 down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));
1036 result = psock_rpmsg_info->sock_rpmsg.result;
1037 sock_soc_del_rpmsg_info(sock_rpmsg.key);
1038 return result;
1039}
1040EXPORT_SYMBOL_GPL(sock_soc_recvq_full);
1041
1042int sock_soc_recvq_full_proc(struct sock_rpmsg* psock_rpmsg)
1043{
1044 struct ipc_socket* ipcsocket;
1045 struct socket *other;
1046 int err;
1047 int result;
1048 struct sock_rpmsg sock_rpmsg = {0};
1049 sk_soc_info("sock_soc_recvq_full_proc serverfd=%d", psock_rpmsg->serverfd);
1050 sock_rpmsg.msg_type = MSG_TYPE_RECVQ_FULL_RESULT;
1051 sock_rpmsg.key = psock_rpmsg->key;
1052 //other = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1053 other = (struct socket*)psock_rpmsg->serversock;
1054 if(sock_soc_socket_is_valid_ipc(other, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1055 sk_soc_info("sock_soc_socket_is_valid is false \n");
1056 sock_send_ipc_msg(&sock_rpmsg);
1057 return -1;
1058 }
1059 sock_rpmsg.result = unix_recvq_full_proxy(other->sk);
1060 sk_soc_info("sock_soc_recvq_full_proc result=%d\n", sock_rpmsg.result);
1061 sock_rpmsg.serverfd = other->fd; //sock_lookup_fd_by_sock(other->sk);
1062 sock_send_ipc_msg(&sock_rpmsg);
1063 return 0;
1064}
1065
1066int sock_soc_recvq_full_result_proc(struct sock_rpmsg* psock_rpmsg)
1067{
1068 sk_soc_info("sock_soc_recvq_full_result_proc\n");
1069 sock_soc_rsp_proc(psock_rpmsg);
1070 return 0;
1071}
1072
1073int sock_soc_recvq_full_lockless_and_dead(const struct sock *other)
1074{
1075 struct sock_rpmsg sock_rpmsg = {0};
1076 struct ipc_socket *ipc_socket;
1077 struct sock_rpmsg_info *psock_rpmsg_info;
1078 int sockfd;
1079 int result;
1080 sk_soc_info("sock_soc_recvq_full_lockless_and_dead\n");
1081 sock_rpmsg.msg_type = MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD;
1082 sockfd = sock_lookup_fd_by_sock(other);
1083 //sock_rpmsg.serverfd = sock_lookup_serverfd_by_clientfd(sockfd);
1084 //ipc_socket = sock_lookup_server_by_clientfd(sockfd);
1085 ipc_socket = sock_soc_get_ipcsocket_by_proxysock(other);
1086 if(NULL == ipc_socket){
1087 sk_soc_info("sock_soc_recvq_full_lockless_and_dead get ipc_socket faild \n");
1088 return -1;
1089 }
1090 sock_rpmsg.serverfd = ipc_socket->remotefd;
1091 sock_rpmsg.serversock = ipc_socket->remotesocket;
1092 sock_rpmsg.clientsock = ipc_socket->localsocket;
1093 sock_rpmsg.key = other;
1094 psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);
1095 if(NULL == psock_rpmsg_info){
1096 sk_soc_info("sock_soc_recvq_full_lockless_and_dead create rpmsg faild \n");
1097 return -1;
1098 }
1099 sock_send_ipc_msg(&sock_rpmsg);
1100 down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));
1101 result = psock_rpmsg_info->sock_rpmsg.result;
1102 sock_soc_del_rpmsg_info(sock_rpmsg.key);
1103 return result;
1104}
1105EXPORT_SYMBOL_GPL(sock_soc_recvq_full_lockless_and_dead);
1106
1107int sock_soc_recvq_full_lockless_and_dead_proc(struct sock_rpmsg* psock_rpmsg)
1108{
1109 struct ipc_socket* ipcsocket;
1110 struct socket *other;
1111 int err;
1112 int result;
1113 struct sock_rpmsg sock_rpmsg = {0};
1114 sk_soc_info("sock_soc_recvq_full_lockless_and_dead_proc");
1115 sock_rpmsg.msg_type = MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD_RESULT;
1116 sock_rpmsg.key = psock_rpmsg->key;
1117 //other = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1118 other = (struct socket*)psock_rpmsg->serversock;
1119 if(sock_soc_socket_is_valid_ipc(other, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1120 sk_soc_info("sock_soc_socket_is_valid is false \n");
1121 sock_send_ipc_msg(&sock_rpmsg);
1122 return -1;
1123 }
1124 sock_rpmsg.result = unix_recvq_full_proxy_lockless_and_deadstate(other->sk);
1125 sock_rpmsg.serverfd = sock_lookup_fd_by_sock(other->sk);
1126 sock_send_ipc_msg(&sock_rpmsg);
1127 return 0;
1128}
1129
1130int sock_soc_recvq_full_lockless_and_dead_result_proc(struct sock_rpmsg* psock_rpmsg)
1131{
1132 sk_soc_info("sock_soc_recvq_full_lockless_and_dead_result_proc");
1133 sock_soc_rsp_proc(psock_rpmsg);
1134 return 0;
1135}
1136/*
1137** sock: ±¾µØsocket
1138** other:¶Ô¶ËsocketµÄ±¾µØ´úÀí
1139*/
1140int sock_soc_set_peer(struct sock *sock, struct sock *other)
1141{
1142 struct sock_rpmsg sock_rpmsg = {0};
1143 struct ipc_socket *ipc_socket;
1144 int sockfd;
1145 sock_rpmsg.msg_type = MSG_TYPE_SET_PEER;
1146 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);
1147 sock_rpmsg.clientsock = sock->sk_socket;
1148 sockfd = sock_lookup_fd_by_sock(other);
1149 //sock_rpmsg.serverfd = sock_lookup_serverfd_by_clientfd(sockfd);
1150 //ipc_socket = sock_lookup_server_by_clientfd(sockfd);
1151 ipc_socket = sock_soc_get_ipcsocket_by_proxysock(other);
1152 if(NULL == ipc_socket){
1153 sk_soc_info("sock_soc_set_peer get ipc_socket faild \n");
1154 return -1;
1155 }
1156 sock_rpmsg.serverfd = ipc_socket->remotefd;
1157 sock_rpmsg.serversock = ipc_socket->remotesocket;
1158 sk_soc_info("sock_soc_set_peer clientfd=%d, serverfd=%d\n", sock_rpmsg.clientfd, sock_rpmsg.serverfd);
1159
1160 unix_peer(sock) = other;
1161 sock_send_ipc_msg(&sock_rpmsg);
1162 return 0;
1163}
1164EXPORT_SYMBOL_GPL(sock_soc_set_peer);
1165
1166int sock_soc_set_peer_proc(struct sock_rpmsg* psock_rpmsg)
1167{
1168 struct ipc_socket* ipcsocket;
1169 struct socket *clientsocket;
1170 struct socket *serversocket;
1171 struct sock *sock;
1172 struct sock *other;
1173 int err;
1174 sk_soc_info("sock_soc_set_peer_proc clientfd=%d, serverfd=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd);
1175 //¶ÔÓÚ·þÎñ¶ËÀ´Ëµ,serversockÊôÓÚ±¾µØsocket£¬clientsockÊôÓÚÔ¶¶Ësocket
1176 ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
1177 if(ipcsocket == NULL){
1178 sk_soc_info("sock_soc_set_peer_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);
1179 return -1;
1180 }
1181 //clientsocket = (struct socket*)psock_rpmsg->clientsock;
1182 sock = ipcsocket->sock;
1183 //serversocket = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1184 serversocket = (struct socket*)psock_rpmsg->serversock;
1185 if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1186 sk_soc_info("sock_soc_socket_is_valid is false \n");
1187 return -1;
1188 }
1189 other = serversocket->sk;
1190
1191 unix_peer(sock) = other;
1192 sock_hold(other);
1193 //unix_peer(other) = sock; //0703
1194 return 0;
1195}
1196
1197/*½«ËùÓÐsocket->peer==sockµÄsocket,È«²¿¸üÐÂΪsocket->peer=newsock*/
1198//¸Ã½Ó¿ÚÓÃÓÚ·þÎñ¶Ë֪ͨ¿Í»§¶Ë
1199int sock_soc_update_peer(struct socket *sock, struct socket *newsock)
1200{
1201 struct sock_rpmsg sock_rpmsg = {0};
1202 struct sock* proxysock;
1203 struct ipc_socket* ipcsocket;
1204 int sockfd;
1205 struct unix_sock* usock;
1206 //newsock->sk->peerÖ¸ÏòµÄÊǿͻ§¶Ë´úÀísock
1207 proxysock = unix_peer(newsock->sk);
1208 usock = unix_sk(proxysock);
1209 usock->rsock.localsocket = newsock;
1210 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(proxysock);
1211 if(NULL != ipcsocket){
1212 sock_rpmsg.serversock = ipcsocket->remotesocket;
1213 ipcsocket->localsocket = newsock;
1214 sk_soc_info("remotesocket=%x, localsocket=%x", ipcsocket->remotesocket, ipcsocket->localsocket);
1215 }else{
xf.liaa4d92f2023-09-13 00:18:58 -07001216 sk_soc_info("sock_soc_get_ipcsocket_by_proxysock failed, proxysock=%x, sock=%x", proxysock, sock);
xf.li6c8fc1e2023-08-12 00:11:09 -07001217 return -1;
1218 }
1219 sk_soc_info("sock=%x, newsock=%x", sock, newsock);
1220 sock_rpmsg.msg_type = MSG_TYPE_UPDATE_PEER;
1221 sock_rpmsg.clientfd = sock->fd;
1222 sock_rpmsg.clientsock = sock;
1223 sock_rpmsg.newclientfd = newsock->fd;
1224 sock_rpmsg.newsock = newsock;
1225 sock_soc_del_socket_peer(sock, ipcsocket->proxysocket);
1226 sock_soc_insert_socket_peer(newsock, ipcsocket->proxysocket);
xf.liaa4d92f2023-09-13 00:18:58 -07001227 usock_update(ipcsocket->sock, newsock->fd, newsock);
xf.li6c8fc1e2023-08-12 00:11:09 -07001228 //newsock->peer = sock->peer; //0706
1229 //sock->peer = NULL; //0706
1230 sock_rpmsg.key = sock_rpmsg.serversock;
1231 sk_soc_info("clientfd=%d, newclientfd=%d\n", sock_rpmsg.clientfd, sock_rpmsg.newclientfd);
1232 //sock_soc_del_socket_info(proxysock->sk_socket, sock); //ɾ³ý¾ÉµÄÐÅÏ¢
1233 //sock_soc_set_socket_info(proxysock->sk_socket, newsock); //Ìí¼ÓеÄÐÅÏ¢
1234 sock_send_ipc_msg(&sock_rpmsg);
1235 return 0;
1236}
1237
1238EXPORT_SYMBOL_GPL(sock_soc_update_peer);
1239
1240int sock_soc_update_peer_proc(struct sock_rpmsg* psock_rpmsg)
1241{
1242 struct ipc_socket* ipcsocket;
1243 struct socket *clientsocket;
1244 struct socket *serversocket;
1245 struct sock *sock;
1246 struct sock *other;
1247 struct unix_sock* usock;
1248 int err;
1249 sk_soc_info("sock_soc_update_peer_proc clientfd=%d, newclientfd=%d", psock_rpmsg->clientfd, psock_rpmsg->newclientfd);
1250 ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
1251 if(ipcsocket == NULL){
1252 sk_soc_info("sock_soc_update_peer_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);
1253 return -1;
1254 }
1255 sk_soc_info("sock_soc_update_peer_proc sock=%x, newsock=%x", ipcsocket->remotesocket, psock_rpmsg->newsock);
1256 ipcsocket->remotefd = psock_rpmsg->newclientfd;
1257 ipcsocket->remotesocket = psock_rpmsg->newsock;
1258 ipcsocket->key = psock_rpmsg->newsock;
1259 usock = unix_sk(ipcsocket->proxysocket->sk);
1260 usock->rsock.remotefd = psock_rpmsg->newclientfd;
1261 usock->rsock.remotesocket = psock_rpmsg->newsock;
1262 sock_soc_rsp_proc(psock_rpmsg);//ÊÍ·ÅconnectµÈ´ýµÄÐźÅÁ¿
1263 return 0;
1264}
1265
1266void sock_soc_sock_hold(struct sock *other)
1267{
1268 struct ipc_socket *psocket_ipc = NULL;
1269 struct sock_rpmsg sock_rpmsg = {0};
1270 sock_rpmsg.msg_type = MSG_TYPE_SOCK_HOLD;
1271 //dump_stack();
1272 //²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢
1273 psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);
1274 if(psocket_ipc == NULL){
1275 sk_soc_info("sock_soc_sock_hold failed, other->fd=%d\n ", other->sk_fd);
1276 return;
1277 }
1278 //·þÎñÆ÷¶Ësocket fd
1279 sock_rpmsg.serverfd = psocket_ipc->remotefd;
1280 sock_rpmsg.serversock = psocket_ipc->remotesocket;
1281 sock_rpmsg.clientsock = psocket_ipc->localsocket;
1282 sk_soc_info("sock_soc_sock_hold serverfd=%d \n", sock_rpmsg.serverfd);
1283 sock_send_ipc_msg(&sock_rpmsg);
1284}
1285
1286int sock_soc_sock_hold_proc(struct sock_rpmsg* psock_rpmsg)
1287{
1288 struct socket* serversocket;
1289 struct sock* other;
1290
1291 serversocket = (struct socket*)psock_rpmsg->serversock;
1292 if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1293 sk_soc_info("sock_soc_socket_is_valid is false \n");
1294 return -1;
1295 }
1296 other = serversocket->sk;
1297
1298 sk_soc_info("sock_soc_sock_hold_proc serverfd=%d \n", psock_rpmsg->serverfd);
1299 sock_hold(other);
1300 return 0;
1301}
1302
1303int sock_soc_sock_put(struct sock *other)
1304{
1305 struct sock_rpmsg sock_rpmsg = {0};
1306 int sockfd;
1307 struct ipc_socket *ipc_socket;
1308 sock_rpmsg.msg_type = MSG_TYPE_SOCK_PUT;
1309 //other->sk_socket¿ÉÄÜÒѱ»ÖÃΪnull
1310 if(!other->sk_socket){
1311 sockfd = other->sk_fd;
1312 }
1313 else{
1314 sockfd = sock_lookup_fd_by_sock(other);
1315 }
1316
1317 //sock_rpmsg.serverfd = sock_lookup_serverfd_by_clientfd(sockfd);
1318 //ipc_socket = sock_lookup_server_by_clientfd(sockfd);
1319 ipc_socket = sock_soc_get_ipcsocket_by_proxysock(other);
1320 if(NULL == ipc_socket){
1321 sk_soc_info("sock_soc_sock_put get ipc_socket faild \n");
1322 return -1;
1323 }
1324 sock_rpmsg.serverfd = ipc_socket->remotefd;
1325 sock_rpmsg.serversock = ipc_socket->remotesocket;
1326 sock_rpmsg.clientsock = ipc_socket->localsocket;
1327 sk_soc_info("sock_soc_sock_put serverfd=%d\n", sock_rpmsg.serverfd);
1328 sock_send_ipc_msg(&sock_rpmsg);
1329 return 0;
1330}
1331EXPORT_SYMBOL_GPL(sock_soc_sock_put);
1332
1333int sock_soc_sock_put_proc(struct sock_rpmsg* psock_rpmsg)
1334{
1335 struct socket *other;
1336 int err;
1337 //other = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1338 other = (struct socket*)psock_rpmsg->serversock;
1339 if(sock_soc_socket_is_valid_ipc(other, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1340 sk_soc_info("sock_soc_socket_is_valid is false \n");
1341 return -1;
1342 }
1343 sk_soc_info("sock_soc_sock_put_proc serversock=%x, serverfd=%d",other, psock_rpmsg->serverfd);
1344 if(other->sk){
1345 sock_put(other->sk);
1346 }
1347
1348 return 0;
1349}
1350
1351int sock_soc_msg_send(struct sock *sock, struct sock *other, struct msghdr *msg, size_t len)
1352{
1353 struct ipc_socket *psocket_ipc = NULL;
1354 //struct sock_rpmsg sock_rpmsg = {0};
1355 //sock_rpmsg.msg_type = MSG_TYPE_SEND_MSG;
1356 struct sock_rpmsg* psock_rpmsg =NULL;
1357
1358 psock_rpmsg = sock_create_rpmsg(len);
1359 if(psock_rpmsg == NULL){
1360 sk_soc_err("sock_soc_msg_send failed, sock_create_rpmsg failed\n ");
1361 return -1;
1362 }
1363 psock_rpmsg->msg_type = MSG_TYPE_SEND_MSG;
1364 //¿Í»§¶Ësocket fd
1365 psock_rpmsg->clientfd = sock_lookup_fd_by_sock(sock);
1366 psock_rpmsg->clientsock = sock->sk_socket;
1367 //²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢
1368 psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);
1369 if(psocket_ipc == NULL){
1370 sk_soc_info("sock_soc_msg_send failed, other->sk_fd=%d\n ", other->sk_fd);
1371 kfree(psock_rpmsg);
1372 return -1;
1373 }
1374 //·þÎñÆ÷¶Ësocket fd
1375 psock_rpmsg->serverfd = psocket_ipc->remotefd;
1376 psock_rpmsg->serversock = psocket_ipc->remotesocket;
1377 psock_rpmsg->clientsock = psocket_ipc->localsocket;
1378
1379 psock_rpmsg->msg_flags = msg->msg_flags;
1380 //¿½±´·¢Ë͵ÄÊý¾Ý
1381 memcpy_fromiovec(psock_rpmsg->data, msg->msg_iov, len);
1382 psock_rpmsg->data_len = len;
1383 //strcpy(sock_rpmsg.data, "test");
1384 //sock_rpmsg.data_len = 4;
1385 //¿½±´socketµØÖ·
1386 if(msg->msg_namelen > 0){
1387 memcpy(&psock_rpmsg->sockaddr, (struct sockaddr_un*)msg->msg_name, msg->msg_namelen);
1388 }
1389 psock_rpmsg->addr_len = msg->msg_namelen;
1390 sk_soc_info("sock_soc_msg_send clientfd=%d, serverfd=%d, data=%s, len=%d\n", psock_rpmsg->clientfd, psock_rpmsg->serverfd, psock_rpmsg->data, len);
1391 sock_send_ipc_msg_data(psock_rpmsg);
1392 return 0;
1393}
1394
1395int sock_soc_msg_send_proc(struct sock_rpmsg* psock_rpmsg)
1396{
1397 struct ipc_socket* clientsocket;
1398 struct socket* serversocket;
1399 struct sock* sock;
1400 struct sock* other;
1401 char __user * p,q;
1402 mm_segment_t old_fs;
1403 struct msghdr msg;
1404 unsigned int msg_flags;
1405 struct iovec iov;
1406 int err;
1407
1408 //serversocket = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1409 serversocket = (struct socket*)psock_rpmsg->serversock;
1410 if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1411 sk_soc_info("sock_soc_socket_is_valid is false \n");
1412 return -1;
1413 }
1414 other = serversocket->sk;
1415
1416 clientsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
1417 if(clientsocket == NULL){
1418 sk_soc_info("sock_soc_msg_send_proc failed, serversock=%x,clientsock=%x\n ", psock_rpmsg->serversock, psock_rpmsg->clientsock);
1419 return -1;
1420 }
1421 sk_soc_info("sock_soc_msg_send_proc, serversock=%x,clientsock=%x\n ", psock_rpmsg->serversock, psock_rpmsg->clientsock);
1422 sock = clientsocket->sock;
1423
1424 sk_soc_info("sock_soc_msg_send_proc clientfd=%d, serverfd=%d, len=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd, psock_rpmsg->data_len);
1425
1426 old_fs = get_fs();
1427 set_fs(KERNEL_DS);
1428 if(psock_rpmsg->addr_len > 0){
1429 p = (__force struct sockaddr_un __user *)(&psock_rpmsg->sockaddr);
1430 }
1431 q = (__force const char __user *)(psock_rpmsg->data);
1432 //sys_sendto(psock_rpmsg->serverfd, psock_rpmsg->data, psock_rpmsg->data_len, psock_rpmsg->msg_flags, NULL, 0);
1433 if(psock_rpmsg->addr_len > 0){
1434 sys_sendto(clientsocket->sockfd, psock_rpmsg->data, psock_rpmsg->data_len, psock_rpmsg->msg_flags, &psock_rpmsg->sockaddr, psock_rpmsg->addr_len);
1435 }else{
1436 sys_sendto(clientsocket->sockfd, psock_rpmsg->data, psock_rpmsg->data_len, psock_rpmsg->msg_flags, NULL, 0);
1437 }
1438 set_fs(old_fs);
1439 //other->sk_data_ready(other, psock_rpmsg->data_len);
1440 //sock_put(other);
1441 return 0;
1442}
1443
1444long sock_wait_for_peer(struct sock *sock, struct sock *other, long timeo)
1445{
1446 struct ipc_socket * ipcsocket;
1447 struct sock_rpmsg sock_rpmsg = {0};
1448 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);
1449 sock_rpmsg.clientsock = sock->sk_socket;
1450 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);
1451 if(ipcsocket == NULL){
1452 sk_soc_info("sock_wait_for_peer failed, other->fd=%d\n ", other->sk_fd);
1453 return -1;
1454 }
1455 sock_rpmsg.serverfd = ipcsocket->remotefd;
1456 sock_rpmsg.serversock = ipcsocket->remotesocket;
1457 sock_rpmsg.msg_type = MSG_TYPE_WAIT_FOR_PEER;
1458 sock_rpmsg.timeo = timeo;
1459 sk_soc_info("sock_wait_for_peer clientfd=%d, serverfd=%d", sock_rpmsg.clientfd, sock_rpmsg.serverfd);
1460 sock_send_ipc_msg(&sock_rpmsg);
1461 return 0;
1462}
1463
1464static int sock_wait_for_peer_thread(void *argv)
1465{
1466 struct peer_sock_info* peer_info = (struct peer_sock_info*)argv;
1467 sk_soc_info("sock_wait_for_peer_thread enter");
1468 unix_wait_for_peer_proxy(peer_info->peersock, peer_info->timeo);
1469 return 0;
1470}
1471
1472int sock_wait_for_peer_proc(struct sock_rpmsg* psock_rpmsg)
1473{
1474 struct ipc_socket *socket_ipc;
1475 struct task_struct *th = NULL;
1476 struct socket* clientsocket;
1477 struct socket* serversocket;
1478 int err;
1479 socket_ipc = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
1480 if(socket_ipc == NULL){
1481 sk_soc_info("sock_wait_for_peer_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);
1482 return -1;
1483 }
1484 struct peer_sock_info* peer_info = (struct peer_sock_info *)kzalloc(sizeof(struct peer_sock_info), GFP_ATOMIC);
1485 if(NULL == peer_info){
1486 sk_soc_err("kzalloc failed!");
1487 return -1;
1488 }
1489 peer_info->timeo = psock_rpmsg->timeo;
1490 clientsocket= sock_get_local_socket(socket_ipc->sockfd, &err);
1491 if(NULL == clientsocket){
1492 kfree(peer_info);
1493 sk_soc_err("clientsocket is NULL!");
1494 return -1;
1495 }
1496 //clientsocket = (struct socket*)psock_rpmsg->clientsock;
1497 peer_info->sock = clientsocket->sk;
1498 //serversocket = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1499 serversocket = (struct socket*)psock_rpmsg->serversock;
1500 if(sock_soc_socket_is_valid_other(serversocket) == -1){ //serversockÒѹرÕ
1501 sk_soc_info("sock_soc_socket_is_valid is false \n");
1502 return -1;
1503 }
1504 peer_info->peersock = serversocket->sk;
1505 sk_soc_info("sock_wait_for_peer_proc clientfd=%d, serverfd=%d", socket_ipc->sockfd, psock_rpmsg->serverfd);
1506 th = kthread_run(sock_wait_for_peer_thread, peer_info, "wait_for_peer");
1507 if (IS_ERR(th)) {
1508 sk_soc_err("Unable to start receive thread.");
1509 return PTR_ERR(th);
1510 }
1511 return 0;
1512}
1513
1514int sock_soc_unix_peer_clear(struct sock *sk)
1515{
1516 struct sock_rpmsg sock_rpmsg = {0};
1517 struct ipc_socket *socket_ipc;
1518 sk_soc_info("sock_soc_unix_peer_clear enter\n");
1519 //socket_ipc = sock_soc_get_ipcsocket_by_fd(psock_rpmsg->clientfd, psock_rpmsg->clientsock);
1520 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sk);
1521 sock_rpmsg.clientsock = sk->sk_socket;
1522 sock_rpmsg.msg_type = MSG_TYPE_PEER_CLEAR;
1523 sock_send_ipc_msg(&sock_rpmsg);
1524 return 0;
1525}
1526
1527int sock_soc_unix_peer_clear_proc(struct sock_rpmsg* psock_rpmsg)
1528{
1529 struct socket* socket;
1530 struct sock* sock;
1531 int err;
1532 sk_soc_info("sock_soc_unix_peer_clear_proc enter");
1533 //socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1534 socket = (struct socket*)psock_rpmsg->serversock;
1535 if(sock_soc_socket_is_valid_other(socket) == -1){ //serversockÒѹرÕ
1536 sk_soc_info("sock_soc_socket_is_valid is false \n");
1537 return -1;
1538 }
1539 sock = socket->sk;
1540 if(sock == NULL){
1541 sk_soc_info("sock_soc_unix_peer_clear_proc sock is NULL");
1542 return -1;
1543 }
1544 unix_sk(sock)->peer = NULL;
1545 return 0;
1546}
1547
1548int sock_soc_wake_up_interruptible_poll(struct sock *sk)
1549{
1550 struct sock_rpmsg sock_rpmsg = {0};
1551
1552 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sk);
1553 sock_rpmsg.clientsock = sk->sk_socket;
1554 sock_rpmsg.msg_type = MSG_TYPE_WAKE_UP_INTERRUPTIBLE_POLL;
1555 sk_soc_info("sock_soc_wake_up_interruptible_poll clientfd=%d", sock_rpmsg.clientfd);
1556 sock_send_ipc_msg(&sock_rpmsg);
1557 return 0;
1558}
1559
1560int sock_soc_wake_up_interruptible_poll_proc(struct sock_rpmsg* psock_rpmsg)
1561{
1562 struct socket* socket;
1563 struct sock* sock;
1564 int err;
1565 //serverfd = sock_lookup_serverfd_by_clientfd(psock_rpmsg->clientfd);
1566 //socket = sock_get_local_socket(serverfd, &err);
1567 socket = (struct socket*)psock_rpmsg->serversock;
1568 if(sock_soc_socket_is_valid_other(socket) == -1){ //serversockÒѹرÕ
1569 sk_soc_info("sock_soc_socket_is_valid is false \n");
1570 return -1;
1571 }
1572 sock = socket->sk;
1573 if(sock == NULL){
1574 sk_soc_info("sock_soc_wake_up_interruptible_poll_proc sock is NULL");
1575 return -1;
1576 }
1577
1578 wake_up_interruptible_poll(sk_sleep(sock),
1579 POLLOUT |
1580 POLLWRNORM |
1581 POLLWRBAND);
1582 return 0;
1583}
1584
1585int sock_soc_sk_data_ready(struct sock *sk)
1586{
1587 struct sock_rpmsg sock_rpmsg = {0};
1588 struct ipc_socket * ipcsocket;
1589 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(sk);
1590 if(ipcsocket == NULL){
1591 sk_soc_info("sock_soc_sk_data_ready failed, sk->fd=%d\n ", sk->sk_fd);
1592 return -1;
1593 }
1594 sock_rpmsg.serverfd = ipcsocket->remotefd;
1595 sock_rpmsg.serversock = ipcsocket->remotesocket;
1596 sock_rpmsg.clientsock = ipcsocket->localsocket;
1597 sk_soc_info("sock_soc_sk_data_ready serverfd=%d", sock_rpmsg.serverfd);
1598 sock_rpmsg.msg_type = MSG_TYPE_DATA_READY;
1599 sock_send_ipc_msg(&sock_rpmsg);
1600 return 0;
1601}
1602
1603int sock_soc_sk_data_ready_proc(struct sock_rpmsg* psock_rpmsg)
1604{
1605 struct socket* socket;
1606 struct sock* sock;
1607 int err;
1608 //socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1609 socket = (struct socket*)psock_rpmsg->serversock;
1610 if(sock_soc_socket_is_valid_ipc(socket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1611 sk_soc_info("sock_soc_socket_is_valid is false \n");
1612 return -1;
1613 }
1614 sk_soc_info("sock_soc_sk_data_ready_proc serverfd=%d", psock_rpmsg->serverfd);
1615 sock = socket->sk;
1616 if(sock == NULL){
1617 sk_soc_info("sock_soc_sk_data_ready_proc sock is NULL");
1618 return -1;
1619 }
1620 sock->sk_data_ready(sock, 1);
1621 return 0;
1622}
1623
1624int sock_sync_ipc_socket(struct sock_elem_flag* elem_flag, struct sock *other)
1625{
1626 struct sock_rpmsg sock_rpmsg = {0};
1627 struct ipc_socket * ipcsocket;
1628 sock_rpmsg.msg_type = MSG_TYPE_SYNC_IPC_SOCKET;
1629 memcpy(&sock_rpmsg.elem, elem_flag, sizeof(struct sock_elem_flag));
1630 //memcpy(&sock_rpmsg.sock, other, sizeof(struct sock));
1631 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);
1632 if(ipcsocket == NULL){
1633 sk_soc_info("sock_sync_ipc_socket failed, other->fd=%d\n ", other->sk_fd);
1634 return -1;
1635 }
1636 sock_rpmsg.serverfd = ipcsocket->remotefd;
1637 sock_rpmsg.serversock = ipcsocket->remotesocket;
1638 sock_rpmsg.clientsock = ipcsocket->localsocket;
1639 sk_soc_info("sock_sync_ipc_socket serverfd=%d", sock_rpmsg.serverfd);
1640 sock_send_ipc_msg(&sock_rpmsg);
1641
1642 return 0;
1643}
1644
1645int sock_sync_ipc_socket_proc(struct sock_rpmsg* psock_rpmsg)
1646{
1647 struct socket* socket;
1648 struct sock *other;
1649 int err;
1650 //socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1651 socket = (struct socket*)psock_rpmsg->serversock;
1652 if(NULL == socket){
1653 return -1;
1654 }
1655 if(sock_soc_socket_is_valid_ipc(socket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1656 sk_soc_info("sock_soc_socket_is_valid is false \n");
1657 return -1;
1658 }
1659 other = socket->sk;
1660 if(other == NULL){
1661 sk_soc_info("sock_sync_ipc_socket_proc other is NULL");
1662 return -1;
1663 }
1664 sk_soc_info("sock_sync_ipc_socket_proc serverfd=%d", psock_rpmsg->serverfd);
1665 if(psock_rpmsg->elem.sk_err){
1666 //other->sk_err = psock_rpmsg->sock.sk_err;
1667 }
1668
1669 if(psock_rpmsg->elem.sk_error_report){
1670 other->sk_error_report(other);
1671 }
1672
1673 return 0;
1674}
1675
1676int sock_soc_get_state(struct sock_elem_flag* elem_flag, struct sock *other)
1677{
1678 struct sock_rpmsg sock_rpmsg = {0};
1679 struct ipc_socket * ipcsocket;
1680 struct sock_rpmsg_info *psock_rpmsg_info;
1681 sock_rpmsg.msg_type = MSG_TYPE_GET_SOCKET_STATES;
1682 memcpy(&sock_rpmsg.elem, elem_flag, sizeof(struct sock_elem_flag));
1683 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);
1684 if(ipcsocket == NULL){
1685 sk_soc_info("sock_soc_get_state failed, other->fd=%d\n ", other->sk_fd);
1686 return -1;
1687 }
1688 sock_rpmsg.serverfd = ipcsocket->remotefd;
1689 sock_rpmsg.serversock = ipcsocket->remotesocket;
1690 sock_rpmsg.clientsock = ipcsocket->localsocket;
1691 sock_rpmsg.key = other;
1692 sk_soc_info("sock_soc_get_state serverfd=%d", sock_rpmsg.serverfd);
1693
1694 psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);
1695 if(NULL == psock_rpmsg_info){
1696 sk_soc_info("sock_soc_get_state create rpmsg faild \n");
1697 return -1;
1698 }
1699 sock_send_ipc_msg(&sock_rpmsg);
1700 down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));
1701
1702 if(psock_rpmsg_info->sock_rpmsg.elem.skstate){
1703 other->sk_state = psock_rpmsg_info->sock_rpmsg.elem.skstate;
1704 sk_soc_info("sk_state=%d", other->sk_state);
1705 }
1706
1707 if(psock_rpmsg_info->sock_rpmsg.elem.skshutdown){
1708 other->sk_shutdown = psock_rpmsg_info->sock_rpmsg.elem.skshutdown;
1709 sk_soc_info("sk_shutdown=%d", other->sk_shutdown);
1710 }
1711 sock_soc_del_rpmsg_info(sock_rpmsg.key);
1712 sk_soc_info("sock_soc_get_state end");
1713 return 0;
1714}
1715
1716int sock_soc_get_state_proc(struct sock_rpmsg* psock_rpmsg)
1717{
1718 struct socket* socket;
1719 struct sock *other;
1720 struct sock_rpmsg sock_rpmsg = {0};
1721 int err;
1722 sock_rpmsg.msg_type = MSG_TYPE_GET_SOCKET_STATES_RESULT;
1723 sock_rpmsg.key = psock_rpmsg->key;
1724 sk_soc_info("sock_soc_get_state_proc serverfd=%d", psock_rpmsg->serverfd);
1725 //socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1726 socket = (struct socket*)psock_rpmsg->serversock;
1727 if(sock_soc_socket_is_valid_ipc(socket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1728 sk_soc_info("sock_soc_socket_is_valid is false \n");
1729 sock_send_ipc_msg(&sock_rpmsg);
1730 return -1;
1731 }
1732 if(NULL != socket){
1733 sk_soc_info("sock_soc_get_state_proc sucess");
1734 other = socket->sk;
1735 if(other == NULL){
1736 sk_soc_info("sock_soc_get_state_proc other is NULL");
1737 sock_send_ipc_msg(&sock_rpmsg);
1738 return -1;
1739 }
1740 if(psock_rpmsg->elem.skstate){
1741 sock_rpmsg.elem.skstate = other->sk_state;
1742 sk_soc_info("sk_state=%d", other->sk_state);
1743 }
1744
1745 if(psock_rpmsg->elem.skshutdown){
1746 sock_rpmsg.elem.skshutdown = other->sk_shutdown;
1747 sk_soc_info("sk_shutdown=%d", other->sk_shutdown);
1748 }
1749 }
1750 else
1751 {
1752 sk_soc_info("sock_soc_get_state_proc failed");
1753 }
1754 sock_send_ipc_msg(&sock_rpmsg);
1755 return 0;
1756}
1757
1758int sock_soc_get_state_result_proc(struct sock_rpmsg* psock_rpmsg)
1759{
1760 sk_soc_info("sock_soc_find_other_result_proc");
1761 sock_soc_rsp_proc(psock_rpmsg);
1762 return 0;
1763}
1764
1765int sock_soc_test_flags(struct sock *other, enum sock_flags flag)
1766{
1767 struct sock_rpmsg sock_rpmsg = {0};
1768 struct ipc_socket * ipcsocket;
1769 struct sock_rpmsg_info *psock_rpmsg_info;
1770 int result;
1771 sock_rpmsg.msg_type = MSG_TYPE_TEST_FLAG;
1772 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);
1773 if(ipcsocket == NULL){
1774 sk_soc_info("sock_soc_test_flags failed, other->fd=%d\n ", other->sk_fd);
1775 return -1;
1776 }
1777 sock_rpmsg.serverfd = ipcsocket->remotefd;
1778 sock_rpmsg.serversock = ipcsocket->remotesocket;
1779 sock_rpmsg.clientsock = ipcsocket->localsocket;
1780 //sock_rpmsg.flag = flag;
1781 sock_rpmsg.flag = convert_to_cap_sock_flag(flag);
1782 if(sock_rpmsg.flag == -1)
1783 {
1784 sk_soc_info("cap do not support flag=%s ", flag_value[flag]);
1785 return 0;
1786 }
1787 sock_rpmsg.key = other;
1788 sk_soc_info("sock_soc_test_flags serverfd=%d", sock_rpmsg.serverfd);
1789
1790 psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);
1791 if(NULL == psock_rpmsg_info){
1792 sk_soc_info("sock_soc_get_state create rpmsg faild \n");
1793 return -1;
1794 }
1795 sock_send_ipc_msg(&sock_rpmsg);
1796 down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));
1797 sk_soc_info("sock_soc_test_flags flag=%s, result=%d\n",flag_value[flag], g_sock_rpmsg.result);
1798 result = psock_rpmsg_info->sock_rpmsg.result;
1799 sock_soc_del_rpmsg_info(sock_rpmsg.key);
1800 return result;
1801}
1802EXPORT_SYMBOL_GPL(sock_soc_test_flags);
1803
1804int sock_soc_test_flags_proc(struct sock_rpmsg* psock_rpmsg)
1805{
1806 struct sock_rpmsg sock_rpmsg = {0};
1807 struct socket* socket;
1808 struct sock *other;
1809 int err;
1810 //socket = sock_get_local_socket(psock_rpmsg->serverfd, &err);
1811 sock_rpmsg.msg_type = MSG_TYPE_TEST_FLAG_RESULT;
1812 sock_rpmsg.key = psock_rpmsg->key;
1813 socket = (struct socket*)psock_rpmsg->serversock;
1814 if(sock_soc_socket_is_valid_ipc(socket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1815 sk_soc_info("sock_soc_socket_is_valid is false \n");
1816 sock_send_ipc_msg(&sock_rpmsg);
1817 return -1;
1818 }
1819 if(NULL == socket){
1820 sk_soc_info("sock_soc_test_flags_proc failed, flag=%s", flag_value[psock_rpmsg->flag]);
1821 sock_send_ipc_msg(&sock_rpmsg);
1822 return -1;
1823 }
1824 other = socket->sk;
1825 if(other == NULL){
1826 sock_send_ipc_msg(&sock_rpmsg);
1827 return -1;
1828 }
1829 sock_rpmsg.result = test_bit(psock_rpmsg->flag, &other->sk_flags);
1830 sk_soc_info("sock_soc_test_flags_proc flag=%s, result=%d", flag_value[psock_rpmsg->flag], sock_rpmsg.result);
1831 sock_send_ipc_msg(&sock_rpmsg);
1832 return 0;
1833}
1834
1835int sock_soc_test_flags_result_proc(struct sock_rpmsg* psock_rpmsg)
1836{
1837 sk_soc_info("sock_soc_test_flags_result_proc enter");
1838 sock_soc_rsp_proc(psock_rpmsg);
1839
1840 return 0;
1841}
1842
1843void sock_soc_add_skb_queue_tail(struct sock *sock, struct sock *other)
1844{
1845 struct ipc_socket * ipcsocket;
1846 struct sock_rpmsg sock_rpmsg = {0};
1847 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);
1848 sock_rpmsg.clientsock = sock->sk_socket;
1849 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);
1850 if(ipcsocket == NULL){
1851 sk_soc_info("sock_soc_add_skb_queue_tail failed, other->fd=%d\n ", other->sk_fd);
1852 return;
1853 }
1854 sock_rpmsg.serverfd = ipcsocket->remotefd;
1855 sock_rpmsg.serversock = ipcsocket->remotesocket;
1856 sock_rpmsg.clientsock = ipcsocket->localsocket;
1857 sock_rpmsg.msg_type = MSG_TYPE_ADD_SKB_QUEUE_TAIL;
1858 sk_soc_info("sock_soc_add_skb_queue_tail clientfd=%d, serverfd=%d", sock_rpmsg.clientfd, sock_rpmsg.serverfd);
1859 sock_send_ipc_msg(&sock_rpmsg);
1860}
1861
1862void sock_soc_add_skb_queue_tail_proc(struct sock_rpmsg* psock_rpmsg)
1863{
1864 struct ipc_socket * ipcsocket;
1865 struct socket* other;
1866 struct sk_buff *skb = NULL;
1867 int err;
1868 //¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket
1869 ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
1870 if(ipcsocket == NULL){
1871 sk_soc_info("sock_soc_add_skb_queue_tail_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);
1872 return;
1873 }
1874 //other = sockfd_lookup(psock_rpmsg->serverfd, &err);
1875 other = (struct socket*)psock_rpmsg->serversock;
1876 if(sock_soc_socket_is_valid_ipc(other, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
1877 sk_soc_info("sock_soc_socket_is_valid is false \n");
1878 return;
1879 }
1880 sk_soc_info("sock_soc_add_skb_queue_tail clientfd=%d, serverfd=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd);
1881 if((NULL != ipcsocket) && (NULL != other)){
1882 /* Allocate skb for sending to listening sock */
1883 skb = sock_wmalloc(ipcsocket->sock, 1, 0, GFP_KERNEL);
1884 if (skb == NULL)
1885 {
1886 return;
1887 }
1888
1889 __skb_queue_tail(&other->sk->sk_receive_queue, skb);
1890 sk_soc_info("sock_soc_add_skb_queue_tail sucess! \n");
1891 }
1892}
1893
1894void sock_soc_stream_connect(struct sock *sock, struct sock *other, struct sockaddr_un *sunname, int len,int flags)
1895{
1896 struct ipc_socket * ipcsocket;
1897 struct sock_rpmsg sock_rpmsg = {0};
1898 struct sock_rpmsg_info *psock_rpmsg_info;
1899 if(len > 0){
1900 memcpy(&sock_rpmsg.sockaddr, sunname, sizeof(struct sockaddr_un));
1901 sk_soc_info("sock_soc_stream_connect sockaddr=%s", sock_rpmsg.sockaddr.sun_path);
1902 sock_rpmsg.addr_len = len;
1903 }
1904 sock_rpmsg.flags = flags;
1905 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);
1906 sock_rpmsg.clientsock = sock->sk_socket;
1907 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);
1908 if(ipcsocket == NULL){
1909 sk_soc_info("sock_soc_stream_connect failed, other->fd=%d\n ", other->sk_fd);
1910 return;
1911 }
1912 sock_rpmsg.serverfd = ipcsocket->remotefd;
1913 sock_rpmsg.serversock = ipcsocket->remotesocket;
1914 sock_rpmsg.msg_type = MSG_TYPE_STREAM_CONNECT;
1915 sock_rpmsg.key = sock_rpmsg.clientsock;
1916 psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);
1917 if(NULL == psock_rpmsg_info){
1918 sk_soc_info("sock_soc_stream_connect create rpmsg faild \n");
1919 return;
1920 }
1921 sock_send_ipc_msg(&sock_rpmsg);
1922 //ÒªµÈµ½ÊÕµ½update_peer²ÅÄÜ·µ»Ø
1923 down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));
1924 sk_soc_info("sock_soc_stream_connect clientfd=%d, serverfd=%d\n", sock_rpmsg.clientfd, sock_rpmsg.serverfd);
1925 sock_soc_del_rpmsg_info(sock_rpmsg.key);
1926}
1927
1928void sock_soc_stream_connect_proc(struct sock_rpmsg* psock_rpmsg)
1929{
1930 struct ipc_socket * ipcsocket;
1931 struct socket* other;
1932 struct sk_buff *skb = NULL;
1933 struct sock *newsk = NULL;
1934 int result = -1;
1935 int err;
1936 //¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket
1937 ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
1938 if(ipcsocket == NULL){
1939 sk_soc_info("sock_soc_stream_connect_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);
1940 return;
1941 }
1942 //other = sockfd_lookup(psock_rpmsg->serverfd, &err);
1943 other = (struct socket*)psock_rpmsg->serversock;
1944
1945 sk_soc_info("sock_soc_stream_connect_proc clientfd=%d, serverfd=%d\n", psock_rpmsg->clientfd, psock_rpmsg->serverfd);
1946 if((NULL != ipcsocket) && (NULL != other)){
1947 sk_soc_info("sockaddr=%s", psock_rpmsg->sockaddr.sun_path);
1948 result = unix_stream_connect_proxy(ipcsocket->socket, (struct sockaddr *)&psock_rpmsg->sockaddr, psock_rpmsg->addr_len, psock_rpmsg->flags);
1949 if(0 == result){
1950 sk_soc_info("sock_soc_stream_connect_proc sucess! ");
1951 }else{
1952 sk_soc_info("sock_soc_stream_connect_proc failed! ");
1953 }
1954 }
1955}
1956
1957void sock_soc_add_wait_queue(struct sock *sock, struct sock *other)
1958{
1959 struct ipc_socket * ipcsocket;
1960 struct sock_rpmsg sock_rpmsg = {0};
1961 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);
1962 sock_rpmsg.clientsock = sock->sk_socket;
1963 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);
1964 if(ipcsocket == NULL){
1965 sk_soc_info("sock_soc_add_wait_queue failed, other->fd=%d\n ", other->sk_fd);
1966 return;
1967 }
1968 sock_rpmsg.serverfd = ipcsocket->remotefd;
1969 sock_rpmsg.serversock = ipcsocket->remotesocket;
1970 sock_rpmsg.msg_type = MSG_TYPE_ADD_WAIT_QUEUE;
1971 sk_soc_info("sock_soc_add_wait_queue enter");
1972 sock_send_ipc_msg(&sock_rpmsg);
1973}
1974
1975void sock_soc_add_wait_queue_proc(struct sock_rpmsg* psock_rpmsg)
1976{
1977 struct ipc_socket * ipcsocket;
1978 struct socket* socket;
1979 int err;
1980 //¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket
1981 ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
1982 if(ipcsocket == NULL){
1983 sk_soc_info("sock_soc_add_wait_queue_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);
1984 return;
1985 }
1986 //socket = sockfd_lookup(psock_rpmsg->serverfd, &err);
1987 socket = (struct socket*)psock_rpmsg->serversock;
1988
1989 sk_soc_info("sock_soc_add_wait_queue_proc clientfd=%d, serverfd=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd);
1990 if((NULL != ipcsocket) && (NULL != socket)){
1991 unix_dgram_peer_wake_connect_proxy(ipcsocket->sock, socket->sk);
1992 }
1993}
1994
1995void sock_soc_remove_wait_queue(struct sock *sock, struct sock *other)
1996{
1997 struct ipc_socket * ipcsocket;
1998 struct sock_rpmsg sock_rpmsg = {0};
1999 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);
2000 sock_rpmsg.clientsock = sock->sk_socket;
2001 ipcsocket = sock_soc_get_ipcsocket_by_proxysock(other);
2002 if(ipcsocket == NULL){
2003 sk_soc_info("sock_soc_remove_wait_queue failed, other->fd=%d\n ", other->sk_fd);
2004 return;
2005 }
2006 sock_rpmsg.serverfd = ipcsocket->remotefd;
2007 sock_rpmsg.serversock = ipcsocket->remotesocket;
2008 sock_rpmsg.msg_type = MSG_TYPE_REMOVE_WAIT_QUEUE;
2009 sk_soc_info("sock_soc_remove_wait_queue clientfd=%d, serverfd=%d", sock_rpmsg.clientfd, sock_rpmsg.serverfd);
2010 sock_send_ipc_msg(&sock_rpmsg);
2011}
2012
2013void sock_soc_remove_wait_queue_proc(struct sock_rpmsg* psock_rpmsg)
2014{
2015 struct ipc_socket * ipcsocket;
2016 struct socket* socket;
2017 int err;
2018 //¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket
2019 ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
2020 if(ipcsocket == NULL){
2021 sk_soc_info("sock_soc_remove_wait_queue_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);
2022 return;
2023 }
2024 //socket = sockfd_lookup(psock_rpmsg->serverfd, &err);
2025 socket = (struct socket*)psock_rpmsg->serversock;
2026
2027 sk_soc_info("sock_soc_remove_wait_queue_proc clientfd=%d, serverfd=%d", psock_rpmsg->clientfd, psock_rpmsg->serverfd);
2028 if((NULL != ipcsocket) && (NULL != socket)){
2029 unix_dgram_peer_wake_connect_proxy(ipcsocket->sock, socket->sk);
2030 }
2031}
2032
2033void sock_soc_notify_proxy_change_to_server(struct socket* proxysocket, struct socket* remoteproxysocket)
2034{
2035 struct sock_rpmsg sock_rpmsg = {0};
2036 sock_rpmsg.clientproxyfd = proxysocket->fd;
2037 sock_rpmsg.clientproxysock = proxysocket;
2038 sock_rpmsg.serverproxysock = remoteproxysocket;
2039 sock_rpmsg.msg_type = MSG_TYPE_NOTIFY_PROXY_CHANGE;
2040 sk_soc_info("sock_soc_notify_proxy_change_to_server clientproxysock=%x, serverproxysock=%x", sock_rpmsg.clientproxysock, sock_rpmsg.serverproxysock);
2041 sock_send_ipc_msg(&sock_rpmsg);
2042}
2043
2044void sock_soc_notify_proxy_change_to_server_proc(struct sock_rpmsg* psock_rpmsg)
2045{
2046 struct ipc_socket* ipc_socket;
2047 struct socket* serverproxysock;
xf.liaa4d92f2023-09-13 00:18:58 -07002048 serverproxysock = (struct socket*)psock_rpmsg->serverproxysock;
2049 ipc_socket = sock_soc_get_ipcsocket_by_proxysock(serverproxysock->sk);
2050 sk_soc_info("sock_soc_notify_proxy_change_to_server_proc serverproxysock=%x", psock_rpmsg->serverproxysock);
xf.li6c8fc1e2023-08-12 00:11:09 -07002051 if(NULL != ipc_socket){
2052 sk_soc_info("sock_soc_notify_proxy_change_to_server_proc remoteproxysocket=%x", psock_rpmsg->clientproxysock);
2053 ipc_socket->remoteproxyfd = psock_rpmsg->clientproxyfd;
2054 ipc_socket->remoteproxysocket = psock_rpmsg->clientproxysock;
2055 serverproxysock = (struct socket*)psock_rpmsg->serverproxysock;
2056 usock_update_remote_proxy_socket(serverproxysock->sk, psock_rpmsg->clientproxysock);
xf.liaa4d92f2023-09-13 00:18:58 -07002057 }else{
2058 sk_soc_info("sock_soc_notify_proxy_change_to_server_proc ipc_socket is NULL");
2059 }
2060
xf.li6c8fc1e2023-08-12 00:11:09 -07002061}
2062
2063struct sock *sock_soc_find_other(struct socket * socket/*int fd*/,
2064 struct sockaddr_un *sunname, int len,
2065 int type, unsigned int hash, int *error)
2066{
2067 struct sock_rpmsg sock_rpmsg = {0};
2068 struct ipc_socket *psocket_ipc = NULL;
2069 struct sock_rpmsg_info *psock_rpmsg_info = NULL;
2070 int err;
xf.liaa4d92f2023-09-13 00:18:58 -07002071
2072 if(0 == socket_rpmsg_enable){
2073 return NULL;
2074 }
2075
2076 if(false == sock_soc_ipc_sunaddr_exist(sunname)){
2077 sk_soc_info("sock_soc_ipc_sunaddr_exist is false, sunname=%s", sunname->sun_path);
2078 return NULL;
2079 }
xf.li6c8fc1e2023-08-12 00:11:09 -07002080 //struct socket *clisocket = sock_get_local_socket(fd, &err);
2081 memcpy(&sock_rpmsg.sockaddr, sunname, sizeof(struct sockaddr_un));
2082 sock_rpmsg.addr_len = len;
2083 sock_rpmsg.socktype = type;
2084 sock_rpmsg.hash = hash;
2085 sock_rpmsg.clientfd = socket->fd;
2086 sock_rpmsg.clientsock = socket;
2087 sock_rpmsg.key = socket;
2088 sock_rpmsg.msg_type = MSG_TYPE_FIND;
2089 sock_rpmsg.isfistfind = 0;
2090
2091 if(sock_soc_get_ipcsocket_by_localsocket(socket) == NULL){ //˵Ã÷ÊǵÚÒ»´Î·¢Æð²éÕÒ
2092 sock_rpmsg.isfistfind = 1;
2093 }
2094
2095 psock_rpmsg_info = sock_soc_create_rpmsg_info(sock_rpmsg.key);
xf.liaa4d92f2023-09-13 00:18:58 -07002096 if(NULL == psock_rpmsg_info){
2097 sk_soc_info("sock_soc_find_other create rpmsg faild \n");
2098 return NULL;
2099 }
xf.li6c8fc1e2023-08-12 00:11:09 -07002100 sk_soc_info("sock_soc_find_other clientfd=%d, key=%x", sock_rpmsg.clientfd, sock_rpmsg.key);
2101 sock_send_ipc_msg(&sock_rpmsg);
2102 down_timeout(&psock_rpmsg_info->sock_sem, msecs_to_jiffies(g_sock_timeout));
2103
2104 if(test_bit(SOCK_OP_RESULT, &psock_rpmsg_info->sock_rpmsg.flags)){
2105 sk_soc_info("sock_soc_find_other sucess serverfd=%d", psock_rpmsg_info->sock_rpmsg.serverfd);
2106 psocket_ipc = psock_rpmsg_info->ipc_socket;
2107 sk_soc_info("sock_soc_find_other sockfd=%d, remotefd=%d", psocket_ipc->sockfd, psocket_ipc->remotefd);
2108 //socket->peer = psocket_ipc->socket;
2109 sock_soc_insert_socket_peer(socket, psocket_ipc->proxysocket);
2110 sock_soc_del_rpmsg_info(sock_rpmsg.key);
2111 sock_soc_notify_proxy_change_to_server(psocket_ipc->proxysocket, psocket_ipc->remoteproxysocket);
2112 //sock_soc_set_socket_info(psocket_ipc->socket, socket);
2113 return psocket_ipc->sock;
2114 } else {
2115 sk_soc_info("sock_soc_find_other failed, no matched socket");
2116 }
2117 sock_soc_del_rpmsg_info(sock_rpmsg.key);
2118
2119 return NULL;
2120}
2121
2122int sock_soc_find_other_proc(struct sock_rpmsg* psock_rpmsg)
2123{
2124 struct sock *u;
2125 struct ipc_socket *psocket_ipc = NULL;
2126 //struct net tmpnet={0};
2127 struct sock_rpmsg sock_rpmsg = {0};
2128 int serverfd;
2129 int error = -1;
2130 unsigned int hash;
2131 sk_soc_info("sock_soc_find_other_proc index=%d", psock_rpmsg->index);
2132 if((NULL == psock_rpmsg) || (psock_rpmsg->msg_type != MSG_TYPE_FIND)){
2133 sk_soc_info("sock_soc_find_other_proc failed, NULL == psock_rpmsg");
2134 return -1;
2135 }
2136 sock_rpmsg.msg_type = MSG_TYPE_FIND_RESULT;
2137 sk_soc_info("sockaddr=%s,socktype=%d, hash=%d",psock_rpmsg->sockaddr.sun_path,psock_rpmsg->socktype,psock_rpmsg->hash);
2138 error = unix_mkname_proxy(&psock_rpmsg->sockaddr, psock_rpmsg->addr_len, &hash);
2139 if (error < 0){
2140 sk_soc_info("unix_mkname_proxy failed, error=%d", error);
2141 }
2142 sk_soc_info("unix_mkname_proxy sucess, hash=%d", hash);
2143 //init_net
2144 u = unix_find_other_proxy(&init_net, &psock_rpmsg->sockaddr, psock_rpmsg->addr_len, psock_rpmsg->socktype, hash, &error);
2145 if(u){
2146 sk_soc_info("find_other_proc: u(%x)->sk_socket=%x\n", u, u->sk_socket);
2147 serverfd = sock_lookup_fd_by_sock(u);
2148 psock_rpmsg->serverfd = serverfd;
2149 psock_rpmsg->serversock = u->sk_socket;
2150 psocket_ipc = sock_create_proxy_socket_client(psock_rpmsg);
2151 if(NULL != psocket_ipc){
2152 psocket_ipc->localsocket = u->sk_socket;
2153 set_bit(SOCK_OP_RESULT, &sock_rpmsg.flags);
2154 //memcpy(&sock_rpmsg.sock, u, sizeof(struct sock));
2155 sock_rpmsg.serverfd = serverfd;
2156 sock_rpmsg.serversock = u->sk_socket;
2157 sock_rpmsg.socktype = u->sk_socket->type;
2158 sock_rpmsg.serverproxyfd = psocket_ipc->sockfd;
2159 sock_rpmsg.serverproxysock = psocket_ipc->proxysocket;
2160 //u->sk_socket->peer = psocket_ipc->socket; //TODO:u¿ÉÄܱ»¶à¸ö¿Í»§¶Ë²éÕÒ£¬´Ë´¦peerÖ¸Ïò´úÀísocketÓÐÎÊÌ⣬ÒòΪ¿ÉÄÜ´æÔÚ¶à¸ö´úÀísocket
2161 sock_soc_insert_socket_peer(u->sk_socket, psocket_ipc->proxysocket);
2162 }
2163
2164 sock_put(u); //0707
2165 sk_soc_info("sock_soc_find_other_proc success, socktype=%d, serverfd=%d, key=%x, index=%d\n", sock_rpmsg.socktype, sock_rpmsg.serverfd, psock_rpmsg->key, psock_rpmsg->index);
2166 }
2167 else
2168 {
2169 sk_soc_info("sock_soc_find_other_proc failed, error=%d", error);
2170 }
2171 sock_rpmsg.key = psock_rpmsg->key;
2172 sock_rpmsg.clientfd = psock_rpmsg->clientfd;
2173 sock_rpmsg.clientsock = psock_rpmsg->clientsock;
2174 sock_rpmsg.index = psock_rpmsg->index;
2175 sock_send_ipc_msg(&sock_rpmsg);
2176
2177 return 0;
2178}
2179
2180int sock_soc_find_other_result_proc(struct sock_rpmsg* psock_rpmsg)
2181{
2182 struct sock_rpmsg_info *psock_rpmsg_info = NULL;
2183
2184 psock_rpmsg_info = sock_soc_get_rpmsg_info(psock_rpmsg->key);
2185 if(NULL == psock_rpmsg_info){
2186 sk_soc_info("sock_soc_find_other_result_proc failed\n");
2187 return -1;
2188 }
2189 memset(&psock_rpmsg_info->sock_rpmsg, 0, sizeof(struct sock_rpmsg));
2190 memcpy(&psock_rpmsg_info->sock_rpmsg, psock_rpmsg, sizeof(struct sock_rpmsg));
2191 if(test_bit(SOCK_OP_RESULT, &psock_rpmsg->flags)){
2192 psock_rpmsg_info->ipc_socket = sock_create_proxy_socket_server(psock_rpmsg);
2193 }
2194 up(&psock_rpmsg_info->sock_sem);
2195 return 0;
2196}
2197
2198static void delayed_release(struct work_struct *unused)
2199{
2200 //struct llist_node *node = llist_del_all(&delayed_release_list);
2201 struct release_socket *rsock, *t;
2202 sk_soc_info("delayed_release enter\n");
2203 spin_lock(&sock_release_table_lock);
2204 list_for_each_entry_safe(rsock, t, &delayed_release_list, list_node){
2205 //sock_soc_release_sock(rsock);
2206 sock_soc_release_peer(rsock);
2207 list_del(&rsock->list_node);
2208 kfree(rsock);
2209 }
2210 spin_unlock(&sock_release_table_lock);
2211}
2212
2213static DECLARE_DELAYED_WORK(delayed_release_work, delayed_release);
2214
2215void sock_soc_delay_release(struct socket *sock)
2216{
2217 struct release_socket* prelease_socket = NULL;
2218 struct unix_sock* usock;
2219 struct socket_info *p;
2220 struct hlist_node *pos,*n;
2221 if(!hlist_empty(&sock->peer)){
2222 spin_lock(&sock_release_peer_lock);
2223 hlist_for_each_entry_safe(p, pos, n, &sock->peer, hlist_node) {
2224 usock = unix_sk(p->proxysocket->sk);
2225 //ÅжÏusockÐÅÏ¢ÊÇ·ñ»¹ÔÚ´úÀíÁ´±íÖÐ
2226 if(0 != sock_is_valide_ipc_socket(usock->rsock.localsocket, usock->rsock.proxysocket, usock->rsock.remotesocket)){
2227 sk_soc_info("sock_soc_delay_release failed \n");
2228 continue;
2229 }
2230 prelease_socket = (struct release_socket *)kzalloc(sizeof(struct release_socket), GFP_ATOMIC);
2231 if(NULL == prelease_socket){
2232 sk_soc_info("kzalloc failed \n");
2233 continue;
2234 }
2235 memcpy(prelease_socket, &usock->rsock, sizeof(struct release_socket));
2236 list_add(&prelease_socket->list_node, &delayed_release_list);
2237 sock_soc_del_socket_info(p->proxysocket, sock);
2238 }
2239
2240 //sock_put(sock->sk); /* It may now die */
2241
2242 INIT_HLIST_HEAD(&sock->peer);
2243 spin_unlock(&sock_release_peer_lock);
2244 schedule_delayed_work(&delayed_release_work, 1);
2245 //}
2246 }
2247
2248}
2249
2250int sock_soc_release_peer(struct release_socket* rsock)
2251{
2252 struct sock_rpmsg sock_rpmsg = {0};
2253 struct socket* peersocket;
2254 struct ipc_socket * ipcsocket;
2255 struct sock* proxy_sock = NULL;
2256 //ɾ³ý±¾µØ¶ÔÓ¦µÄ´úÀísocket
2257 if(rsock->proxysocket){
2258 sk_soc_info("sock_soc_release_peer close fd=%d \n", rsock->proxysocket->fd);
2259 sock_rpmsg.socktype = rsock->proxysocket->type;
2260 //ipcsocket = sock_soc_get_ipcsocket(rsock->sock->sk); //0706¸ù¾Ý±¾µØ´úÀísocket,ÕÒµ½¶ÔÓ¦·þÎñ¶Ësocket
2261 if(NULL != rsock->remotesocket){
2262 sock_rpmsg.serverfd = rsock->remotefd;
2263 sock_rpmsg.serversock = rsock->remotesocket;
2264 }else{
2265 sk_soc_info("sock_soc_get_ipcsocket_by_proxysock failed \n");
2266 }
2267
2268 spin_lock(&sock_release_lock);
2269
2270 rsock->proxysocket->sk->closed = 1;
2271 proxy_sock = rsock->proxysocket->sk->proxy_sock;
2272 sys_close(rsock->proxysocket->fd);
2273 if(proxy_sock != NULL){ //0706
2274 unix_release_sock_proxy(proxy_sock);
2275 }
2276 //Ç°ÃæÒѾ­É¾³ý¹ýÁË
2277 //sock_del_ipc_socket_by_proxysocket(rsock->proxysocket);
2278 spin_unlock(&sock_release_lock);
2279 }
2280 sock_rpmsg.clientfd = rsock->localfd;
2281 sock_rpmsg.clientsock = rsock->localsocket;
2282 sock_rpmsg.serversock = rsock->remotesocket;
2283 sock_rpmsg.serverproxysock = rsock->remoteproxysocket;
2284 sock_rpmsg.msg_type = MSG_TYPE_RELEASE_PEER;
2285 sk_soc_info("sock_soc_release_peer clientfd=%d \n", sock_rpmsg.clientfd);
2286 sock_send_ipc_msg(&sock_rpmsg);
2287 return 0;
2288}
2289
2290int sock_soc_release_peer_proc(struct sock_rpmsg* psock_rpmsg)
2291{
2292 struct ipc_socket * ipcsocket;
2293 struct socket* proxysocket;
2294 struct socket* serversocket;
2295 struct sock* skpair;
2296 int type;
2297 int closefd;
2298 int err;
2299 sk_soc_info("sock_soc_release_peer_proc clientfd=%d \n", psock_rpmsg->clientfd);
2300 //¸ù¾ÝclientfdÕÒµ½±¾µØ´úÀísocket
2301 spin_lock(&sock_release_lock);
2302 //ÅжÏsocketÐÅÏ¢ÊÇ·ñ»¹ÔÚ´úÀíÁ´±íÖÐ
2303 if(0 != sock_is_valide_ipc_socket(psock_rpmsg->serversock, psock_rpmsg->serverproxysock, psock_rpmsg->clientsock)){
2304 sk_soc_info("sock_soc_release_peer_proc failed, sock_is_valide_ipc_socket=false \n");
2305 spin_unlock(&sock_release_lock);
2306 return -1;
2307 }
2308
2309 ipcsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
2310 if(ipcsocket != NULL){
2311 type = psock_rpmsg->socktype;
2312 sk_soc_info("sock_soc_release_peer_proc close sockfd=%d, socktype=%d\n", ipcsocket->sockfd, type);
2313 //sock_soc_del_socket_info(ipcsocket->socket, ipcsocket->localsocket); //0706 ½«´úÀísocket´ÓsocketsÁбíÖÐɾ³ý
2314
2315 serversocket = (struct socket*)psock_rpmsg->serversock;
2316 proxysocket = (struct socket*)ipcsocket->proxysocket;
2317 //ĿǰSOCK_STREAMºÍSOCK_DGRAMÊÍ·ÅÁ÷³ÌÓÐÇø±ð
2318 if(type == SOCK_STREAM){
2319 //sock_del_ipc_socket_by_socket(ipcsocket->proxysocket);
2320 skpair = serversocket->sk;
2321 unix_state_lock(skpair);
2322 /* No more writes */
2323 skpair->sk_shutdown = SHUTDOWN_MASK;
2324 //if (!skb_queue_empty(&sk->sk_receive_queue) || embrion)
2325 // serversocket->sk_err = ECONNRESET;
2326 unix_state_unlock(skpair);
2327 skpair->sk_state_change(skpair);
2328 sk_wake_async(skpair, SOCK_WAKE_WAITD, POLL_HUP);
2329 }else if(type == SOCK_DGRAM){
2330
2331 sock_soc_del_socket_peer(serversocket, proxysocket);
2332 ipcsocket->sock->closed = 1;
2333 closefd = ipcsocket->sockfd;
2334 sock_soc_del_socket_info(ipcsocket->socket, ipcsocket->localsocket); //0706 ½«´úÀísocket´ÓsocketsÁбíÖÐɾ³ý
2335
2336 sys_close(closefd);
2337 }
2338 }else{
2339 sk_soc_info("sock_soc_release_peer_proc failed, localsock=%x, remotesock=%x", psock_rpmsg->serversock, psock_rpmsg->clientsock);
2340
2341 }
2342 spin_unlock(&sock_release_lock);
2343 return 0;
2344}
2345
2346int sock_soc_dgram_disconnected(struct sock *sock, struct sock *other)
2347{
2348 struct ipc_socket *psocket_ipc = NULL;
2349 struct sock_rpmsg sock_rpmsg = {0};
2350 sock_rpmsg.msg_type = MSG_TYPE_DGRAM_DISCONNECTED;
2351
2352 //¿Í»§¶Ësocket fd
2353 sock_rpmsg.clientfd = sock_lookup_fd_by_sock(sock);
2354 sock_rpmsg.clientsock = sock->sk_socket;
2355 //²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢
2356 psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);
2357 if(psocket_ipc == NULL){
2358 sk_soc_info("sock_soc_remove_wait_queue failed, other->fd=%d\n ", other->sk_fd);
2359 return -1;
2360 }
2361 //·þÎñÆ÷¶Ësocket fd
2362 sock_rpmsg.serverfd = psocket_ipc->remotefd;
2363 sock_rpmsg.serversock = psocket_ipc->remotesocket;
2364 sk_soc_info("sock_soc_dgram_disconnected clientfd=%d, serverfd=%d \n", sock_rpmsg.clientfd, sock_rpmsg.serverfd);
2365 sock_send_ipc_msg(&sock_rpmsg);
2366 return 0;
2367}
2368
2369int sock_soc_dgram_disconnected_proc(struct sock_rpmsg* psock_rpmsg)
2370{
2371 struct ipc_socket* clientsocket;
2372 struct socket* serversocket;
2373 struct sock* sock;
2374 struct sock* other;
2375
2376 serversocket = (struct socket*)psock_rpmsg->serversock;
2377 if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
2378 sk_soc_info("sock_soc_socket_is_valid is false \n");
2379 return -1;
2380 }
2381 other = serversocket->sk;
2382
2383 clientsocket = sock_get_ipcsocket_by_local_and_remote(psock_rpmsg->serversock, psock_rpmsg->clientsock);
2384 if(clientsocket == NULL){
2385 sk_soc_info("sock_soc_dgram_disconnected_proc failed, clientfd=%d,clientsock=%x\n ", psock_rpmsg->clientfd, psock_rpmsg->clientsock);
2386 return -1;
2387 }
2388 sock = clientsocket->sock;
2389
2390 sk_soc_info("sock_soc_dgram_disconnected_proc clientfd=%d, serverfd=%d \n", psock_rpmsg->clientfd, psock_rpmsg->serverfd);
2391 unix_dgram_disconnected_proxy(sock, other);
2392 return 0;
2393}
2394
2395void sock_soc_state_lock(struct sock *other)
2396{
2397 struct ipc_socket *psocket_ipc = NULL;
2398 struct sock_rpmsg sock_rpmsg = {0};
2399 sock_rpmsg.msg_type = MSG_TYPE_STATE_LOCK;
2400
2401 //²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢
2402 psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);
2403 if(psocket_ipc == NULL){
2404 sk_soc_info("sock_soc_state_lock failed, other->fd=%d\n ", other->sk_fd);
2405 return;
2406 }
2407 //·þÎñÆ÷¶Ësocket fd
2408 sock_rpmsg.serverfd = psocket_ipc->remotefd;
2409 sock_rpmsg.serversock = psocket_ipc->remotesocket;
2410 sock_rpmsg.clientsock = psocket_ipc->localsocket;
2411 sk_soc_info("sock_soc_state_lock serverfd=%d \n", sock_rpmsg.serverfd);
2412 sock_send_ipc_msg(&sock_rpmsg);
2413}
2414
2415int sock_soc_state_lock_proc(struct sock_rpmsg* psock_rpmsg)
2416{
2417 struct socket* serversocket;
2418 struct sock* other;
2419
2420 serversocket = (struct socket*)psock_rpmsg->serversock;
2421 if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
2422 sk_soc_info("sock_soc_socket_is_valid is false \n");
2423 return -1;
2424 }
2425 other = serversocket->sk;
2426
2427 sk_soc_info("sock_soc_state_lock_proc serverfd=%d \n", psock_rpmsg->serverfd);
2428 unix_state_lock(other);
2429 return 0;
2430}
2431
2432void sock_soc_state_unlock(struct sock *other)
2433{
2434 struct ipc_socket *psocket_ipc = NULL;
2435 struct sock_rpmsg sock_rpmsg = {0};
2436 sock_rpmsg.msg_type = MSG_TYPE_STATE_UNLOCK;
2437
2438 //²éÕÒ·þÎñÆ÷¶Ë´úÀísocketÏà¹ØÐÅÏ¢
2439 psocket_ipc = sock_soc_get_ipcsocket_by_proxysock(other);
2440 if(psocket_ipc == NULL){
2441 sk_soc_info("sock_soc_state_unlock failed, other->fd=%d\n ", other->sk_fd);
2442 return;
2443 }
2444 //·þÎñÆ÷¶Ësocket fd
2445 sock_rpmsg.serverfd = psocket_ipc->remotefd;
2446 sock_rpmsg.serversock = psocket_ipc->remotesocket;
2447 sock_rpmsg.clientsock = psocket_ipc->localsocket;
2448 sk_soc_info("sock_soc_state_unlock serverfd=%d \n", sock_rpmsg.serverfd);
2449 sock_send_ipc_msg(&sock_rpmsg);
2450}
2451
2452int sock_soc_state_unlock_proc(struct sock_rpmsg* psock_rpmsg)
2453{
2454 struct socket* serversocket;
2455 struct sock* other;
2456
2457 serversocket = (struct socket*)psock_rpmsg->serversock;
2458 if(sock_soc_socket_is_valid_ipc(serversocket, psock_rpmsg->clientsock) == -1){ //serversockÒѹرÕ
2459 sk_soc_info("sock_soc_socket_is_valid is false \n");
2460 return -1;
2461 }
2462 other = serversocket->sk;
2463
2464 sk_soc_info("sock_soc_state_unlock_proc serverfd=%d \n", psock_rpmsg->serverfd);
2465 unix_state_lock(other);
2466 return 0;
2467}
2468
xf.liaa4d92f2023-09-13 00:18:58 -07002469void sock_soc_unix_bind(struct sockaddr_un *sunaddr)
2470{
2471 struct ipc_socket *psocket_ipc = NULL;
2472 struct sock_rpmsg sock_rpmsg = {0};
2473 sock_rpmsg.msg_type = MSG_TYPE_UNIX_BIND;
2474
2475 memcpy(&sock_rpmsg.sockaddr, sunaddr, sizeof(struct sockaddr_un));
2476 sk_soc_info("sock_soc_unix_bind sunaddr=%s\n", sunaddr->sun_path);
2477 sock_send_ipc_msg(&sock_rpmsg);
2478}
2479
2480int sock_soc_unix_bind_proc(struct sock_rpmsg* psock_rpmsg)
2481{
2482 struct sockaddr_un sunaddr = {0};
2483 memcpy(&sunaddr, &psock_rpmsg->sockaddr, sizeof(struct sockaddr_un));
2484 sk_soc_info("sock_soc_unix_bind_proc sunaddr=%s\n", sunaddr.sun_path);
2485 sock_soc_insert_ipc_sunaddr(&sunaddr);
2486 return 0;
2487}
2488
2489void sock_soc_unix_unbind(struct sockaddr_un *sunaddr)
2490{
2491 struct ipc_socket *psocket_ipc = NULL;
2492 struct sock_rpmsg sock_rpmsg = {0};
2493 sock_rpmsg.msg_type = MSG_TYPE_UNIX_UNBIND;
2494
2495 memcpy(&sock_rpmsg.sockaddr, sunaddr, sizeof(struct sockaddr_un));
2496 sk_soc_info("sock_soc_unix_unbind sunaddr=%s\n", sunaddr->sun_path);
2497 sock_send_ipc_msg(&sock_rpmsg);
2498}
2499
2500int sock_soc_unix_unbind_proc(struct sock_rpmsg* psock_rpmsg)
2501{
2502 struct sockaddr_un sunaddr = {0};
2503 memcpy(&sunaddr, &psock_rpmsg->sockaddr, sizeof(struct sockaddr_un));
2504 sk_soc_info("sock_soc_unix_unbind_proc sunaddr=%s\n", sunaddr.sun_path);
2505 sock_soc_del_ipc_sunaddr(&sunaddr);
2506 return 0;
2507}
2508
xf.li6c8fc1e2023-08-12 00:11:09 -07002509static int sock_create_icp_channel(T_ZDrvRpMsg_ActorID core_id, T_ZDrvRpMsg_ChID channel_id, unsigned int channel_size)
2510{
2511 int retval;
2512
2513 retval = sockSocCreateChannel (core_id, channel_id, channel_size);
2514 if(retval != RPMSG_SUCCESS && retval != RPMSG_CHANNEL_ALREADY_EXIST)
2515 goto out;
2516
2517 sk_soc_info("sock_create_icp_channel success");
2518 return retval;
2519
2520out:
2521 sk_soc_err("could not create channel.");
2522 return retval;
2523}
2524
2525static void sock_dld_handle(struct sock_rpmsg* sock_rpmsg)
2526{
2527 int len;
2528 len = sock_channel_write(&g_sock_chn_info, sock_rpmsg, sock_rpmsg->data_len + sizeof(struct sock_rpmsg));
2529 sk_soc_info("sock_dld_handle len=%d, index=%d", len, sock_rpmsg->index);
2530 return;
2531}
2532static void sock_uld_handle(struct sock_rpmsg* sock_rpmsg)
2533{
2534 if(NULL == sock_rpmsg){
2535 return;
2536 }
2537
2538 switch(sock_rpmsg->msg_type) {
2539 case MSG_TYPE_FIND:
2540 sock_soc_find_other_proc(sock_rpmsg);
2541 break;
2542 case MSG_TYPE_FIND_RESULT:
2543 sock_soc_find_other_result_proc(sock_rpmsg);
2544 break;
2545 case MSG_TYPE_ADD_WAIT_QUEUE:
2546 sock_soc_add_wait_queue_proc(sock_rpmsg);
2547 break;
2548 case MSG_TYPE_REMOVE_WAIT_QUEUE:
2549 sock_soc_remove_wait_queue_proc(sock_rpmsg);
2550 break;
2551 case MSG_TYPE_SYNC_IPC_SOCKET:
2552 sock_sync_ipc_socket_proc(sock_rpmsg);
2553 break;
2554 case MSG_TYPE_WAIT_FOR_PEER:
2555 sock_wait_for_peer_proc(sock_rpmsg);
2556 break;
2557 case MSG_TYPE_DATA_READY:
2558 sock_soc_sk_data_ready_proc(sock_rpmsg);
2559 break;
2560 case MSG_TYPE_SEND_MSG:
2561 sock_soc_msg_send_proc(sock_rpmsg);
2562 break;
2563 case MSG_TYPE_ADD_SKB_QUEUE_TAIL:
2564 sock_soc_add_skb_queue_tail_proc(sock_rpmsg);
2565 break;
2566 case MSG_TYPE_SET_PEER:
2567 sock_soc_set_peer_proc(sock_rpmsg);
2568 break;
2569 case MSG_TYPE_RECVQ_FULL:
2570 sock_soc_recvq_full_proc(sock_rpmsg);
2571 break;
2572 case MSG_TYPE_RECVQ_FULL_RESULT:
2573 sock_soc_recvq_full_result_proc(sock_rpmsg);
2574 break;
2575 case MSG_TYPE_PEER_CLEAR:
2576 sock_soc_unix_peer_clear_proc(sock_rpmsg);
2577 break;
2578 case MSG_TYPE_WAKE_UP_INTERRUPTIBLE_POLL:
2579 sock_soc_wake_up_interruptible_poll_proc(sock_rpmsg);
2580 break;
2581 case MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD:
2582 sock_soc_recvq_full_lockless_and_dead_proc(sock_rpmsg);
2583 break;
2584 case MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD_RESULT:
2585 sock_soc_recvq_full_lockless_and_dead_result_proc(sock_rpmsg);
2586 break;
2587 case MSG_TYPE_TEST_FLAG:
2588 sock_soc_test_flags_proc(sock_rpmsg);
2589 break;
2590 case MSG_TYPE_TEST_FLAG_RESULT:
2591 sock_soc_test_flags_result_proc(sock_rpmsg);
2592 break;
2593 case MSG_TYPE_SOCK_PUT:
2594 sock_soc_sock_put_proc(sock_rpmsg);
2595 break;
2596 case MSG_TYPE_GET_SOCKET_STATES:
2597 sock_soc_get_state_proc(sock_rpmsg);
2598 break;
2599 case MSG_TYPE_GET_SOCKET_STATES_RESULT:
2600 sock_soc_get_state_result_proc(sock_rpmsg);
2601 break;
2602 case MSG_TYPE_STREAM_CONNECT:
2603 sock_soc_stream_connect_proc(sock_rpmsg);
2604 break;
2605 case MSG_TYPE_UPDATE_PEER:
2606 sock_soc_update_peer_proc(sock_rpmsg);
2607 break;
2608 case MSG_TYPE_DGRAM_DISCONNECTED:
2609 sock_soc_dgram_disconnected_proc(sock_rpmsg);
2610 break;
2611 case MSG_TYPE_STATE_LOCK:
2612 sock_soc_state_lock_proc(sock_rpmsg);
2613 break;
2614 case MSG_TYPE_STATE_UNLOCK:
2615 sock_soc_state_unlock_proc(sock_rpmsg);
2616 break;
2617 case MSG_TYPE_SOCK_HOLD:
2618 sock_soc_sock_hold_proc(sock_rpmsg);
2619 break;
2620 case MSG_TYPE_RELEASE_PEER:
2621 sock_soc_release_peer_proc(sock_rpmsg);
2622 break;
2623 case MSG_TYPE_NOTIFY_PROXY_CHANGE:
2624 sock_soc_notify_proxy_change_to_server_proc(sock_rpmsg);
2625 break;
xf.liaa4d92f2023-09-13 00:18:58 -07002626 case MSG_TYPE_UNIX_BIND:
2627 sock_soc_unix_bind_proc(sock_rpmsg);
2628 break;
2629 case MSG_TYPE_UNIX_UNBIND:
2630 sock_soc_unix_unbind_proc(sock_rpmsg);
2631 break;
xf.li6c8fc1e2023-08-12 00:11:09 -07002632 default:
2633 break;
2634 }
2635}
2636
2637static int sock_receive_thread(void *argv)
2638{
2639 int index,ret_len,i,num;
2640 unsigned long flags;
2641 //static struct sock_rpmsg sock_rpmsg = {0};
2642 static char recvbuf[SOCK_DATA_MAX_LEN] = {0};
2643 sk_soc_info("sock_receive_thread process");
2644 while(1){
2645 if(0 < sock_channel_read(&g_sock_chn_info, recvbuf, sizeof(recvbuf))) {
2646 //sk_soc_info("sock_receive_thread sock_rpmsg.msg_type=%d,index=%d", sock_rpmsg.msg_type, sock_rpmsg.index);
2647#if 1
2648 sock_recv_ipc_msg((struct sock_rpmsg*)recvbuf);
2649#else
2650 switch(sock_rpmsg.msg_type) {
2651 case MSG_TYPE_FIND:
2652 sock_soc_find_other_proc(&sock_rpmsg);
2653 break;
2654 case MSG_TYPE_FIND_RESULT:
2655 sock_soc_find_other_result_proc(&sock_rpmsg);
2656 break;
2657 case MSG_TYPE_ADD_WAIT_QUEUE:
2658 sock_soc_add_wait_queue_proc(&sock_rpmsg);
2659 break;
2660 case MSG_TYPE_REMOVE_WAIT_QUEUE:
2661 sock_soc_remove_wait_queue_proc(&sock_rpmsg);
2662 break;
2663 case MSG_TYPE_SYNC_IPC_SOCKET:
2664 sock_sync_ipc_socket_proc(&sock_rpmsg);
2665 break;
2666 case MSG_TYPE_WAIT_FOR_PEER:
2667 sock_wait_for_peer_proc(&sock_rpmsg);
2668 break;
2669 case MSG_TYPE_DATA_READY:
2670 sock_soc_sk_data_ready_proc(&sock_rpmsg);
2671 break;
2672 case MSG_TYPE_SEND_MSG:
2673 sock_soc_msg_send_proc(&sock_rpmsg);
2674 break;
2675 case MSG_TYPE_ADD_SKB_QUEUE_TAIL:
2676 sock_soc_add_skb_queue_tail_proc(&sock_rpmsg);
2677 break;
2678 case MSG_TYPE_SET_PEER:
2679 sock_soc_set_peer_proc(&sock_rpmsg);
2680 break;
2681 case MSG_TYPE_RECVQ_FULL:
2682 sock_soc_recvq_full_proc(&sock_rpmsg);
2683 break;
2684 case MSG_TYPE_RECVQ_FULL_RESULT:
2685 sock_soc_recvq_full_result_proc(&sock_rpmsg);
2686 break;
2687 case MSG_TYPE_PEER_CLEAR:
2688 sock_soc_unix_peer_clear_proc(&sock_rpmsg);
2689 break;
2690 case MSG_TYPE_WAKE_UP_INTERRUPTIBLE_POLL:
2691 sock_soc_wake_up_interruptible_poll_proc(&sock_rpmsg);
2692 break;
2693 case MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD:
2694 sock_soc_recvq_full_lockless_and_dead_proc(&sock_rpmsg);
2695 break;
2696 case MSG_TYPE_RECVQ_FULL_LOCKLESS_AND_DEAD_RESULT:
2697 sock_soc_recvq_full_lockless_and_dead_result_proc(&sock_rpmsg);
2698 break;
2699 case MSG_TYPE_TEST_FLAG:
2700 sock_soc_test_flags_proc(&sock_rpmsg);
2701 break;
2702 case MSG_TYPE_TEST_FLAG_RESULT:
2703 sock_soc_test_flags_result_proc(&sock_rpmsg);
2704 break;
2705 case MSG_TYPE_SOCK_PUT:
2706 sock_soc_sock_put_proc(&sock_rpmsg);
2707 break;
2708 case MSG_TYPE_GET_SOCKET_STATES:
2709 sock_soc_get_state_proc(&sock_rpmsg);
2710 break;
2711 case MSG_TYPE_GET_SOCKET_STATES_RESULT:
2712 sock_soc_get_state_result_proc(&sock_rpmsg);
2713 break;
2714 case MSG_TYPE_STREAM_CONNECT:
2715 sock_soc_stream_connect_proc(&sock_rpmsg);
2716 break;
2717 case MSG_TYPE_UPDATE_PEER:
2718 sock_soc_update_peer_proc(&sock_rpmsg);
2719 break;
2720 case MSG_TYPE_SOCKET_RELEASE:
2721 sock_soc_release_sock_proc(&sock_rpmsg);
2722 break;
2723 case MSG_TYPE_DGRAM_DISCONNECTED:
2724 sock_soc_dgram_disconnected_proc(&sock_rpmsg);
2725 break;
2726 case MSG_TYPE_STATE_LOCK:
2727 sock_soc_state_lock_proc(&sock_rpmsg);
2728 break;
2729 case MSG_TYPE_STATE_UNLOCK:
2730 sock_soc_state_unlock_proc(&sock_rpmsg);
2731 break;
2732 case MSG_TYPE_SOCK_HOLD:
2733 sock_soc_sock_hold_proc(&sock_rpmsg);
2734 break;
2735 case MSG_TYPE_RELEASE_PEER:
2736 sock_soc_release_peer_proc(&sock_rpmsg);
2737 break;
2738 case MSG_TYPE_NOTIFY_PROXY_CHANGE:
2739 sock_soc_notify_proxy_change_to_server_proc(&sock_rpmsg);
2740 break;
2741 default:
2742 break;
2743 }
2744#endif
2745 }
2746 else {
2747 sk_soc_err("sock_channel_read fail.");
2748 msleep(1000);
2749 continue;
2750 }
2751
2752 }
2753
2754 sk_soc_err("The receive thread exit!");
2755 return 0;
2756}
2757
2758static int sock_main_thread(void *argv)
2759{
2760 struct list_head tmp_list;
2761 struct sock_rpmsg *entry,*tmp_entry;
2762 unsigned long flags;
2763 struct sock_thread_info* p_main_thread_info;
2764 p_main_thread_info = &g_sock_chn_info.main_thread_info;
2765
2766 while(!p_main_thread_info->bstop) {
2767 sock_get_sema(&p_main_thread_info->p_sock_sem);
2768
2769 spin_lock_irqsave(&p_main_thread_info->p_sock_lock,flags);
2770 if (list_empty(&p_main_thread_info->p_sock_list)) {
2771 spin_unlock_irqrestore(&p_main_thread_info->p_sock_lock,flags);
2772 continue;
2773 }
2774 list_replace_init(&p_main_thread_info->p_sock_list,&tmp_list);
2775 list_del_init(&p_main_thread_info->p_sock_list);
2776 spin_unlock_irqrestore(&p_main_thread_info->p_sock_lock,flags);
2777
2778 list_for_each_entry_safe(entry,tmp_entry,&tmp_list,list) {
2779 if(DIR_DOWNLINK == entry->dir) {
2780 sock_dld_handle(entry);
2781 }
2782 else if(DIR_UPLINK == entry->dir) {
2783 sock_uld_handle(entry);
2784 }
2785 else {
2786 sk_soc_warn("sock data unknow dir(%d).",entry->dir);
2787 }
2788 list_del(&entry->list);
2789 kfree(entry);
2790 }
2791 }
2792
2793 sk_soc_err("the sock_main_thread stop!\n");
2794 return 0;
2795}
2796
2797static int __init sock_soc_init(void)
2798{
2799 struct task_struct *th = NULL;
2800 int retval = 0;
2801 struct sock_thread_info* p_main_thread_info;
2802
2803 sema_init(&g_sock_sem, 0);
2804 g_sock_chn_info.core_id = CAP_ID;
2805 g_sock_chn_info.channel_id = ICP_CHN_SOCKET;
2806 g_sock_chn_info.channel_size = ICP_CHANNEL_SIZE;
2807
2808 sk_soc_info("sock_soc_init process");
2809 INIT_HLIST_HEAD(&g_ipc_sockets);
2810 INIT_HLIST_HEAD(&g_sock_rpmsg_info);
2811 INIT_HLIST_HEAD(&g_sockets_info);
xf.liaa4d92f2023-09-13 00:18:58 -07002812 INIT_HLIST_HEAD(&g_sunaddr_info);
xf.li6c8fc1e2023-08-12 00:11:09 -07002813 retval = sock_create_icp_channel(CAP_ID, ICP_CHN_SOCKET, ICP_CHANNEL_SIZE);
2814 if(retval < 0) {
2815 sk_soc_err("Create IcpChannel channel_32 fail.");
2816 return retval;
2817 }
2818
2819 p_main_thread_info = &g_sock_chn_info.main_thread_info;
2820
2821 INIT_LIST_HEAD(&p_main_thread_info->p_sock_list);
2822 spin_lock_init(&p_main_thread_info->p_sock_lock);
2823 sema_init(&p_main_thread_info->p_sock_sem, 0);
2824
2825 th = kthread_run(sock_main_thread, 0, "sock-soc-main%d", ICP_CHN_SOCKET);
2826 if (IS_ERR(th)) {
2827 sk_soc_err("Unable to start receive thread.");
2828 return PTR_ERR(th);
2829 }
2830 g_sock_chn_info.main_thread_info.p_thread = th;
2831
2832 th = kthread_run(sock_receive_thread, 0, "sock-soc-recv%d", ICP_CHN_SOCKET);
2833 if (IS_ERR(th)) {
2834 sk_soc_err("Unable to start receive thread.");
2835 return PTR_ERR(th);
2836 }
2837 g_sock_chn_info.recv_thread_info.p_thread = th;
xf.liaa4d92f2023-09-13 00:18:58 -07002838
2839 ipcsocket_debugfs_dir_entry_root = debugfs_create_dir("ipc_socket", NULL);
2840 if (ipcsocket_debugfs_dir_entry_root)
2841 ipcsocket_debugfs_dir_entry_proc = debugfs_create_dir("proc",
2842 ipcsocket_debugfs_dir_entry_root);
2843
2844 if (ipcsocket_debugfs_dir_entry_root) {
2845 debugfs_create_file("ipc_socket_info",
2846 0444,
2847 ipcsocket_debugfs_dir_entry_root,
2848 NULL,
2849 &ipc_socket_info_fops);
2850 }
xf.li6c8fc1e2023-08-12 00:11:09 -07002851 return 0;
2852}
2853
2854static void __exit sock_soc_exit(void)
2855{
2856 memset(&g_sock_chn_info, 0, sizeof(struct sock_channel));
2857 sk_soc_warn("success.\n");
2858}
2859
2860late_initcall(sock_soc_init);
2861module_exit(sock_soc_exit);
2862
2863MODULE_AUTHOR("ZXIC");
2864MODULE_DESCRIPTION("ZXIC CAP LAN NET DEVICE");
2865MODULE_LICENSE("GPL");
2866