blob: 089c2ecbe2cecce0ff6f852cfa40920ccf939282 [file] [log] [blame]
/* Copyright 2019 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/*
* Common utility functions for rclients.
*/
#ifndef CRAS_RCLIENT_UTIL_H_
#define CRAS_RCLIENT_UTIL_H_
#define MSG_LEN_VALID(msg, type) ((msg)->length >= sizeof(type))
struct cras_connect_message;
struct cras_rclient;
struct cras_rclient_message;
struct cras_rstream_config;
struct cras_server_message;
/* Sends a message to the client. */
int rclient_send_message_to_client(const struct cras_rclient *client,
const struct cras_client_message *msg,
int *fds, unsigned int num_fds);
/* Removes all streams that the client owns and destroys it. */
void rclient_destroy(struct cras_rclient *client);
/* Checks if the number of incoming fds matches the needs of the message from
* client.
*
* Args:
* msg - The cras_server_message from client.
* fds - The array for incoming fds from client.
* num_fds - The number of fds from client.
*
* Returns:
* 0 on success. Or negative value if the number of fds is invalid.
*/
int rclient_validate_message_fds(const struct cras_server_message *msg,
int *fds, unsigned int num_fds);
/* Checks if the incoming stream connect message contains
* - stream_id matches client->id.
* - direction supported by the client.
*
* Args:
* client - The cras_rclient which gets the message.
* msg - cras_connect_message from client.
* audio_fd - Audio fd from client.
* client_shm_fd - client shared memory fd from client. It can be -1.
*
* Returns:
* 0 on success, negative error on failure.
*/
int rclient_validate_stream_connect_params(
const struct cras_rclient *client,
const struct cras_connect_message *msg, int audio_fd,
int client_shm_fd);
/* Handles a message from the client to connect a new stream
*
* Args:
* client - The cras_rclient which gets the message.
* msg - The cras_connect_message from client.
* aud_fd - The audio fd comes from client. Its ownership will be taken.
* client_shm_fd - The client_shm_fd from client. Its ownership will be taken.
*
* Returns:
* 0 on success, negative error on failure.
*/
int rclient_handle_client_stream_connect(struct cras_rclient *client,
const struct cras_connect_message *msg,
int aud_fd, int client_shm_fd);
/* Handles messages from the client requesting that a stream be removed from the
* server.
*
* Args:
* client - The cras_rclient which gets the message.
* msg - The cras_disconnect_stream_message from client.
*
* Returns:
* 0 on success, negative error on failure.
*/
int rclient_handle_client_stream_disconnect(
struct cras_rclient *client,
const struct cras_disconnect_stream_message *msg);
/* Generic rclient create function for different types of rclients.
* Creates a client structure and sends a message back informing the client
* that the connection has succeeded.
*
* Args:
* fd - The file descriptor used for communication with the client.
* id - Unique identifier for this client.
* ops - cras_rclient_ops pointer for the client.
* supported_directions - supported directions for the this rclient.
* Returns:
* A pointer to the newly created rclient on success, NULL on failure.
*/
struct cras_rclient *rclient_generic_create(int fd, size_t id,
const struct cras_rclient_ops *ops,
int supported_directions);
/* Generic handle_message_from_client function for different types of rlicnets.
* Supports only stream connect and stream disconnect messages.
*
* If the message from clients has incorrect length (truncated message), return
* an error up to CRAS server.
* If the message from clients has invalid content, should return the errors to
* clients by send_message_to_client and return 0 here.
*
* Args:
* client - The cras_rclient which gets the message.
* msg - The cras_server_message from client.
* fds - The array for incoming fds from client.
* num_fds - The number of fds from client.
* Returns:
* 0 on success, negative error on failure.
*/
int rclient_handle_message_from_client(struct cras_rclient *client,
const struct cras_server_message *msg,
int *fds, unsigned int num_fds);
#endif /* CRAS_RCLIENT_UTIL_H_ */