acrn-hypervisor/misc/services/life_mngr/socket.h
Xiangyang Wu e195a23f73 misc: life_mngr: add socket moudle
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
2021-11-12 11:04:23 +08:00

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