@@ -67,6 +67,7 @@ impl ProxyIntegration {
67
67
driver : & ( impl SpawnDriver + Clone ) ,
68
68
handle : ProxyHandle ,
69
69
server : Arc < VmbusServerControl > ,
70
+ vtl2_server : Option < Arc < VmbusServerControl > > ,
70
71
mem : Option < & GuestMemory > ,
71
72
) -> io:: Result < Self > {
72
73
let mut proxy = VmbusProxy :: new ( driver, handle) ?;
@@ -79,7 +80,7 @@ impl ProxyIntegration {
79
80
driver
80
81
. spawn (
81
82
"vmbus_proxy" ,
82
- proxy_thread ( driver. clone ( ) , proxy, server, cancel_ctx) ,
83
+ proxy_thread ( driver. clone ( ) , proxy, server, vtl2_server , cancel_ctx) ,
83
84
)
84
85
. detach ( ) ;
85
86
@@ -98,15 +99,21 @@ struct ProxyTask {
98
99
gpadls : Arc < Mutex < HashMap < u64 , HashSet < GpadlId > > > > ,
99
100
proxy : Arc < VmbusProxy > ,
100
101
server : Arc < VmbusServerControl > ,
102
+ vtl2_server : Option < Arc < VmbusServerControl > > ,
101
103
}
102
104
103
105
impl ProxyTask {
104
- fn new ( control : Arc < VmbusServerControl > , proxy : Arc < VmbusProxy > ) -> Self {
106
+ fn new (
107
+ server : Arc < VmbusServerControl > ,
108
+ vtl2_server : Option < Arc < VmbusServerControl > > ,
109
+ proxy : Arc < VmbusProxy > ,
110
+ ) -> Self {
105
111
Self {
106
112
channels : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
107
113
gpadls : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
108
114
proxy,
109
- server : control,
115
+ server,
116
+ vtl2_server,
110
117
}
111
118
}
112
119
@@ -213,12 +220,31 @@ impl ProxyTask {
213
220
offer : vmbus_proxy:: vmbusioctl:: VMBUS_CHANNEL_OFFER ,
214
221
incoming_event : Event ,
215
222
) -> Option < mesh:: Receiver < ChannelRequest > > {
223
+ let server = match offer. TargetVtl {
224
+ 0 => self . server . as_ref ( ) ,
225
+ 2 => {
226
+ if let Some ( server) = self . vtl2_server . as_ref ( ) {
227
+ server
228
+ } else {
229
+ tracing:: error!( ?offer, "VTL2 offer without VTL2 server" ) ;
230
+ return None ;
231
+ }
232
+ }
233
+ _ => {
234
+ tracing:: error!( ?offer, "unsupported offer VTL" ) ;
235
+ return None ;
236
+ }
237
+ } ;
238
+
216
239
let channel_type = if offer. ChannelFlags & VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE != 0 {
217
240
let pipe_mode = u32:: from_ne_bytes ( offer. UserDefined [ ..4 ] . try_into ( ) . unwrap ( ) ) ;
218
241
let message_mode = match pipe_mode {
219
242
vmbus_proxy:: vmbusioctl:: VMBUS_PIPE_TYPE_BYTE => false ,
220
243
vmbus_proxy:: vmbusioctl:: VMBUS_PIPE_TYPE_MESSAGE => true ,
221
- _ => panic ! ( "BUGBUG: unsupported" ) ,
244
+ _ => {
245
+ tracing:: error!( ?offer, "unsupported offer pipe mode" ) ;
246
+ return None ;
247
+ }
222
248
} ;
223
249
ChannelType :: Pipe { message_mode }
224
250
} else {
@@ -244,7 +270,8 @@ impl ProxyTask {
244
270
} ;
245
271
let ( request_send, request_recv) = mesh:: channel ( ) ;
246
272
let ( server_request_send, server_request_recv) = mesh:: channel ( ) ;
247
- let recv = self . server . send . call_failable (
273
+
274
+ let recv = server. send . call_failable (
248
275
OfferRequest :: Offer ,
249
276
OfferInfo {
250
277
params : offer. into ( ) ,
@@ -429,11 +456,12 @@ async fn proxy_thread(
429
456
spawner : impl Spawn ,
430
457
proxy : VmbusProxy ,
431
458
server : Arc < VmbusServerControl > ,
459
+ vtl2_server : Option < Arc < VmbusServerControl > > ,
432
460
mut cancel : CancelContext ,
433
461
) {
434
462
let ( send, recv) = mesh:: channel ( ) ;
435
463
let proxy = Arc :: new ( proxy) ;
436
- let task = Arc :: new ( ProxyTask :: new ( server, Arc :: clone ( & proxy) ) ) ;
464
+ let task = Arc :: new ( ProxyTask :: new ( server, vtl2_server , Arc :: clone ( & proxy) ) ) ;
437
465
let offers = task. run_offers ( send) ;
438
466
let requests = task. run_channel_requests ( spawner, recv) ;
439
467
let cancellation = async {
0 commit comments