From 942b0455a50243e72806534638f92ed6182898b6 Mon Sep 17 00:00:00 2001 From: xuxuepeng Date: Tue, 11 Apr 2023 19:39:22 +0800 Subject: [PATCH 1/2] Add vsock support Signed-off-by: xuxuepeng --- src/client/client.rs | 47 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/client/client.rs b/src/client/client.rs index 3f3e94a..7b9abae 100644 --- a/src/client/client.rs +++ b/src/client/client.rs @@ -75,7 +75,35 @@ fn unix_sock(r#abstract: bool, socket_path: &str) -> Result { Ok(sockaddr) } -fn connect_to_socket(abs: bool, address: &str) -> Result { +fn virtio_vsock(address: &str) -> Result { + let (cid, port) = { + let vec: Vec = address.split(":").map(String::from).collect(); + if vec.len() < 2 { + let err_msg = format!("vsock address {address} is invalid"); + return Err(other!(err_msg)); + } + let cid = vec[0].parse::().map_err(other_error!(e, "failed to parse cid: "))?; + let port = vec[1].parse::().map_err(other_error!(e, "failed to parse port: "))?; + (cid, port) + }; + let sockaddr = SockAddr::Vsock(VsockAddr::new(cid, port)); + Ok(sockaddr) +} + +fn connect_to_vsock(address: &str) -> Result { + let fd = socket( + AddressFamily::Vsock, + SockType::Stream, + SockFlag::empty(), + None, + ) + .map_err(other_error!(e, "failed to create socket fd: "))?; + let sockaddr = virtio_vsock(address)?; + connect(fd, &sockaddr).map_err(other_error!(e, "failed to connect vsock: "))?; + Ok(fd) +} + +fn connect_to_unix_socket(abs: bool, address: &str) -> Result { let fd = socket( AddressFamily::Unix, SockType::Stream, @@ -90,14 +118,21 @@ fn connect_to_socket(abs: bool, address: &str) -> Result { } pub fn new_conn(container_id: &String, addr: &String) -> Result<()> { - let address = if addr.starts_with("unix://") { - addr.strip_prefix("unix://").unwrap() + let fd; + if addr.starts_with("vsock://") { + let address = addr.strip_prefix("vsock://").unwrap(); + fd = connect_to_vsock(address)?; } else { - addr + let address; + if addr.starts_with("unix://") { + address = addr.strip_prefix("unix://").unwrap(); + } else { + address = addr; + } + let path = Path::new(&MAIN_SEPARATOR.to_string()).join(address); + fd = connect_to_unix_socket(!addr.starts_with("unix://"), &path.to_string_lossy())?; }; - let path = Path::new(&MAIN_SEPARATOR.to_string()).join(address); - let fd = connect_to_socket(!addr.starts_with("unix://"), &path.to_string_lossy())?; TTRPC_CLIENTS.lock().unwrap().insert( container_id.clone(), Store { -- Gitee From ea4cc3e71aa3d1729efef3dee40a63fcf131ff8f Mon Sep 17 00:00:00 2001 From: xuxuepeng Date: Thu, 13 Apr 2023 11:48:02 +0800 Subject: [PATCH 2/2] Fix comments Signed-off-by: xuxuepeng --- src/client/client.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/client/client.rs b/src/client/client.rs index 7b9abae..2151e23 100644 --- a/src/client/client.rs +++ b/src/client/client.rs @@ -78,7 +78,7 @@ fn unix_sock(r#abstract: bool, socket_path: &str) -> Result { fn virtio_vsock(address: &str) -> Result { let (cid, port) = { let vec: Vec = address.split(":").map(String::from).collect(); - if vec.len() < 2 { + if vec.len() != 2 { let err_msg = format!("vsock address {address} is invalid"); return Err(other!(err_msg)); } @@ -118,19 +118,17 @@ fn connect_to_unix_socket(abs: bool, address: &str) -> Result { } pub fn new_conn(container_id: &String, addr: &String) -> Result<()> { - let fd; - if addr.starts_with("vsock://") { + let fd = if addr.starts_with("vsock://") { let address = addr.strip_prefix("vsock://").unwrap(); - fd = connect_to_vsock(address)?; + connect_to_vsock(address)? } else { - let address; - if addr.starts_with("unix://") { - address = addr.strip_prefix("unix://").unwrap(); + let address = if addr.starts_with("unix://") { + addr.strip_prefix("unix://").unwrap() } else { - address = addr; - } + addr + }; let path = Path::new(&MAIN_SEPARATOR.to_string()).join(address); - fd = connect_to_unix_socket(!addr.starts_with("unix://"), &path.to_string_lossy())?; + connect_to_unix_socket(!addr.starts_with("unix://"), &path.to_string_lossy())? }; TTRPC_CLIENTS.lock().unwrap().insert( -- Gitee