33use serde:: { Serialize , de:: DeserializeOwned } ;
44use tokio:: sync:: mpsc;
55
6- use rustdds:: { DomainParticipant , Publisher , QosPolicyBuilder , Subscriber } ;
6+ use rustdds:: { DomainParticipant , DomainParticipantBuilder , Publisher , QosPolicyBuilder , Subscriber } ;
77
88use crate :: types:: { DdsError , Result } ;
99
@@ -12,6 +12,9 @@ use super::topics::TopicSpec;
1212#[ derive( Default , Debug , Clone ) ]
1313pub struct DdsConfig {
1414 pub domain_id : u16 ,
15+ /// If set, restricts DDS discovery and traffic to the named network interfaces only
16+ /// (e.g. `vec!["eth0".into()]`). When `None`, all multicast-capable interfaces are used.
17+ pub only_networks : Option < Vec < String > > ,
1518}
1619
1720#[ derive( Clone ) ]
@@ -23,7 +26,18 @@ pub struct DdsNode {
2326
2427impl DdsNode {
2528 pub fn new ( config : DdsConfig ) -> Result < Self > {
26- let participant = DomainParticipant :: new ( config. domain_id )
29+ let loopback = if cfg ! ( target_os = "macos" ) {
30+ "lo0"
31+ } else {
32+ "lo"
33+ } ;
34+ let mut builder =
35+ DomainParticipantBuilder :: new ( config. domain_id ) . with_only_networks ( vec ! [ loopback. into( ) ] ) ;
36+ if let Some ( networks) = config. only_networks {
37+ builder = builder. with_only_networks ( networks) ;
38+ }
39+ let participant = builder
40+ . build ( )
2741 . map_err ( |err| DdsError :: InitializationFailed ( err. to_string ( ) ) ) ?;
2842 let qos = QosPolicyBuilder :: new ( ) . build ( ) ;
2943 let publisher = participant
0 commit comments