diff options
| author | Robby Zambito <contact@robbyzambito.me> | 2025-04-27 18:06:11 -0400 | 
|---|---|---|
| committer | Robby Zambito <contact@robbyzambito.me> | 2025-04-30 13:46:54 -0400 | 
| commit | 8d404a7c8d2db3f132c716f645ada9ef09ca0e9a (patch) | |
| tree | d7048a3e7d5b6b5ff54cf60481e6de95b5250e06 | |
| parent | 18b04364df2829a7e30e5831e499005a1ecc24c7 (diff) | |
| -rw-r--r-- | src/Client.zig | 4 | ||||
| -rw-r--r-- | src/main.zig | 4 | ||||
| -rw-r--r-- | src/message.zig | 57 | 
3 files changed, 61 insertions, 4 deletions
diff --git a/src/Client.zig b/src/Client.zig index 0d7a851..070aaef 100644 --- a/src/Client.zig +++ b/src/Client.zig @@ -77,9 +77,9 @@ pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator:  }  pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection { -    var foo: gcat.nic.RawSocket = try .init("enp7s0"); +    var foo: gcat.nic.RawSocket = try .init("enp7s0"); // /proc/net/dev      defer foo.deinit(); -    // _ = gcat.nic.RawSocket; +      var initial_port: u16 = 0;      if (rand) |r| {          initial_port = r.intRangeAtMost(u16, 1024, 65000); diff --git a/src/main.zig b/src/main.zig index 7a8a34f..61cc76f 100644 --- a/src/main.zig +++ b/src/main.zig @@ -50,7 +50,7 @@ pub fn main() !void {      }      if (res.args.relay) |r| { -        const dest = parseDest(res.args.dest) catch .{ 70, 70, 70, 70 }; +        const dest = parseDest(res.args.dest);          try SaprusClient.sendRelay(              if (r.len > 0) r else "Hello darkness my old friend",              dest, @@ -79,7 +79,7 @@ fn parseDest(in: ?[]const u8) [4]u8 {          const addr = std.net.Ip4Address.parse(dest, 0) catch return "FAIL".*;          return @bitCast(addr.sa.addr);      } -    return "zap".*; +    return "zap\x00".*;  }  const builtin = @import("builtin"); diff --git a/src/message.zig b/src/message.zig index 403bfcd..6d95e4b 100644 --- a/src/message.zig +++ b/src/message.zig @@ -28,6 +28,59 @@ pub const Error = error{      UnknownSaprusType,  }; +// ZERO COPY STUFF +// &payload could be a void value that is treated as a pointer to a [*]u8 +pub const ZeroCopyMessage = packed struct { +    pub const Relay = packed struct { +        dest: @Vector(4, u8), +        /// @as([*]u8, @ptrCast(&payload)) +        payload: void, +    }; +    pub const Connection = packed struct { +        src_port: u16, // random number > 1024 +        dest_port: u16, // random number > 1024 +        seq_num: u32 = 0, +        msg_id: u32 = 0, +        reserved: u8 = 0, +        options: ConnectionOptions = .{}, +        payload: void, +    }; + +    const Self = @This(); + +    type: PacketType, +    length: u16, +    bytes: void = {}, + +    fn getRelay(self: *align(1) Self) *align(1) const Relay { +        return std.mem.bytesAsValue(Relay, &self.bytes); +    } +    fn getConnection(self: *align(1) Self) *align(1) const Connection { +        return std.mem.bytesAsValue(Connection, &self.bytes); +    } +}; + +test "testing variable length zero copy struct" { +    const gpa = std.testing.allocator; +    const bytes = try gpa.alloc(u8, @sizeOf(ZeroCopyMessage) + 64); +    defer gpa.free(bytes); +    // const zcm = std.mem.bytesAsValue(ZeroCopyMessage, bytes).*; +    const zcm: *align(1) ZeroCopyMessage = @ptrCast(bytes.ptr); +    // @compileLog(@typeInfo(@TypeOf(ZeroCopyMessage{ .type = .relay, .length = 0 }))); +    // @compileLog(@typeInfo(@TypeOf(zcm))); +    // _ = zcm; +    zcm.type = .relay; +    zcm.length = 3; +    std.debug.print("{any}\n", .{zcm}); +    std.debug.print("{any}\n", .{zcm.getRelay()}); +    std.debug.print("{any}\n", .{zcm.getConnection()}); +    std.debug.print("{x}\n", .{std.mem.asBytes(zcm.getConnection())}); +    std.debug.print("{x}\n", .{std.mem.asBytes(zcm.getRelay())}); +    std.debug.print("{x}\n", .{bytes}); + +    try std.testing.expect(true); +} +  /// All Saprus messages  pub const Message = union(PacketType) {      pub const Relay = struct { @@ -209,3 +262,7 @@ test "Round trip Connection toBytes and fromBytes" {      try std.testing.expectEqualDeep(msg, from_bytes);  } + +test { +    std.testing.refAllDeclsRecursive(@This()); +}  | 
