1 /*
2  * Copyright (C)2021-2022 Intel Corporation.
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 #ifndef _SOCKET_H_
6 #define _SOCKET_H_
7 #include <sys/queue.h>
8 #include <pthread.h>
9 #include <sys/un.h>
10 
11 #define BUFFER_SIZE 16U
12 #define UNIX_SOCKET_PATH_MAX 256U
13 #define CLIENT_BUF_LEN 4096U
14 #define SOCKET_MAX_CLIENT		4
15 #define SOCKET_CLIENT_NAME_MAX	128U
16 
17 typedef void data_handler_f(const char *cmd_name, int fd);
18 
19 struct socket_client {
20 	char name[SOCKET_CLIENT_NAME_MAX]; /**< channel device name */
21 	struct sockaddr_un addr;
22 	int fd;
23 	socklen_t addr_len;
24 	char buf[CLIENT_BUF_LEN];
25 	int len; /* buf len */
26 
27 	LIST_ENTRY(socket_client) list;
28 };
29 
30 struct socket_dev {
31 	char unix_sock_path[UNIX_SOCKET_PATH_MAX];
32 	int sock_fd;
33 	int logfd;
34 
35 	data_handler_f *data_handler;
36 
37 	bool listening;
38 	bool polling;
39 	pthread_t listen_thread;
40 	pthread_t connect_thread;
41 
42 	LIST_HEAD(client_list, socket_client) client_head;        /* clients for this server */
43 	pthread_mutex_t client_mtx;
44 	int num_client;
45 };
46 
47 /**
48  * @brief Send message through unix domain socket server
49  */
50 int write_socket_char(struct socket_client *client);
51 /**
52  * @brief Find socket client instance according to fd
53  */
54 struct socket_client *find_socket_client(struct socket_dev *sock, int fd);
55 /**
56  * @brief Open one unix domain socket server, initialize a socket,
57  * create one thread to listen to client, another thread to poll message from client.
58  */
59 int open_socket(struct socket_dev *sock, data_handler_f *fn);
60 /**
61  * @brief Close one unix domain socket server
62  */
63 void close_socket(struct socket_dev *sock);
64 /**
65  * @brief Initialize a socket
66  *
67  * @param path the socket path
68  * @return struct socket_dev* the socket instance
69  */
70 struct socket_dev *init_socket(char *path);
71 /**
72  * @brief Deinit a socket
73  *
74  * @param sock The pointer of socket instance
75  */
76 void deinit_socket(struct socket_dev *sock);
77 
78 #endif
79