Safe Communication Framework 0.1.0 build feea4f9
ERTMS/ETCS safe communication (Subset-037 EuroRadio, Subset-098 RBC/RBC), CENELEC EN 50128 SIL 4 oriented
Loading...
Searching...
No Matches
protocol_adapter.c
Go to the documentation of this file.
1
6
7#include <string.h>
8
9static safecomm_status_t adapter_open_saf(safecomm_adapter_t *adapter,
10 const safecomm_adapter_config_t *config,
11 const safecomm_transport_t *transport)
12{
13 if ((adapter == NULL) || (config == NULL) || (transport == NULL))
14 {
16 }
17
18 (void)memset(adapter, 0, sizeof(*adapter));
19 adapter->cfg = *config;
20
22 (void)memset(&saf_cfg, 0, sizeof(saf_cfg));
23
24 saf_cfg.role = config->role;
25 saf_cfg.etcs_id_self = config->id_self;
26 saf_cfg.etcs_id_peer = config->id_peer;
27 (void)memcpy(saf_cfg.kmac, config->kmac, SAFECOMM_MAC_KEY_LEN);
28
29 if (config->sublayer == SAFECOMM_SUBLAYER_SAF_SS098)
30 {
31 saf_cfg.t_connect_ms = (config->t_connect_ms > 0U) ? config->t_connect_ms : 5000U;
32 saf_cfg.t_supervision_ms = (config->t_supervision_ms > 0U) ? config->t_supervision_ms : 10000U;
33 }
34 else
35 {
36 saf_cfg.t_connect_ms = (config->t_connect_ms > 0U) ? config->t_connect_ms : 10000U;
37 saf_cfg.t_supervision_ms = (config->t_supervision_ms > 0U) ? config->t_supervision_ms : 20000U;
38 }
39
40 safecomm_status_t st = safecomm_saf_init(&adapter->conn, &saf_cfg, transport);
41 if (st != SAFECOMM_STATUS_OK)
42 {
43 return st;
44 }
45
46 adapter->is_open = true;
47 return SAFECOMM_STATUS_OK;
48}
49
50static safecomm_status_t adapter_send_saf(safecomm_adapter_t *adapter,
51 const void *data, size_t size)
52{
53 if ((adapter == NULL) || (!adapter->is_open))
54 {
56 }
57 return safecomm_saf_send(&adapter->conn, (const uint8_t *)data, size);
58}
59
60static safecomm_status_t adapter_receive_saf(safecomm_adapter_t *adapter,
61 void *out_buf, size_t buffer_size,
62 size_t *out_len)
63{
64 if ((adapter == NULL) || (!adapter->is_open))
65 {
67 }
68 return safecomm_saf_recv(&adapter->conn, (uint8_t *)out_buf, buffer_size, out_len);
69}
70
71static safecomm_status_t adapter_close_saf(safecomm_adapter_t *adapter)
72{
73 if ((adapter == NULL) || (!adapter->is_open))
74 {
75 return SAFECOMM_STATUS_OK;
76 }
77 safecomm_status_t st = safecomm_saf_disconnect(&adapter->conn);
78 adapter->is_open = false;
79 return st;
80}
81
82/* Subset-098 Protocol Adapter Vtable */
83static const safecomm_protocol_ops_t G_SS098_OPS = {
84 .open = adapter_open_saf,
85 .send = adapter_send_saf,
86 .receive = adapter_receive_saf,
87 .close = adapter_close_saf
88};
89
90/* Subset-037 Protocol Adapter Vtable */
91static const safecomm_protocol_ops_t G_SS037_OPS = {
92 .open = adapter_open_saf,
93 .send = adapter_send_saf,
94 .receive = adapter_receive_saf,
95 .close = adapter_close_saf
96};
97
98/* RaSTA (DIN VDE V 0831-102) Protocol Adapter Hook */
99static safecomm_status_t adapter_open_rasta(safecomm_adapter_t *adapter,
100 const safecomm_adapter_config_t *config,
101 const safecomm_transport_t *transport)
102{
103 if ((adapter == NULL) || (config == NULL) || (transport == NULL))
104 {
106 }
107 /* RaSTA RedL + SafeL architecture integration hook */
109}
110
111static const safecomm_protocol_ops_t G_RASTA_OPS = {
112 .open = adapter_open_rasta,
113 .send = adapter_send_saf,
114 .receive = adapter_receive_saf,
115 .close = adapter_close_saf
116};
117
119{
120 return &G_SS098_OPS;
121}
122
124{
125 return &G_SS037_OPS;
126}
127
129{
130 return &G_RASTA_OPS;
131}
#define SAFECOMM_MAC_KEY_LEN
Definition mac.h:34
RTE Protocol Adapter integration and Sublayer Abstraction.
const safecomm_protocol_ops_t * safecomm_protocol_adapter_get_rasta(void)
Retrieve the RaSTA (DIN VDE V 0831-102) Protocol Adapter operations vtable.
@ SAFECOMM_SUBLAYER_SAF_SS098
const safecomm_protocol_ops_t * safecomm_protocol_adapter_get_ss098(void)
Retrieve the Subset-098 RBC-RBC Protocol Adapter operations vtable.
const safecomm_protocol_ops_t * safecomm_protocol_adapter_get_ss037(void)
Retrieve the Subset-037 EuroRadio Protocol Adapter operations vtable.
safecomm_status_t safecomm_saf_send(safecomm_saf_conn_t *conn, const uint8_t *pdu, size_t pdu_len)
Send one user PDU as a MAC-protected, sequence-numbered Sa-DATA.
Definition saf.c:643
safecomm_status_t safecomm_saf_recv(safecomm_saf_conn_t *conn, uint8_t *out, size_t out_cap, size_t *out_len)
Receive and verify one Sa-DATA PDU (blocking).
Definition saf.c:657
safecomm_status_t safecomm_saf_init(safecomm_saf_conn_t *conn, const safecomm_saf_config_t *cfg, const safecomm_transport_t *transport)
Initialise a SaF connection object (no I/O yet).
Definition saf.c:125
safecomm_status_t
Result of a Safe Communication Framework operation.
Definition status.h:17
@ SAFECOMM_STATUS_STATE
Definition status.h:21
@ SAFECOMM_STATUS_INVALID_PARAM
Definition status.h:19
@ SAFECOMM_STATUS_NOT_IMPLEMENTED
Definition status.h:29
@ SAFECOMM_STATUS_OK
Definition status.h:18
Adapter connection endpoint configuration.
Adapter handle representation.
SAPI-compatible operations vtable for safe communication channels.
Static configuration for one SaF connection.
Definition saf.h:77
uint32_t etcs_id_peer
Definition saf.h:81
uint8_t kmac[SAFECOMM_MAC_KEY_LEN]
Definition saf.h:79
uint32_t t_connect_ms
Definition saf.h:83
uint32_t etcs_id_self
Definition saf.h:80
uint32_t t_supervision_ms
Definition saf.h:84
A consumer-supplied bearer the SaF layer runs over.
Definition transport.h:56