nros platform-cffi
Canonical C ABI for porting the nros platform abstraction
Loading...
Searching...
No Matches
platform_net.h
Go to the documentation of this file.
1#ifndef NROS_PLATFORM_NET_H
2#define NROS_PLATFORM_NET_H
3
4#include <stdint.h>
5#include <stddef.h>
6
7#include "nros/platform.h"
8
9#ifdef __cplusplus
10extern "C" {
11#endif
12
48#define NROS_PLATFORM_NET_SOCKET_ERROR ((size_t) -1)
49
50/* ---- TCP ---- */
51
55 const uint8_t *address,
56 const uint8_t *port);
57
60
62int8_t nros_platform_tcp_open(void *sock, const void *endpoint, uint32_t timeout_ms);
63
65int8_t nros_platform_tcp_listen(void *sock, const void *endpoint);
66
68void nros_platform_tcp_close(void *sock);
69
72size_t nros_platform_tcp_read(const void *sock, uint8_t *buf, size_t len);
73
76size_t nros_platform_tcp_read_exact(const void *sock, uint8_t *buf, size_t len);
77
80size_t nros_platform_tcp_send(const void *sock, const uint8_t *buf, size_t len);
81
82/* ---- UDP unicast ---- */
83
85 const uint8_t *address,
86 const uint8_t *port);
88int8_t nros_platform_udp_open(void *sock, const void *endpoint, uint32_t timeout_ms);
89
92int8_t nros_platform_udp_listen(void *sock, const void *endpoint, uint32_t timeout_ms);
93
94void nros_platform_udp_close(void *sock);
95size_t nros_platform_udp_read(const void *sock, uint8_t *buf, size_t len);
96size_t nros_platform_udp_read_exact(const void *sock, uint8_t *buf, size_t len);
97
99size_t nros_platform_udp_send(const void *sock,
100 const uint8_t *buf, size_t len,
101 const void *endpoint);
102
104void nros_platform_udp_set_recv_timeout(const void *sock, uint32_t timeout_ms);
105
106/* ---- UDP multicast (optional) ----
107 *
108 * Signatures mirror the Rust `PlatformUdpMulticast` trait. `lep`
109 * is the local-endpoint storage (caller-allocated); `iface` /
110 * `join` are NUL-terminated strings naming the network interface
111 * and the multicast group to join.
112 */
113
115 const void *endpoint,
116 void *lep,
117 uint32_t timeout_ms,
118 const uint8_t *iface);
119
121 const void *endpoint,
122 uint32_t timeout_ms,
123 const uint8_t *iface,
124 const uint8_t *join);
125
127 void *socksend,
128 const void *rep,
129 const void *lep);
130
131size_t nros_platform_udp_mcast_read(const void *sock,
132 uint8_t *buf, size_t len,
133 const void *lep,
134 void *addr);
135
137 uint8_t *buf, size_t len,
138 const void *lep,
139 void *addr);
140
141size_t nros_platform_udp_mcast_send(const void *sock,
142 const uint8_t *buf, size_t len,
143 const void *endpoint);
144
145/* ---- Socket helpers ---- */
146
149
151int8_t nros_platform_socket_accept(const void *sock_in, void *sock_out);
152
157
160int8_t nros_platform_socket_wait_event(void *peers, void *mutex);
161
162/* ---- Network poll (bare-metal / non-OS stacks) ---- */
163
169
170/* ---- Socket accessor (Phase 154) ---- *
171 *
172 * Every `nros_platform_*` backend stores its socket struct with
173 * `int fd` (or equivalent) at offset 0:
174 *
175 * - POSIX: `typedef struct { int fd; } nros_posix_socket_t;`
176 * - ThreadX: `typedef struct { INT fd; } nros_threadx_socket_t;`
177 * - FreeRTOS+lwIP same shape.
178 *
179 * This accessor lets callers (e.g. zpico-sys's `get_session_fd`
180 * helper used by the read-task wakeup path on ThreadX-Linux) read
181 * the fd without depending on the per-RTOS struct typedef being
182 * visible at compile time. Static-inline so it has zero call
183 * overhead and ships with the header — no extra TU to link.
184 *
185 * Returns -1 if `sock` is NULL. Otherwise returns the leading
186 * `int` (which platforms treat as -1 for an unbound socket).
187 */
188static inline int nros_platform_socket_get_fd(const void *sock) {
189 if (sock == NULL) { return -1; }
190 /* SAFETY: every backend's socket struct is `{ int fd; ... }`,
191 * so the first sizeof(int) bytes of the opaque storage are
192 * the BSD-style fd. Cast-to-int read is the canonical way to
193 * extract it. */
194 return *(const int *)sock;
195}
196
197#ifdef __cplusplus
198} /* extern "C" */
199#endif
200
201#endif /* NROS_PLATFORM_NET_H */
Canonical C ABI for the nros platform abstraction.
size_t len
Definition platform.h:829
int8_t nros_platform_udp_open(void *sock, const void *endpoint, uint32_t timeout_ms)
int8_t nros_platform_socket_accept(const void *sock_in, void *sock_out)
size_t nros_platform_udp_mcast_read_exact(const void *sock, uint8_t *buf, size_t len, const void *lep, void *addr)
size_t nros_platform_tcp_send(const void *sock, const uint8_t *buf, size_t len)
int8_t nros_platform_tcp_create_endpoint(void *ep, const uint8_t *address, const uint8_t *port)
int8_t nros_platform_socket_wait_event(void *peers, void *mutex)
size_t nros_platform_udp_read_exact(const void *sock, uint8_t *buf, size_t len)
size_t nros_platform_udp_read(const void *sock, uint8_t *buf, size_t len)
void nros_platform_network_poll(void)
int8_t nros_platform_udp_create_endpoint(void *ep, const uint8_t *address, const uint8_t *port)
size_t nros_platform_tcp_read(const void *sock, uint8_t *buf, size_t len)
void nros_platform_udp_free_endpoint(void *ep)
size_t nros_platform_udp_mcast_read(const void *sock, uint8_t *buf, size_t len, const void *lep, void *addr)
static int nros_platform_socket_get_fd(const void *sock)
Definition platform_net.h:188
void nros_platform_udp_set_recv_timeout(const void *sock, uint32_t timeout_ms)
int8_t nros_platform_udp_mcast_open(void *sock, const void *endpoint, void *lep, uint32_t timeout_ms, const uint8_t *iface)
int8_t nros_platform_socket_set_non_blocking(const void *sock)
int8_t nros_platform_udp_mcast_listen(void *sock, const void *endpoint, uint32_t timeout_ms, const uint8_t *iface, const uint8_t *join)
size_t nros_platform_tcp_read_exact(const void *sock, uint8_t *buf, size_t len)
int8_t nros_platform_tcp_open(void *sock, const void *endpoint, uint32_t timeout_ms)
int8_t nros_platform_udp_listen(void *sock, const void *endpoint, uint32_t timeout_ms)
void nros_platform_tcp_close(void *sock)
size_t nros_platform_udp_send(const void *sock, const uint8_t *buf, size_t len, const void *endpoint)
void nros_platform_tcp_free_endpoint(void *ep)
int8_t nros_platform_tcp_listen(void *sock, const void *endpoint)
size_t nros_platform_udp_mcast_send(const void *sock, const uint8_t *buf, size_t len, const void *endpoint)
void nros_platform_udp_mcast_close(void *sockrecv, void *socksend, const void *rep, const void *lep)
void nros_platform_udp_close(void *sock)
void nros_platform_socket_close(void *sock)