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.h File Reference

IPC Request-Reply Pattern (RPC-style communication). More...

Include dependency graph for rte_ipc_request_reply.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  rte_ipc_rr_server_config_t
 Configuration for request-reply server. More...
struct  rte_ipc_rr_request_t
 Incoming request with context for sending reply. More...
struct  rte_ipc_rr_client_config_t
 Configuration for request-reply client. More...

Typedefs

typedef struct rte_ipc_rr_server_s * rte_ipc_rr_server_t
 Request-Reply server channel handle.
typedef struct rte_ipc_rr_client_s * rte_ipc_rr_client_t
 Request-reply client handle.

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 Pattern (RPC-style communication).

Implements synchronous request-reply communication where a client sends a request and blocks (with timeout) waiting for a reply. Server receives the request, processes it, and sends a reply back.

This is a higher-level abstraction built on the base IPC layer.

Safety Properties:

  • Deadlock-free (timeout prevents indefinite blocking)
  • Request IDs prevent reply mismatches
  • Explicit error on timeout (no silent hangs)
  • Type-safe message handling

Use Case:

  • Train controller queries signal database for current signal state
  • Dispatcher requests route information from route manager
  • Any synchronous RPC pattern

Definition in file rte_ipc_request_reply.h.

Typedef Documentation

◆ rte_ipc_rr_server_t

typedef struct rte_ipc_rr_server_s* rte_ipc_rr_server_t

Request-Reply server channel handle.

Definition at line 42 of file rte_ipc_request_reply.h.

◆ rte_ipc_rr_client_t

typedef struct rte_ipc_rr_client_s* rte_ipc_rr_client_t

Request-reply client handle.

Definition at line 149 of file rte_ipc_request_reply.h.

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.

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.

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

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.