Safe API Framework 0.1.0 build 384e6ae
Layered API framework for safety-related applications (ERTMS RBC reference targeting CENELEC EN 50128 SIL 4)
Loading...
Searching...
No Matches
rte_ipc_request_reply.c File Reference

IPC Request-Reply implementation. More...

Include dependency graph for rte_ipc_request_reply.c:

Go to the source code of this file.

Functions

rte_status_t rte_ipc_rr_server_create (rte_ipc_rr_server_t *handle_out, const rte_ipc_rr_server_config_t *config)
 Create a request-reply server channel.
rte_status_t rte_ipc_rr_receive_request (rte_ipc_rr_server_t server, rte_ipc_rr_request_t *request_out, rte_duration_ms_t timeout_ms)
 Receive a request (blocking with timeout).
rte_status_t rte_ipc_rr_send_reply (rte_ipc_rr_server_t server, uint32_t request_id, const void *reply_data, size_t reply_size)
 Send reply to a request.
rte_status_t rte_ipc_rr_server_destroy (rte_ipc_rr_server_t server)
 Destroy request-reply server.
rte_status_t rte_ipc_rr_client_create (rte_ipc_rr_client_t *handle_out, const rte_ipc_rr_client_config_t *config)
 Create a request-reply client connection.
rte_status_t rte_ipc_rr_request (rte_ipc_rr_client_t client, const void *request_data, size_t request_size, void *reply_out, size_t reply_size, rte_duration_ms_t timeout_ms)
 Send request and wait for reply (blocking with timeout).
rte_status_t rte_ipc_rr_client_destroy (rte_ipc_rr_client_t client)
 Destroy request-reply client connection.

Detailed Description

IPC Request-Reply implementation.

Definition in file rte_ipc_request_reply.c.

Function Documentation

◆ rte_ipc_rr_server_create()

rte_status_t rte_ipc_rr_server_create ( rte_ipc_rr_server_t * handle_out,
const rte_ipc_rr_server_config_t * config )

Create a request-reply server channel.

Local makros Local types declarations Local variables declarations Global variables declarations Local function declarations Global functions

Parameters
handle_outReceives server handle (not NULL)
configServer configuration (not NULL)
Returns
RTE_STATUS_OK or error

Example:

.name = "signal-server",
.request_size = sizeof(signal_query_t),
.reply_size = sizeof(signal_reply_t),
.queue_depth = 10
};
rte_ipc_rr_server_create(&server, &config);
rte_status_t rte_ipc_rr_server_create(rte_ipc_rr_server_t *handle_out, const rte_ipc_rr_server_config_t *config)
Create a request-reply server channel.
struct rte_ipc_rr_server_s * rte_ipc_rr_server_t
Request-Reply server channel handle.
Configuration for request-reply server.
Query message: Train asks for signal state.
Reply message: Signal state and limits.

Definition at line 25 of file rte_ipc_request_reply.c.

◆ rte_ipc_rr_receive_request()

rte_status_t rte_ipc_rr_receive_request ( rte_ipc_rr_server_t server,
rte_ipc_rr_request_t * request_out,
rte_duration_ms_t timeout_ms )

Receive a request (blocking with timeout).

Parameters
serverServer handle (not NULL)
request_outReceives request and context (not NULL)
timeout_msMax wait time; 0 = poll, UINT32_MAX = infinite
Returns
RTE_STATUS_OK on success RTE_STATUS_TIMEOUT if no request arrived within timeout RTE_STATUS_INVALID_PARAM on invalid handle/buffer

Example:

if (rte_ipc_rr_receive_request(server, &request, 1000) == RTE_STATUS_OK) {
// Process request...
// Send reply...
}
@ RTE_STATUS_OK
Definition rte_status.h:28
rte_status_t rte_ipc_rr_receive_request(rte_ipc_rr_server_t server, rte_ipc_rr_request_t *request_out, rte_duration_ms_t timeout_ms)
Receive a request (blocking with timeout).
Incoming request with context for sending reply.

Definition at line 50 of file rte_ipc_request_reply.c.

◆ rte_ipc_rr_send_reply()

rte_status_t rte_ipc_rr_send_reply ( rte_ipc_rr_server_t server,
uint32_t request_id,
const void * reply_data,
size_t reply_size )

Send reply to a request.

Parameters
serverServer handle (not NULL)
request_idID from the request being replied to
reply_dataReply payload (not NULL)
reply_sizeSize of reply (must match configured size)
Returns
RTE_STATUS_OK on success RTE_STATUS_ERROR if reply fails RTE_STATUS_TIMEOUT if client has given up waiting

Example:

signal_reply_t reply = {
.signal_state = SIGNAL_GREEN,
.track_speed = 80
};
rte_ipc_rr_send_reply(server, request.request_id, &reply, sizeof(reply));
rte_status_t rte_ipc_rr_send_reply(rte_ipc_rr_server_t server, uint32_t request_id, const void *reply_data, size_t reply_size)
Send reply to a request.

Definition at line 62 of file rte_ipc_request_reply.c.

◆ rte_ipc_rr_server_destroy()

rte_status_t rte_ipc_rr_server_destroy ( rte_ipc_rr_server_t server)

Destroy request-reply server.

Parameters
serverServer handle (not NULL)
Returns
RTE_STATUS_OK on success

Definition at line 77 of file rte_ipc_request_reply.c.

◆ rte_ipc_rr_client_create()

rte_status_t rte_ipc_rr_client_create ( rte_ipc_rr_client_t * handle_out,
const rte_ipc_rr_client_config_t * config )

Create a request-reply client connection.

Parameters
handle_outReceives client handle (not NULL)
configClient configuration (not NULL)
Returns
RTE_STATUS_OK on success RTE_STATUS_ERROR if server not found

Example:

.server_name = "signal-server",
.request_size = sizeof(signal_query_t),
.reply_size = sizeof(signal_reply_t)
};
rte_ipc_rr_client_create(&client, &config);
struct rte_ipc_rr_client_s * rte_ipc_rr_client_t
Request-reply client handle.
rte_status_t rte_ipc_rr_client_create(rte_ipc_rr_client_t *handle_out, const rte_ipc_rr_client_config_t *config)
Create a request-reply client connection.
Configuration for request-reply client.

Definition at line 87 of file rte_ipc_request_reply.c.

◆ rte_ipc_rr_request()

rte_status_t rte_ipc_rr_request ( rte_ipc_rr_client_t client,
const void * request_data,
size_t request_size,
void * reply_out,
size_t reply_size,
rte_duration_ms_t timeout_ms )

Send request and wait for reply (blocking with timeout).

This is the main client operation: send request, block waiting for reply.

Parameters
clientClient handle (not NULL)
request_dataRequest to send (not NULL)
request_sizeSize of request
reply_outDestination buffer for reply (not NULL)
reply_sizeMax size of reply buffer
timeout_msMax wait time for reply; 0 = poll, UINT32_MAX = infinite
Returns
RTE_STATUS_OK on success (reply received) RTE_STATUS_TIMEOUT if no reply within timeout RTE_STATUS_ERROR if server rejected request RTE_STATUS_INVALID_PARAM on bad arguments

Example:

signal_query_t query = {.train_id = 1, .location = 500};
client,
&query, sizeof(query),
&reply, sizeof(reply),
5000 // Wait up to 5 seconds for reply
);
if (status == RTE_STATUS_OK) {
printf("Signal state: %d\n", reply.signal_state);
} else if (status == RTE_STATUS_TIMEOUT) {
printf("Server did not reply in time\n");
}
rte_status_t
Common result/status codes.
Definition rte_status.h:27
@ RTE_STATUS_TIMEOUT
Definition rte_status.h:32
rte_status_t rte_ipc_rr_request(rte_ipc_rr_client_t client, const void *request_data, size_t request_size, void *reply_out, size_t reply_size, rte_duration_ms_t timeout_ms)
Send request and wait for reply (blocking with timeout).

Definition at line 110 of file rte_ipc_request_reply.c.

◆ rte_ipc_rr_client_destroy()

rte_status_t rte_ipc_rr_client_destroy ( rte_ipc_rr_client_t client)

Destroy request-reply client connection.

Parameters
clientClient handle (not NULL)
Returns
RTE_STATUS_OK on success

Definition at line 128 of file rte_ipc_request_reply.c.