1
+ use std:: collections:: HashMap ;
1
2
use std:: os:: unix:: io:: RawFd ;
3
+ use std:: path:: PathBuf ;
2
4
use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
3
5
use std:: sync:: { Arc , Mutex } ;
4
6
use std:: thread;
@@ -8,9 +10,11 @@ use super::super::Queue as VirtQueue;
8
10
use super :: super :: VIRTIO_MMIO_INT_VRING ;
9
11
use super :: muxer:: { push_packet, MuxerRx , ProxyMap } ;
10
12
use super :: muxer_rxq:: MuxerRxQ ;
11
- use super :: proxy:: { ProxyRemoval , ProxyUpdate } ;
13
+ use super :: proxy:: { NewProxyType , Proxy , ProxyRemoval , ProxyUpdate } ;
12
14
use super :: tcp:: TcpProxy ;
13
15
16
+ use crate :: virtio:: vsock:: defs;
17
+ use crate :: virtio:: vsock:: unix:: { UnixAcceptorProxy , UnixProxy } ;
14
18
use crossbeam_channel:: Sender ;
15
19
use rand:: { rngs:: ThreadRng , thread_rng, Rng } ;
16
20
use utils:: epoll:: { ControlOperation , Epoll , EpollEvent , EventSet } ;
@@ -29,6 +33,7 @@ pub struct MuxerThread {
29
33
intc : Option < GicV3 > ,
30
34
irq_line : Option < u32 > ,
31
35
reaper_sender : Sender < u64 > ,
36
+ unix_ipc_port_map : HashMap < u32 , ( PathBuf , bool ) > ,
32
37
}
33
38
34
39
impl MuxerThread {
@@ -45,6 +50,7 @@ impl MuxerThread {
45
50
intc : Option < GicV3 > ,
46
51
irq_line : Option < u32 > ,
47
52
reaper_sender : Sender < u64 > ,
53
+ unix_ipc_port_map : HashMap < u32 , ( PathBuf , bool ) > ,
48
54
) -> Self {
49
55
MuxerThread {
50
56
cid,
@@ -58,6 +64,7 @@ impl MuxerThread {
58
64
intc,
59
65
irq_line,
60
66
reaper_sender,
67
+ unix_ipc_port_map,
61
68
}
62
69
}
63
70
@@ -111,24 +118,36 @@ impl MuxerThread {
111
118
112
119
let mut should_signal = update. signal_queue ;
113
120
114
- if let Some ( ( peer_port, accept_fd) ) = update. new_proxy {
121
+ if let Some ( ( peer_port, accept_fd, proxy_type ) ) = update. new_proxy {
115
122
let local_port: u32 = thread_rng. gen_range ( 1024 ..u32:: MAX ) ;
116
123
let new_id: u64 = ( peer_port as u64 ) << 32 | local_port as u64 ;
117
- let new_proxy = TcpProxy :: new_reverse (
118
- new_id,
119
- self . cid ,
120
- id,
121
- local_port,
122
- peer_port,
123
- accept_fd,
124
- self . mem . clone ( ) ,
125
- self . queue . clone ( ) ,
126
- self . rxq . clone ( ) ,
127
- ) ;
124
+ let new_proxy: Box < dyn Proxy > = match proxy_type {
125
+ NewProxyType :: Tcp => Box :: new ( TcpProxy :: new_reverse (
126
+ new_id,
127
+ self . cid ,
128
+ id,
129
+ local_port,
130
+ peer_port,
131
+ accept_fd,
132
+ self . mem . clone ( ) ,
133
+ self . queue . clone ( ) ,
134
+ self . rxq . clone ( ) ,
135
+ ) ) ,
136
+ NewProxyType :: Unix => Box :: new ( UnixProxy :: new_reverse (
137
+ new_id,
138
+ self . cid ,
139
+ local_port,
140
+ peer_port,
141
+ accept_fd,
142
+ self . mem . clone ( ) ,
143
+ self . queue . clone ( ) ,
144
+ self . rxq . clone ( ) ,
145
+ ) ) ,
146
+ } ;
128
147
self . proxy_map
129
148
. write ( )
130
149
. unwrap ( )
131
- . insert ( new_id, Mutex :: new ( Box :: new ( new_proxy) ) ) ;
150
+ . insert ( new_id, Mutex :: new ( new_proxy) ) ;
132
151
if let Some ( proxy) = self . proxy_map . read ( ) . unwrap ( ) . get ( & new_id) {
133
152
proxy. lock ( ) . unwrap ( ) . push_op_request ( ) ;
134
153
} ;
@@ -147,8 +166,32 @@ impl MuxerThread {
147
166
}
148
167
}
149
168
169
+ fn create_lisening_ipc_sockets ( & self ) {
170
+ for ( port, ( path, do_listen) ) in & self . unix_ipc_port_map {
171
+ if !do_listen {
172
+ continue ;
173
+ }
174
+ let id = ( * port as u64 ) << 32 | defs:: TSI_PROXY_PORT as u64 ;
175
+ let proxy = match UnixAcceptorProxy :: new ( id, path, * port) {
176
+ Ok ( proxy) => proxy,
177
+ Err ( e) => {
178
+ warn ! ( "Failed to create listening proxy at {:?}: {:?}" , path, e) ;
179
+ continue ;
180
+ }
181
+ } ;
182
+ self . proxy_map
183
+ . write ( )
184
+ . unwrap ( )
185
+ . insert ( id, Mutex :: new ( Box :: new ( proxy) ) ) ;
186
+ if let Some ( proxy) = self . proxy_map . read ( ) . unwrap ( ) . get ( & id) {
187
+ self . update_polling ( id, proxy. lock ( ) . unwrap ( ) . as_raw_fd ( ) , EventSet :: IN ) ;
188
+ } ;
189
+ }
190
+ }
191
+
150
192
fn work ( self ) {
151
193
let mut thread_rng = thread_rng ( ) ;
194
+ self . create_lisening_ipc_sockets ( ) ;
152
195
loop {
153
196
let mut epoll_events = vec ! [ EpollEvent :: new( EventSet :: empty( ) , 0 ) ; 32 ] ;
154
197
match self
0 commit comments