1
- use core:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr } ;
1
+ use core:: net:: { Ipv4Addr , Ipv6Addr , SocketAddr } ;
2
2
use core:: ptr:: NonNull ;
3
3
4
4
use edge_nal:: { MulticastV4 , MulticastV6 , Readable , UdpBind , UdpReceive , UdpSend , UdpSplit } ;
5
5
6
6
use embassy_net:: udp:: { BindError , PacketMetadata , RecvError , SendError } ;
7
- use embassy_net:: { MulticastError , Stack } ;
7
+ use embassy_net:: Stack ;
8
8
9
9
use embedded_io_async:: { ErrorKind , ErrorType } ;
10
10
@@ -49,7 +49,9 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Udp
49
49
async fn bind ( & self , local : SocketAddr ) -> Result < Self :: Socket < ' _ > , Self :: Error > {
50
50
let mut socket = UdpSocket :: new ( self . stack , self . buffers ) ?;
51
51
52
- socket. socket . bind ( to_emb_bind_socket ( local) ) ?;
52
+ socket
53
+ . socket
54
+ . bind ( to_emb_bind_socket ( local) . ok_or ( UdpError :: UnsupportedProto ) ?) ?;
53
55
54
56
Ok ( socket)
55
57
}
@@ -58,6 +60,7 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Udp
58
60
/// A UDP socket
59
61
/// Implements the `UdpReceive` `UdpSend` and `UdpSplit` traits from `edge-nal`
60
62
pub struct UdpSocket < ' d , const N : usize , const TX_SZ : usize , const RX_SZ : usize , const M : usize > {
63
+ #[ allow( unused) ]
61
64
stack : embassy_net:: Stack < ' d > ,
62
65
socket : embassy_net:: udp:: UdpSocket < ' d > ,
63
66
stack_buffers : & ' d UdpBuffers < N , TX_SZ , RX_SZ , M > ,
@@ -125,7 +128,12 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Udp
125
128
for UdpSocket < ' _ , N , TX_SZ , RX_SZ , M >
126
129
{
127
130
async fn send ( & mut self , remote : SocketAddr , data : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
128
- self . socket . send_to ( data, to_emb_socket ( remote) ) . await ?;
131
+ self . socket
132
+ . send_to (
133
+ data,
134
+ to_emb_socket ( remote) . ok_or ( UdpError :: UnsupportedProto ) ?,
135
+ )
136
+ . await ?;
129
137
130
138
Ok ( ( ) )
131
139
}
@@ -151,7 +159,12 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Udp
151
159
for & UdpSocket < ' _ , N , TX_SZ , RX_SZ , M >
152
160
{
153
161
async fn send ( & mut self , remote : SocketAddr , data : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
154
- self . socket . send_to ( data, remote) . await ?;
162
+ self . socket
163
+ . send_to (
164
+ data,
165
+ to_emb_socket ( remote) . ok_or ( UdpError :: UnsupportedProto ) ?,
166
+ )
167
+ . await ?;
155
168
156
169
Ok ( ( ) )
157
170
}
@@ -189,22 +202,42 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Mul
189
202
{
190
203
async fn join_v4 (
191
204
& mut self ,
192
- multicast_addr : Ipv4Addr ,
205
+ # [ allow ( unused ) ] multicast_addr : Ipv4Addr ,
193
206
_interface : Ipv4Addr ,
194
207
) -> Result < ( ) , Self :: Error > {
195
- self . stack
196
- . join_multicast_group ( IpAddr :: V4 ( multicast_addr) ) ?;
208
+ #[ cfg( feature = "multicast" ) ]
209
+ {
210
+ self . stack . join_multicast_group (
211
+ crate :: to_emb_addr ( core:: net:: IpAddr :: V4 ( multicast_addr) )
212
+ . ok_or ( UdpError :: UnsupportedProto ) ?,
213
+ ) ?;
214
+ }
215
+
216
+ #[ cfg( not( feature = "multicast" ) ) ]
217
+ {
218
+ Err ( UdpError :: UnsupportedProto ) ?;
219
+ }
197
220
198
221
Ok ( ( ) )
199
222
}
200
223
201
224
async fn leave_v4 (
202
225
& mut self ,
203
- multicast_addr : Ipv4Addr ,
226
+ # [ allow ( unused ) ] multicast_addr : Ipv4Addr ,
204
227
_interface : Ipv4Addr ,
205
228
) -> Result < ( ) , Self :: Error > {
206
- self . stack
207
- . leave_multicast_group ( IpAddr :: V4 ( multicast_addr) ) ?;
229
+ #[ cfg( feature = "multicast" ) ]
230
+ {
231
+ self . stack . leave_multicast_group (
232
+ crate :: to_emb_addr ( core:: net:: IpAddr :: V4 ( multicast_addr) )
233
+ . ok_or ( UdpError :: UnsupportedProto ) ?,
234
+ ) ?;
235
+ }
236
+
237
+ #[ cfg( not( feature = "multicast" ) ) ]
238
+ {
239
+ Err ( UdpError :: UnsupportedProto ) ?;
240
+ }
208
241
209
242
Ok ( ( ) )
210
243
}
@@ -215,22 +248,42 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Mul
215
248
{
216
249
async fn join_v6 (
217
250
& mut self ,
218
- multicast_addr : Ipv6Addr ,
251
+ # [ allow ( unused ) ] multicast_addr : Ipv6Addr ,
219
252
_interface : u32 ,
220
253
) -> Result < ( ) , Self :: Error > {
221
- self . stack
222
- . join_multicast_group ( IpAddr :: V6 ( multicast_addr) ) ?;
254
+ #[ cfg( feature = "multicast" ) ]
255
+ {
256
+ self . stack . join_multicast_group (
257
+ crate :: to_emb_addr ( core:: net:: IpAddr :: V6 ( multicast_addr) )
258
+ . ok_or ( UdpError :: UnsupportedProto ) ?,
259
+ ) ?;
260
+ }
261
+
262
+ #[ cfg( not( feature = "multicast" ) ) ]
263
+ {
264
+ Err ( UdpError :: UnsupportedProto ) ?;
265
+ }
223
266
224
267
Ok ( ( ) )
225
268
}
226
269
227
270
async fn leave_v6 (
228
271
& mut self ,
229
- multicast_addr : Ipv6Addr ,
272
+ # [ allow ( unused ) ] multicast_addr : Ipv6Addr ,
230
273
_interface : u32 ,
231
274
) -> Result < ( ) , Self :: Error > {
232
- self . stack
233
- . leave_multicast_group ( IpAddr :: V6 ( multicast_addr) ) ?;
275
+ #[ cfg( feature = "multicast" ) ]
276
+ {
277
+ self . stack . leave_multicast_group (
278
+ crate :: to_emb_addr ( core:: net:: IpAddr :: V6 ( multicast_addr) )
279
+ . ok_or ( UdpError :: UnsupportedProto ) ?,
280
+ ) ?;
281
+ }
282
+
283
+ #[ cfg( not( feature = "multicast" ) ) ]
284
+ {
285
+ Err ( UdpError :: UnsupportedProto ) ?;
286
+ }
234
287
235
288
Ok ( ( ) )
236
289
}
@@ -252,8 +305,12 @@ pub enum UdpError {
252
305
Recv ( RecvError ) ,
253
306
Send ( SendError ) ,
254
307
Bind ( BindError ) ,
255
- Multicast ( MulticastError ) ,
308
+ /// The table of joined multicast groups is already full.
309
+ MulticastGroupTableFull ,
310
+ /// Cannot join/leave the given multicast group.
311
+ MulticastUnaddressable ,
256
312
NoBuffers ,
313
+ UnsupportedProto ,
257
314
}
258
315
259
316
impl From < RecvError > for UdpError {
@@ -274,9 +331,16 @@ impl From<BindError> for UdpError {
274
331
}
275
332
}
276
333
277
- impl From < MulticastError > for UdpError {
278
- fn from ( e : MulticastError ) -> Self {
279
- UdpError :: Multicast ( e)
334
+ #[ cfg( all(
335
+ feature = "multicast" ,
336
+ any( feature = "proto-ipv4" , feature = "proto-ipv6" )
337
+ ) ) ]
338
+ impl From < embassy_net:: MulticastError > for UdpError {
339
+ fn from ( e : embassy_net:: MulticastError ) -> Self {
340
+ match e {
341
+ embassy_net:: MulticastError :: GroupTableFull => UdpError :: MulticastGroupTableFull ,
342
+ embassy_net:: MulticastError :: Unaddressable => UdpError :: MulticastUnaddressable ,
343
+ }
280
344
}
281
345
}
282
346
@@ -287,8 +351,10 @@ impl embedded_io_async::Error for UdpError {
287
351
UdpError :: Recv ( _) => ErrorKind :: Other ,
288
352
UdpError :: Send ( _) => ErrorKind :: Other ,
289
353
UdpError :: Bind ( _) => ErrorKind :: Other ,
290
- UdpError :: Multicast ( _) => ErrorKind :: Other ,
354
+ UdpError :: MulticastGroupTableFull => ErrorKind :: Other ,
355
+ UdpError :: MulticastUnaddressable => ErrorKind :: Other ,
291
356
UdpError :: NoBuffers => ErrorKind :: OutOfMemory ,
357
+ UdpError :: UnsupportedProto => ErrorKind :: InvalidInput ,
292
358
}
293
359
}
294
360
}
0 commit comments