diff --git a/build.zig b/build.zig index a4a0a64..a35ecd3 100644 --- a/build.zig +++ b/build.zig @@ -1,48 +1,36 @@ const std = @import("std"); pub fn build(b: *std.Build) void { - - // Compilation options - const opt_shared = b.option( - bool, - "shared", - "Build as a dynamic (shared) library", - ) orelse false; - - const linkage: std.builtin.LinkMode = if (opt_shared) - .static - else - .dynamic; - - // Configuration const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); - // Create root module - const root_module = b.createModule(.{ + // Create library + const reticulumzero = b.addLibrary(.{ + .name = "reticulum-zero", + .linkage = .static, + .root_module = b.createModule(.{ + .root_source_file = b.path("src/root.zig"), + .target = target, + .optimize = optimize, + }), + }); + + // Output library object + b.installArtifact(reticulumzero); + + // Expose library as a module + try b.modules.put(b.dupe("reticulum-zero"), reticulumzero.root_module); + + // Set up unit testing + const unit_tests = b.addTest(.{ .root_source_file = b.path("src/root.zig"), .target = target, .optimize = optimize, }); - // Create library - const lib = b.addLibrary(.{ - .name = "reticulum-zero", - .linkage = linkage, - .root_module = root_module, - }); - - // Output library object - b.installArtifact(lib); - - // Set up unit testing - // const unit_tests = b.addTest(.{ - // .root_module = root_module, - // }); - - // const run_unit_tests = b.addRunStep(unit_tests); + const run_unit_tests = b.addRunStep(unit_tests); // `zig build test` command - // const test_step = b.step("test", "Run library unit tests"); - // test_step.dependency(&run_unit_tests.step); + const test_step = b.step("test", "Run library unit tests"); + test_step.dependency(&run_unit_tests.step); } diff --git a/build.zig.zon b/build.zig.zon index acb7a37..d123225 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,8 +1,7 @@ .{ - .name = .reticulumzero, + .name = "reticulum-zero", .version = "0.0.0", .minimum_zig_version = "0.16.0", - .fingerprint = 0x7bbb9f9a7c7a4705, .dependencies = .{}, .paths = .{ "build.zig", diff --git a/src/packet.zig b/src/packet.zig index bf0b90b..191d835 100644 --- a/src/packet.zig +++ b/src/packet.zig @@ -30,14 +30,14 @@ const ContextFlag = enum(u1) { // Meaning depends on packet context }; const PropagationType = enum(u1) { broadcast = 0, transport = 1 }; -const DestinationType = enum(u2) { +const DestinationType = enum(u2) { // single = 0b0, group = 0b01, plain = 0b10, link = 0b11, }; -const PacketType = enum(u2) { +const PacketType = enum(u2) { // data = 0b0, announce = 0b01, link_request = 0b10, @@ -45,27 +45,27 @@ const PacketType = enum(u2) { }; const PacketContext = enum(u8) { - none = 0x00, // Generic data packet - resource = 0x01, // Packet is part of a resource - resource_adv = 0x02, // Packet is a resource advertisement - resource_req = 0x03, // Packet is a resource part request - resource_hmu = 0x04, // Packet is a resource hashmap update - resource_prf = 0x05, // Packet is a resource proof - resource_icl = 0x06, // Packet is a resource initiator cancel message - resource_rcl = 0x07, // Packet is a resource receiver cancel message - cache_request = 0x08, // Packet is a cache request - request = 0x09, // Packet is a request - response = 0x0A, // Packet is a response to a request - path_response = 0x0B, // Packet is a response to a path request - command = 0x0C, // Packet is a command + none = 0x00, // Generic data packet + resource = 0x01, // Packet is part of a resource + resource_adv = 0x02, // Packet is a resource advertisement + resource_req = 0x03, // Packet is a resource part request + resource_hmu = 0x04, // Packet is a resource hashmap update + resource_prf = 0x05, // Packet is a resource proof + resource_icl = 0x06, // Packet is a resource initiator cancel message + resource_rcl = 0x07, // Packet is a resource receiver cancel message + cache_request = 0x08, // Packet is a cache request + request = 0x09, // Packet is a request + response = 0x0A, // Packet is a response to a request + path_response = 0x0B, // Packet is a response to a path request + command = 0x0C, // Packet is a command command_status = 0x0D, // Packet is a status of an executed command - channel = 0x0E, // Packet contains link channel data - keepalive = 0xFA, // Packet is a keepalive packet - linkidentify = 0xFB, // Packet is a link peer identification proof - linkclose = 0xFC, // Packet is a link close message - linkproof = 0xFD, // Packet is a link packet proof - lrrtt = 0xFE, // Packet is a link request round-trip time measurement - lrproof = 0xFF, // Packet is a link request proof + channel = 0x0E, // Packet contains link channel data + keepalive = 0xFA, // Packet is a keepalive packet + linkidentify = 0xFB, // Packet is a link peer identification proof + linkclose = 0xFC, // Packet is a link close message + linkproof = 0xFD, // Packet is a link packet proof + lrrtt = 0xFE, // Packet is a link request round-trip time measurement + lrproof = 0xFF, // Packet is a link request proof }; ///////////////// Structs @@ -78,7 +78,7 @@ const PacketHeader = packed struct { propagation: PropagationType, destination: DestinationType, packet: PacketType, - hops: u8, + hops: u8, // }; const Packet = struct { @@ -86,7 +86,7 @@ const Packet = struct { address1: [ADDRESS_SIZE]u8, address2: [ADDRESS_SIZE]u8, context: PacketContext, - data: []const u8, + data: []const u8, // }; ///////////////// Functions @@ -133,12 +133,10 @@ pub fn serializePacket(packet: Packet, output_buffer: []u8) !usize { } fn copyToPacket(dst: anytype, src: []const u8, offset: usize, count: usize) !usize { - if (src.len < offset + count) { + if (src.len > offset + count) { return error.BufferTooShort; } - - const dst_ptr: []u8 = @ptrCast(dst); - @memcpy(dst_ptr, src[offset .. offset + count]); + @memcpy(@as(*u8, &dst), src[offset .. offset + count]); return offset + count; } @@ -162,9 +160,6 @@ pub fn deserializePacket(message_buffer: []u8, dest_packet: *Packet) !void { ///////////////// Tests // -//////// Helper functions -// - // Serializes the given packet and makes sure the output is correct fn testPacketSerialization(packet: Packet) !void { const buf_size = comptime @sizeOf(Packet) + MAX_DATA_SIZE; @@ -193,28 +188,6 @@ fn testPacketSerialization(packet: Packet) !void { offset += packet.data.len; } -fn headersEql(h1: *const PacketHeader, h2: *const PacketHeader) bool { - return h1.ifac == h2.ifac - and h1.header == h2.header - and h1.context == h2.context - and h1.propagation == h2.propagation - and h1.destination == h2.destination - and h1.packet == h2.packet - and h1.hops == h2.hops; -} - -fn packetsEql(p1: *const Packet, p2: *const Packet) bool { - return headersEql(&p1.header, &p2.header) - and memeql(u8, &p1.address1, &p2.address1) - and memeql(u8, &p1.address2, &p2.address2) - and p1.context == p2.context - and p1.data.len == p2.data.len - and memeql(u8, p1.data, p2.data); -} - -//////// Tests -// - test "Structs size" { try expect(@sizeOf(PacketHeader) == 2); } @@ -347,5 +320,5 @@ test "Serialize / Deserialize Packet: Header type2, Medium data size" { _ = try serializePacket(packet, &buf); try deserializePacket(&buf, &res_packet); - try expect(packetsEql(&res_packet, &packet)); + try expect(res_packet == packet); } diff --git a/src/root.zig b/src/root.zig index 9b202f1..ad85c39 100644 --- a/src/root.zig +++ b/src/root.zig @@ -1 +1 @@ -pub const packet = @import("packet.zig"); +const packet = @import("packet.zig");