Browse Source

Add script to set up vsock socket

Alice Wang 2 years ago
parent
commit
a59fd38ef2
3 changed files with 62 additions and 4 deletions
  1. 6 3
      examples/aarch64/Makefile
  2. 1 1
      examples/aarch64/src/main.rs
  3. 55 0
      examples/aarch64/vsock_server.cc

+ 6 - 3
examples/aarch64/Makefile

@@ -4,6 +4,7 @@ kernel := target/$(target)/$(mode)/aarch64
 kernel_qemu_bin := target/$(target)/$(mode)/aarch64_qemu.bin
 kernel_crosvm_bin := target/$(target)/$(mode)/aarch64_crosvm.bin
 img := target/$(target)/$(mode)/img
+vsock_server_bin := target/$(target)/$(mode)/vsock_server.bin
 
 sysroot := $(shell rustc --print sysroot)
 objdump := $(shell find $(sysroot) -name llvm-objdump) --arch-name=aarch64
@@ -34,6 +35,9 @@ $(kernel_qemu_bin): kernel_qemu
 $(kernel_crosvm_bin): kernel_crosvm
 	aarch64-linux-gnu-objcopy -O binary $(kernel) $(kernel_crosvm_bin)
 
+$(vsock_server_bin):
+	gcc vsock_server.cc -o $(vsock_server_bin)
+
 asm: kernel
 	$(objdump) -d $(kernel) | less
 
@@ -46,8 +50,8 @@ header: kernel
 clean:
 	cargo clean
 
-qemu: $(kernel_qemu_bin) $(img)
-	(nc localhost -l 1235 -v) &
+qemu: $(kernel_qemu_bin) $(img) $(vsock_server_bin)
+	$(vsock_server_bin) &
 	qemu-system-aarch64 \
 	  $(QEMU_ARGS) \
 		-machine virt \
@@ -65,7 +69,6 @@ qemu: $(kernel_qemu_bin) $(img)
 		-device virtconsole,chardev=char0
 
 qemu-pci: $(kernel_qemu_bin) $(img)
-	(nc localhost -l 1235 -v) &
 	qemu-system-aarch64 \
 		$(QEMU_ARGS) \
 		-machine virt \

+ 1 - 1
examples/aarch64/src/main.rs

@@ -183,7 +183,7 @@ fn virtio_socket<T: Transport>(transport: T) {
     let mut socket =
         VirtIOSocket::<HalImpl, T>::new(transport).expect("Failed to create socket driver");
     let host_cid = 2;
-    let port = 1235;
+    let port = 1221;
     info!("Connecting to host on port {port}...");
     if let Err(e) = socket.connect(host_cid, port, port) {
         error!("Failed to connect to host: {:?}", e);

+ 55 - 0
examples/aarch64/vsock_server.cc

@@ -0,0 +1,55 @@
+// Sets a listening socket on host.
+#include <err.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+#include <cstdio>
+#include <cstdlib>
+
+// Needs to be included after sys/socket.h
+#include <linux/vm_sockets.h>
+
+constexpr int kPort = 1221;
+
+int main(int argc, const char *argv[]) {
+  int server_fd(socket(AF_VSOCK, SOCK_STREAM, 0));
+  if (server_fd < 0) {
+    errx(EXIT_FAILURE, "failed to set up the socket");
+  }
+
+  struct sockaddr_vm server_sa = (struct sockaddr_vm){
+      .svm_family = AF_VSOCK,
+      .svm_port = kPort,
+      .svm_cid = VMADDR_CID_ANY,
+  };
+
+  int ret = bind(server_fd, (struct sockaddr *)&server_sa, sizeof(server_sa));
+  if (ret != 0) {
+    errx(EXIT_FAILURE, "failed to bind to the address");
+  }
+  ret = listen(server_fd, 1);
+  if (ret != 0) {
+    errx(EXIT_FAILURE, "failed to listen to port %d", kPort);
+  }
+
+  printf("Listening for connections on port %d...\n", kPort);
+  struct sockaddr_vm client_sa;
+  socklen_t client_sa_len = sizeof(client_sa);
+  int client_fd =
+      accept(server_fd, (struct sockaddr *)&client_sa, &client_sa_len);
+  if (client_fd < 0) {
+    errx(EXIT_FAILURE, "failed to get the client fd");
+  }
+
+  char buffer[64];
+  // Receive data from the client
+  if (recv(client_fd, buffer, sizeof(buffer), 0) == -1) {
+    errx(EXIT_FAILURE, "failed to receive");
+  }
+
+  printf("Received: %s\n", buffer);
+  close(server_fd);
+  close(client_fd);
+
+  return EXIT_SUCCESS;
+}