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