@@ -11,16 +11,22 @@ pub struct NetifSelector {
11
11
pub ( super ) cached_netif : ArcSwap < sys:: Netif > ,
12
12
provider : sys:: NetifProvider ,
13
13
resolver : sys:: Resolver ,
14
+ outbound_resolver : Option < Weak < dyn Resolver > > ,
14
15
me : Weak < Self > ,
15
16
}
16
17
17
18
impl NetifSelector {
18
- pub fn new ( selection : SelectionMode , prefer : FamilyPreference ) -> Arc < Self > {
19
+ pub fn new (
20
+ selection : SelectionMode ,
21
+ prefer : FamilyPreference ,
22
+ create_outbound_resolver : impl FnOnce ( & Weak < Self > ) -> Option < Weak < dyn Resolver > > ,
23
+ ) -> Arc < Self > {
19
24
let dummy_netif = sys:: Netif {
20
25
name : String :: from ( "dummy_netif_awaiting_change" ) ,
21
26
..sys:: Netif :: default ( )
22
27
} ;
23
28
Arc :: < Self > :: new_cyclic ( |this| {
29
+ let outbound_resolver = create_outbound_resolver ( this) ;
24
30
let this = this. clone ( ) ;
25
31
let provider = sys:: NetifProvider :: new ( {
26
32
let this = this. clone ( ) ;
@@ -35,6 +41,7 @@ impl NetifSelector {
35
41
cached_netif : ArcSwap :: new ( Arc :: new ( dummy_netif) ) ,
36
42
provider,
37
43
resolver : sys:: Resolver :: new ( this. clone ( ) ) ,
44
+ outbound_resolver,
38
45
me : this,
39
46
}
40
47
} )
@@ -72,9 +79,15 @@ impl StreamOutboundFactory for NetifSelector {
72
79
) -> FlowResult < ( Box < dyn Stream > , Buffer ) > {
73
80
let preference = self . selection . load ( ) . 1 ;
74
81
let netif = self . cached_netif . load ( ) ;
82
+ let resolver = self
83
+ . outbound_resolver
84
+ . as_ref ( )
85
+ . map ( |r| r. upgrade ( ) . ok_or ( FlowError :: NoOutbound ) )
86
+ . transpose ( ) ?
87
+ . unwrap_or_else ( || self . me . upgrade ( ) . unwrap ( ) ) ;
75
88
crate :: plugin:: socket:: dial_stream (
76
89
context,
77
- self . me . upgrade ( ) . unwrap ( ) ,
90
+ resolver ,
78
91
// A workaround for E0308 "one type is more general than the other"
79
92
// https://github.com/rust-lang/rust/issues/70263
80
93
Some ( |s : & mut _ | sys:: bind_socket_v4 ( & netif, s) ) . filter ( |_| {
@@ -100,9 +113,15 @@ impl DatagramSessionFactory for NetifSelector {
100
113
async fn bind ( & self , context : Box < FlowContext > ) -> FlowResult < Box < dyn DatagramSession > > {
101
114
let preference = self . selection . load ( ) . 1 ;
102
115
let netif = self . cached_netif . load_full ( ) ;
116
+ let resolver = self
117
+ . outbound_resolver
118
+ . as_ref ( )
119
+ . map ( |r| r. upgrade ( ) . ok_or ( FlowError :: NoOutbound ) )
120
+ . transpose ( ) ?
121
+ . unwrap_or_else ( || self . me . upgrade ( ) . unwrap ( ) ) ;
103
122
crate :: plugin:: socket:: dial_datagram_session (
104
123
& context,
105
- self . me . upgrade ( ) . unwrap ( ) ,
124
+ resolver ,
106
125
// A workaround for E0308 "one type is more general than the other"
107
126
// https://github.com/rust-lang/rust/issues/70263
108
127
Some ( {
0 commit comments