mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-05-09 08:56:55 +00:00
This module is to implement unix domain socket server, operator can connect this server to send system shutdown request, or guest shutdown command. In the socket module, the following functions are implemented: - open_socket Provide one interface to open one unix domain socket server, in this interface, initialize a socket, create one thread to listen to client, another thread to poll message from client; - close_socket Provide one interface to close one unix domain socket server; - write_socket_char Provide one interface to send message to client. - find_socket_client Find socket client instance according to fd - init_socket Initialize a socket - deinit_socket Deinit a socket v1-->v3: Update interface name, only unix domain socket server is implemented in this module. v3-->v4: Add socket client name to support guest shutdown v4-->v6: Add find_socket_client, init_socket, deinit_socket Tracked-On: #6652 Signed-off-by: Xiangyang Wu <xiangyang.wu@intel.com> Reviewed-by: fei1.li@intel.com
79 lines
1.8 KiB
C
79 lines
1.8 KiB
C
/*
|
|
* Copyright (C)2021 Intel Corporation
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#ifndef _SOCKET_H_
|
|
#define _SOCKET_H_
|
|
#include <sys/queue.h>
|
|
#include <pthread.h>
|
|
#include <sys/un.h>
|
|
|
|
#define BUFFER_SIZE 16U
|
|
#define UNIX_SOCKET_PATH_MAX 256U
|
|
#define CLIENT_BUF_LEN 4096U
|
|
#define SOCKET_MAX_CLIENT 4
|
|
#define SOCKET_CLIENT_NAME_MAX 128U
|
|
|
|
typedef void data_handler_f(const char *cmd_name, int fd);
|
|
|
|
struct socket_client {
|
|
char name[SOCKET_CLIENT_NAME_MAX]; /**< channel device name */
|
|
struct sockaddr_un addr;
|
|
int fd;
|
|
socklen_t addr_len;
|
|
char buf[CLIENT_BUF_LEN];
|
|
int len; /* buf len */
|
|
|
|
LIST_ENTRY(socket_client) list;
|
|
};
|
|
|
|
struct socket_dev {
|
|
char unix_sock_path[UNIX_SOCKET_PATH_MAX];
|
|
int sock_fd;
|
|
int logfd;
|
|
|
|
data_handler_f *data_handler;
|
|
|
|
bool listening;
|
|
bool polling;
|
|
pthread_t listen_thread;
|
|
pthread_t connect_thread;
|
|
|
|
LIST_HEAD(client_list, socket_client) client_head; /* clients for this server */
|
|
pthread_mutex_t client_mtx;
|
|
int num_client;
|
|
};
|
|
|
|
/**
|
|
* @brief Send message through unix domain socket server
|
|
*/
|
|
int write_socket_char(struct socket_client *client);
|
|
/**
|
|
* @brief Find socket client instance according to fd
|
|
*/
|
|
struct socket_client *find_socket_client(struct socket_dev *sock, int fd);
|
|
/**
|
|
* @brief Open one unix domain socket server, initialize a socket,
|
|
* create one thread to listen to client, another thread to poll message from client.
|
|
*/
|
|
int open_socket(struct socket_dev *sock, data_handler_f *fn);
|
|
/**
|
|
* @brief Close one unix domain socket server
|
|
*/
|
|
void close_socket(struct socket_dev *sock);
|
|
/**
|
|
* @brief Initialize a socket
|
|
*
|
|
* @param path the socket path
|
|
* @return struct socket_dev* the socket instance
|
|
*/
|
|
struct socket_dev *init_socket(char *path);
|
|
/**
|
|
* @brief Deinit a socket
|
|
*
|
|
* @param sock The pointer of socket instance
|
|
*/
|
|
void deinit_socket(struct socket_dev *sock);
|
|
|
|
#endif
|