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,7 @@ 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. socket . bind ( to_emb_bind_socket ( local) . ok_or ( UdpError :: UnsupportedProto ) ? ) ?;
53
53
54
54
Ok ( socket)
55
55
}
@@ -58,6 +58,7 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Udp
58
58
/// A UDP socket
59
59
/// Implements the `UdpReceive` `UdpSend` and `UdpSplit` traits from `edge-nal`
60
60
pub struct UdpSocket < ' d , const N : usize , const TX_SZ : usize , const RX_SZ : usize , const M : usize > {
61
+ #[ allow( unused) ]
61
62
stack : embassy_net:: Stack < ' d > ,
62
63
socket : embassy_net:: udp:: UdpSocket < ' d > ,
63
64
stack_buffers : & ' d UdpBuffers < N , TX_SZ , RX_SZ , M > ,
@@ -125,7 +126,7 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Udp
125
126
for UdpSocket < ' _ , N , TX_SZ , RX_SZ , M >
126
127
{
127
128
async fn send ( & mut self , remote : SocketAddr , data : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
128
- self . socket . send_to ( data, to_emb_socket ( remote) ) . await ?;
129
+ self . socket . send_to ( data, to_emb_socket ( remote) . ok_or ( UdpError :: UnsupportedProto ) ? ) . await ?;
129
130
130
131
Ok ( ( ) )
131
132
}
@@ -151,7 +152,7 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Udp
151
152
for & UdpSocket < ' _ , N , TX_SZ , RX_SZ , M >
152
153
{
153
154
async fn send ( & mut self , remote : SocketAddr , data : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
154
- self . socket . send_to ( data, remote) . await ?;
155
+ self . socket . send_to ( data, to_emb_socket ( remote) . ok_or ( UdpError :: UnsupportedProto ) ? ) . await ?;
155
156
156
157
Ok ( ( ) )
157
158
}
@@ -189,22 +190,40 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Mul
189
190
{
190
191
async fn join_v4 (
191
192
& mut self ,
193
+ #[ allow( unused) ]
192
194
multicast_addr : Ipv4Addr ,
193
195
_interface : Ipv4Addr ,
194
196
) -> Result < ( ) , Self :: Error > {
195
- self . stack
196
- . join_multicast_group ( IpAddr :: V4 ( multicast_addr) ) ?;
197
+ #[ cfg( feature = "multicast" ) ]
198
+ {
199
+ self . stack
200
+ . join_multicast_group ( crate :: to_emb_addr ( core:: net:: IpAddr :: V4 ( multicast_addr) ) . ok_or ( UdpError :: UnsupportedProto ) ?) ?;
201
+ }
202
+
203
+ #[ cfg( not( feature = "multicast" ) ) ]
204
+ {
205
+ Err ( UdpError :: UnsupportedProto ) ?;
206
+ }
197
207
198
208
Ok ( ( ) )
199
209
}
200
210
201
211
async fn leave_v4 (
202
212
& mut self ,
213
+ #[ allow( unused) ]
203
214
multicast_addr : Ipv4Addr ,
204
215
_interface : Ipv4Addr ,
205
216
) -> Result < ( ) , Self :: Error > {
206
- self . stack
207
- . leave_multicast_group ( IpAddr :: V4 ( multicast_addr) ) ?;
217
+ #[ cfg( feature = "multicast" ) ]
218
+ {
219
+ self . stack
220
+ . leave_multicast_group ( crate :: to_emb_addr ( core:: net:: IpAddr :: V4 ( multicast_addr) ) . ok_or ( UdpError :: UnsupportedProto ) ?) ?;
221
+ }
222
+
223
+ #[ cfg( not( feature = "multicast" ) ) ]
224
+ {
225
+ Err ( UdpError :: UnsupportedProto ) ?;
226
+ }
208
227
209
228
Ok ( ( ) )
210
229
}
@@ -215,22 +234,40 @@ impl<const N: usize, const TX_SZ: usize, const RX_SZ: usize, const M: usize> Mul
215
234
{
216
235
async fn join_v6 (
217
236
& mut self ,
237
+ #[ allow( unused) ]
218
238
multicast_addr : Ipv6Addr ,
219
239
_interface : u32 ,
220
240
) -> Result < ( ) , Self :: Error > {
221
- self . stack
222
- . join_multicast_group ( IpAddr :: V6 ( multicast_addr) ) ?;
241
+ #[ cfg( feature = "multicast" ) ]
242
+ {
243
+ self . stack
244
+ . join_multicast_group ( crate :: to_emb_addr ( core:: net:: IpAddr :: V6 ( multicast_addr) ) . ok_or ( UdpError :: UnsupportedProto ) ?) ?;
245
+ }
246
+
247
+ #[ cfg( not( feature = "multicast" ) ) ]
248
+ {
249
+ Err ( UdpError :: UnsupportedProto ) ?;
250
+ }
223
251
224
252
Ok ( ( ) )
225
253
}
226
254
227
255
async fn leave_v6 (
228
256
& mut self ,
257
+ #[ allow( unused) ]
229
258
multicast_addr : Ipv6Addr ,
230
259
_interface : u32 ,
231
260
) -> Result < ( ) , Self :: Error > {
232
- self . stack
233
- . leave_multicast_group ( IpAddr :: V6 ( multicast_addr) ) ?;
261
+ #[ cfg( feature = "multicast" ) ]
262
+ {
263
+ self . stack
264
+ . leave_multicast_group ( crate :: to_emb_addr ( core:: net:: IpAddr :: V6 ( multicast_addr) ) . ok_or ( UdpError :: UnsupportedProto ) ?) ?;
265
+ }
266
+
267
+ #[ cfg( not( feature = "multicast" ) ) ]
268
+ {
269
+ Err ( UdpError :: UnsupportedProto ) ?;
270
+ }
234
271
235
272
Ok ( ( ) )
236
273
}
@@ -252,8 +289,12 @@ pub enum UdpError {
252
289
Recv ( RecvError ) ,
253
290
Send ( SendError ) ,
254
291
Bind ( BindError ) ,
255
- Multicast ( MulticastError ) ,
292
+ /// The table of joined multicast groups is already full.
293
+ MulticastGroupTableFull ,
294
+ /// Cannot join/leave the given multicast group.
295
+ MulticastUnaddressable ,
256
296
NoBuffers ,
297
+ UnsupportedProto ,
257
298
}
258
299
259
300
impl From < RecvError > for UdpError {
@@ -274,9 +315,13 @@ impl From<BindError> for UdpError {
274
315
}
275
316
}
276
317
277
- impl From < MulticastError > for UdpError {
278
- fn from ( e : MulticastError ) -> Self {
279
- UdpError :: Multicast ( e)
318
+ #[ cfg( all( feature = "multicast" , any( feature = "proto-ipv4" , feature = "proto-ipv6" ) ) ) ]
319
+ impl From < embassy_net:: MulticastError > for UdpError {
320
+ fn from ( e : embassy_net:: MulticastError ) -> Self {
321
+ match e {
322
+ embassy_net:: MulticastError :: GroupTableFull => UdpError :: MulticastGroupTableFull ,
323
+ embassy_net:: MulticastError :: Unaddressable => UdpError :: MulticastUnaddressable ,
324
+ }
280
325
}
281
326
}
282
327
@@ -287,8 +332,10 @@ impl embedded_io_async::Error for UdpError {
287
332
UdpError :: Recv ( _) => ErrorKind :: Other ,
288
333
UdpError :: Send ( _) => ErrorKind :: Other ,
289
334
UdpError :: Bind ( _) => ErrorKind :: Other ,
290
- UdpError :: Multicast ( _) => ErrorKind :: Other ,
335
+ UdpError :: MulticastGroupTableFull => ErrorKind :: Other ,
336
+ UdpError :: MulticastUnaddressable => ErrorKind :: Other ,
291
337
UdpError :: NoBuffers => ErrorKind :: OutOfMemory ,
338
+ UdpError :: UnsupportedProto => ErrorKind :: InvalidInput ,
292
339
}
293
340
}
294
341
}
0 commit comments