about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tvix/nix-compat/src/wire/worker_protocol.rs13
-rw-r--r--users/picnoir/tvix-daemon/src/main.rs23
2 files changed, 15 insertions, 21 deletions
diff --git a/tvix/nix-compat/src/wire/worker_protocol.rs b/tvix/nix-compat/src/wire/worker_protocol.rs
index c9d055319273..121b9b2ea5cb 100644
--- a/tvix/nix-compat/src/wire/worker_protocol.rs
+++ b/tvix/nix-compat/src/wire/worker_protocol.rs
@@ -11,14 +11,11 @@ use crate::wire::primitive;
 
 use super::bytes::read_string;
 
-// LE-encoded nixc on 64 bits. Because why not.
-pub static MAGIC_HELLO: [u8; 8] = *b"cxin\0\0\0\0";
-// LE-encoded dxio on 64 bits. What's dxio? I have no clue.
-pub static MAGIC_HELLO_RESPONSE: [u8; 8] = *b"oixd\0\0\0\0";
-// LE-encoded protocol version.
-pub static PROTOCOL_VERSION: [u8; 8] = [0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
-
-pub static STDERR_LAST: u64 = 0x616c7473;
+pub static WORKER_MAGIC_1: u64 = 0x6e697863; // "nixc"
+pub static WORKER_MAGIC_2: u64 = 0x6478696f; // "dxio"
+pub static STDERR_LAST: u64 = 0x616c7473; // "alts"
+/// Protocol version (1.35)
+pub static PROTOCOL_VERSION: u64 = 1 << 8 | 35;
 
 /// Max length of a Nix setting name/value. In bytes.
 ///
diff --git a/users/picnoir/tvix-daemon/src/main.rs b/users/picnoir/tvix-daemon/src/main.rs
index 46cb813e3e38..398c8af01fcc 100644
--- a/users/picnoir/tvix-daemon/src/main.rs
+++ b/users/picnoir/tvix-daemon/src/main.rs
@@ -124,20 +124,17 @@ async fn perform_init_handshake<'a, R: 'a>(
 where
     &'a mut R: AsyncReadExt + AsyncWriteExt + Unpin + std::fmt::Debug,
 {
-    let mut magic_hello = vec![0; 8];
-    conn.read_exact(&mut magic_hello).await?;
+    let worker_magic_1 = primitive::read_u64(&mut conn).await?;
     debug!("Hello read");
-    if magic_hello != worker_protocol::MAGIC_HELLO {
+    if worker_magic_1 != worker_protocol::WORKER_MAGIC_1 {
         Err(anyhow!(
             "Invalid client hello received: {:?}, expected {:?}",
-            magic_hello,
-            worker_protocol::MAGIC_HELLO
+            worker_magic_1,
+            worker_protocol::WORKER_MAGIC_1
         ))
     } else {
-        conn.write_all(&worker_protocol::MAGIC_HELLO_RESPONSE[..])
-            .await?;
-        conn.write_all(&worker_protocol::PROTOCOL_VERSION[..])
-            .await?;
+        primitive::write_u64(&mut conn, worker_protocol::WORKER_MAGIC_2).await?;
+        primitive::write_u64(&mut conn, worker_protocol::PROTOCOL_VERSION).await?;
         conn.flush().await?;
         debug!("Hello responded");
         let client_version = primitive::read_u64(&mut conn).await?;
@@ -198,12 +195,12 @@ mod integration_tests {
     #[tokio::test]
     async fn test_init_handshake() {
         let mut test_conn = tokio_test::io::Builder::new()
-            .read(&worker_protocol::MAGIC_HELLO)
-            .write(&worker_protocol::MAGIC_HELLO_RESPONSE)
-            .write(&worker_protocol::PROTOCOL_VERSION)
+            .read(&worker_protocol::WORKER_MAGIC_1.to_le_bytes())
+            .write(&worker_protocol::WORKER_MAGIC_2.to_le_bytes())
+            .write(&worker_protocol::PROTOCOL_VERSION.to_le_bytes())
             // Let's say the client is in sync with the daemon
             // protocol-wise
-            .read(&worker_protocol::PROTOCOL_VERSION)
+            .read(&worker_protocol::PROTOCOL_VERSION.to_le_bytes())
             // cpu affinity
             .read(&vec![0; 8])
             // reservespace