ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_wifi_c6link.c
Go to the documentation of this file.
1
26
27#include "ra8_wifi_c6link.h"
28
29#include <stdint.h>
30#include <string.h>
31
32#include "ra8_attributes.h"
33#include "ra8_c6link.h"
34#include "ra8_c6link_wifi.h"
35#include "ra8_check.h"
36#include "ra8_err.h"
37#include "ra8_secure.h"
38#include "ra8_wifi.h"
39#include "ra8_wifi_backend.h"
40
42#define RA8_WIFI_C6_TAG "WIFI-C6"
43
44static_assert((uint32_t)k_ra8_wifi_mac_bytes == (uint32_t)k_ra8_c6link_mac_bytes,
45 "the facade and link MAC widths must agree for a straight copy");
46static_assert((uint32_t)k_ra8_wifi_ssid_max == (uint32_t)k_ra8_c6link_ssid_max,
47 "the facade and link SSID capacities must agree for a straight copy");
48
66{
69 self->connected = true;
70 } else if (ev->kind == k_ra8_c6link_event_sta_disconnected) {
71 self->disconnected = true;
72 self->reason = ev->reason;
73 } else {
74 /* boot / bare Wi-Fi events: nothing to latch here. */
75 }
76}
77
98{
101 RA8_CHECK_NULL_PTR(self->link, RA8_WIFI_C6_TAG, "ctx.link");
102
103 ra8_c6link_cfg_t cfg = {};
104 cfg.transport = self->transport;
105 cfg.arena = self->arena;
106 cfg.arena_bytes = self->arena_bytes;
108 cfg.rx_cb = self->rx_cb;
109 cfg.cb_ctx = self;
110
111 const ra8_err_t opened = ra8_c6link_open(self->link, &cfg);
112 if (opened != k_ra8_ok) {
113 return opened;
114 }
115
117 return ra8_c6link_await_ready(self->link, (uint16_t)k_ra8_c6link_announce_transfers, &fw);
118}
119
138{
141 RA8_CHECK_NULL_PTR(self->link, RA8_WIFI_C6_TAG, "ctx.link");
142 return ra8_c6link_close(self->link);
143}
144
163{
166 RA8_CHECK_NULL_PTR(self->link, RA8_WIFI_C6_TAG, "ctx.link");
167 return ra8_c6link_wifi_start(self->link);
168}
169
187{
190 RA8_CHECK_NULL_PTR(self->link, RA8_WIFI_C6_TAG, "ctx.link");
191 return ra8_c6link_wifi_stop(self->link);
192}
193
216RA8_INTERNAL static ra8_err_t internal_c6link_op_join(void* ctx, const char* ssid, const char* psk)
217{
220 RA8_CHECK_NULL_PTR(ssid, RA8_WIFI_C6_TAG, "ssid");
221
222 self->connected = false;
223 self->disconnected = false;
224 self->reason = 0U;
225
226 ra8_c6link_sta_cfg_t sta = {};
227 const ra8_err_t set = ra8_c6link_sta_cfg_set(&sta, ssid, psk);
228 if (set != k_ra8_ok) {
229 ra8_secure_memzero(&sta, sizeof(sta));
230 return set;
231 }
232 const ra8_err_t joined = ra8_c6link_wifi_join(self->link, &sta);
233 ra8_secure_memzero(&sta, sizeof(sta));
234 return joined;
235}
236
255{
258 RA8_CHECK_NULL_PTR(self->link, RA8_WIFI_C6_TAG, "ctx.link");
259 return ra8_c6link_wifi_leave(self->link);
260}
261
283{
286 RA8_CHECK_NULL_PTR(out_link, RA8_WIFI_C6_TAG, "out_link");
287
288 ra8_c6link_stats_t stats = {};
289 const ra8_err_t err =
290 ra8_c6link_poll(self->link, (uint16_t)k_ra8_c6link_announce_transfers, &stats);
291 if (err != k_ra8_ok) {
292 return err;
293 }
294
295 /* Down unless a connect was seen, and a later disconnect wins outright. Two
296 * single-condition tests applied in that order, so the precedence lives in
297 * the sequence rather than in a compound decision that would then owe MC/DC
298 * vectors. */
299 *out_link = k_ra8_wifi_link_down;
300 if (self->connected) {
301 *out_link = k_ra8_wifi_link_up;
302 }
303 if (self->disconnected) {
304 *out_link = k_ra8_wifi_link_down;
305 }
306 return k_ra8_ok;
307}
308
328{
332
333 ra8_c6link_mac_t mac = {};
334 const ra8_err_t err = ra8_c6link_wifi_mac(self->link, &mac);
335 if (err != k_ra8_ok) {
336 return err;
337 }
338 (void)memcpy(out->octet, mac.octet, (size_t)k_ra8_wifi_mac_bytes);
339 return k_ra8_ok;
340}
341
361{
365
366 ra8_c6link_ap_info_t ap = {};
367 const ra8_err_t err = ra8_c6link_wifi_ap_info(self->link, &ap);
368 if (err != k_ra8_ok) {
369 return err;
370 }
371 *out = (ra8_wifi_ap_t){};
372 (void)memcpy(out->bssid.octet, ap.bssid.octet, (size_t)k_ra8_wifi_mac_bytes);
373 (void)memcpy(out->ssid, ap.ssid, sizeof(out->ssid));
374 out->ssid_len = ap.ssid_len;
375 out->channel = ap.channel;
376 out->rssi = ap.rssi;
377 out->authmode = ap.authmode;
378 return k_ra8_ok;
379}
380
398RA8_INTERNAL static void internal_c6link_op_idle(void* ctx, uint16_t ms)
399{
401 if (self == nullptr) {
402 return;
403 }
404 if (self->transport.delay_ms == nullptr) {
405 return;
406 }
407 self->transport.delay_ms(self->transport.ctx, ms);
408}
409
429
431 const ra8_wifi_c6link_cfg_t* cfg,
432 ra8_wifi_cfg_t* out_wcfg)
433{
434 RA8_CHECK_NULL_PTR(self, RA8_WIFI_C6_TAG, "self");
436 RA8_CHECK_NULL_PTR(out_wcfg, RA8_WIFI_C6_TAG, "out_wcfg");
437 RA8_CHECK_NULL_PTR(cfg->link, RA8_WIFI_C6_TAG, "cfg.link");
438 if (cfg->arena_bytes < (uint32_t)k_ra8_c6link_arena_min) {
440 }
441
442 *self = (ra8_wifi_c6link_t){};
443 self->link = cfg->link;
444 self->transport = cfg->transport;
445 self->arena = cfg->arena;
446 self->arena_bytes = cfg->arena_bytes;
447 self->rx_cb = cfg->rx_cb;
448
450 out_wcfg->backend_ctx = self;
451 return k_ra8_ok;
452}
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
Definition ra8_err.h:167
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
void * memcpy(void *dst, const void *src, size_t n)
Copy memory area between non-overlapping regions.
Secure-comparison primitives for the crypto / secure-boot paths.
void ra8_secure_memzero(void *ptr, size_t len)
Securely zero a buffer such that the write cannot be optimised away.
Definition ra8_secure.c:37
A small, uniform Wi-Fi facade: init, connect, get an IP, disconnect.
@ k_ra8_wifi_mac_bytes
Octets in an IEEE 802 address.
Definition ra8_wifi.h:91
@ k_ra8_wifi_ssid_max
Octets in the longest 802.11 SSID.
Definition ra8_wifi.h:92
struct ra8_wifi_backend ra8_wifi_backend_t
One radio's implementation of the operations this facade dispatches.
Definition ra8_wifi.h:342
struct ra8_wifi_ap ra8_wifi_ap_t
struct ra8_wifi_mac ra8_wifi_mac_t
ra8_wifi_link_t
The instantaneous association state a backend reports.
Definition ra8_wifi.h:182
@ k_ra8_wifi_link_up
Station is associated with an AP.
Definition ra8_wifi.h:184
@ k_ra8_wifi_link_down
Station is not associated.
Definition ra8_wifi.h:183
struct ra8_wifi_cfg ra8_wifi_cfg_t
The radio-operation seam ra8_wifi dispatches through.
int32_t authmode
Backend authentication-mode code.
Definition ra8_wifi.h:269
char ssid[k_ra8_wifi_ssid_max+1U]
Its SSID, NUL-terminated.
Definition ra8_wifi.h:265
ra8_wifi_mac_t bssid
Address of the associated AP.
Definition ra8_wifi.h:264
int8_t rssi
Signal level in dBm.
Definition ra8_wifi.h:268
uint8_t ssid_len
Octets of ssid.
Definition ra8_wifi.h:266
uint8_t channel
Primary channel in use.
Definition ra8_wifi.h:267
const ra8_wifi_backend_t * backend
Radio operations; every row set.
Definition ra8_wifi.h:370
void * backend_ctx
Opaque state handed to the backend.
Definition ra8_wifi.h:371
uint8_t octet[k_ra8_wifi_mac_bytes]
Address octets, first on the wire first.
Definition ra8_wifi.h:210