@@ -25,7 +25,7 @@ const PORT: u16 = 5353;
25
25
pub struct MdnsService < ' a > {
26
26
host : Host < ' a > ,
27
27
#[ allow( unused) ]
28
- interface : u32 ,
28
+ interface : Option < u32 > ,
29
29
dev_det : & ' a BasicInfoConfig < ' a > ,
30
30
matter_port : u16 ,
31
31
services : RefCell < heapless:: Vec < ( heapless:: String < 40 > , ServiceMode ) , 4 > > ,
@@ -38,8 +38,7 @@ impl<'a> MdnsService<'a> {
38
38
id : u16 ,
39
39
hostname : & ' a str ,
40
40
ip : [ u8 ; 4 ] ,
41
- ipv6 : Option < [ u8 ; 16 ] > ,
42
- interface : u32 ,
41
+ ipv6 : Option < ( [ u8 ; 16 ] , u32 ) > ,
43
42
dev_det : & ' a BasicInfoConfig < ' a > ,
44
43
matter_port : u16 ,
45
44
) -> Self {
@@ -48,9 +47,17 @@ impl<'a> MdnsService<'a> {
48
47
id,
49
48
hostname,
50
49
ip,
51
- ipv6,
50
+ ipv6 : if let Some ( ( ipv6, _) ) = ipv6 {
51
+ Some ( ipv6)
52
+ } else {
53
+ None
54
+ } ,
55
+ } ,
56
+ interface : if let Some ( ( _, interface) ) = ipv6 {
57
+ Some ( interface)
58
+ } else {
59
+ None
52
60
} ,
53
- interface,
54
61
dev_det,
55
62
matter_port,
56
63
services : RefCell :: new ( heapless:: Vec :: new ( ) ) ,
@@ -137,8 +144,13 @@ impl<'a> MdnsRunner<'a> {
137
144
)
138
145
. await ?;
139
146
140
- udp. join_multicast_v6 ( IPV6_BROADCAST_ADDR , self . 0 . interface )
141
- . await ?;
147
+ // V6 multicast does not work with smoltcp yet (see https://github.com/smoltcp-rs/smoltcp/pull/602)
148
+ #[ cfg( not( feature = "embassy-net" ) ) ]
149
+ if let Some ( interface) = self . 0 . interface {
150
+ udp. join_multicast_v6 ( IPV6_BROADCAST_ADDR , interface)
151
+ . await ?;
152
+ }
153
+
142
154
udp. join_multicast_v4 (
143
155
IP_BROADCAST_ADDR ,
144
156
crate :: transport:: network:: Ipv4Addr :: from ( self . 0 . host . ip ) ,
@@ -217,35 +229,37 @@ impl<'a> MdnsRunner<'a> {
217
229
IpAddr :: V4 ( IP_BROADCAST_ADDR ) ,
218
230
IpAddr :: V6 ( IPV6_BROADCAST_ADDR ) ,
219
231
] {
220
- loop {
221
- let sent = {
222
- let mut data = tx_pipe. data . lock ( ) . await ;
232
+ if self . 0 . interface . is_some ( ) || addr == IpAddr :: V4 ( IP_BROADCAST_ADDR ) {
233
+ loop {
234
+ let sent = {
235
+ let mut data = tx_pipe. data . lock ( ) . await ;
223
236
224
- if data. chunk . is_none ( ) {
225
- let len = self . 0 . host . broadcast ( & self . 0 , data. buf , 60 ) ?;
237
+ if data. chunk . is_none ( ) {
238
+ let len = self . 0 . host . broadcast ( & self . 0 , data. buf , 60 ) ?;
226
239
227
- if len > 0 {
228
- info ! ( "Broadasting mDNS entry to {}:{}" , addr, PORT ) ;
240
+ if len > 0 {
241
+ info ! ( "Broadasting mDNS entry to {}:{}" , addr, PORT ) ;
242
+
243
+ data. chunk = Some ( Chunk {
244
+ start : 0 ,
245
+ end : len,
246
+ addr : Address :: Udp ( SocketAddr :: new ( addr, PORT ) ) ,
247
+ } ) ;
229
248
230
- data. chunk = Some ( Chunk {
231
- start : 0 ,
232
- end : len,
233
- addr : Address :: Udp ( SocketAddr :: new ( addr, PORT ) ) ,
234
- } ) ;
249
+ tx_pipe. data_supplied_notification . signal ( ( ) ) ;
250
+ }
235
251
236
- tx_pipe. data_supplied_notification . signal ( ( ) ) ;
252
+ true
253
+ } else {
254
+ false
237
255
}
256
+ } ;
238
257
239
- true
258
+ if sent {
259
+ break ;
240
260
} else {
241
- false
261
+ tx_pipe . data_consumed_notification . wait ( ) . await ;
242
262
}
243
- } ;
244
-
245
- if sent {
246
- break ;
247
- } else {
248
- tx_pipe. data_consumed_notification . wait ( ) . await ;
249
263
}
250
264
}
251
265
}
0 commit comments