diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Client.zig | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/src/Client.zig b/src/Client.zig index b7139d6..a39d4cd 100644 --- a/src/Client.zig +++ b/src/Client.zig @@ -2,6 +2,7 @@ const base64Enc = std.base64.Base64Encoder.init(std.base64.standard_alphabet_cha const base64Dec = std.base64.Base64Decoder.init(std.base64.standard_alphabet_chars, '='); var rand: ?Random = null; +var socket: ?gcat.nic.RawSocket = null; const max_message_size = 2048; @@ -12,13 +13,61 @@ pub fn init() !void { break :blk seed; }); rand = prng.random(); - try network.init(); + + socket = try .init("enp7s0"); } pub fn deinit() void { - network.deinit(); + socket.?.deinit(); } +/// Used for relay messages and connection handshake. +/// Assumes Client .init has been called. +fn broadcastInitialInterestMessage(msg_bytes: []align(@alignOf(SaprusMessage)) u8) !void { + var packet_bytes: [max_message_size]u8 = comptime blk: { + var b: [max_message_size]u8 = @splat(0); + + // Destination MAC addr to FF:FF:FF:FF:FF:FF + for (0..6) |i| { + b[i] = 0xff; + } + + // Set Ethernet type to IPv4 + b[0x0c] = 0x08; + b[0x0d] = 0x00; + + // Set IPv4 version to 4 + b[0x0e] = 0x45; + + // Destination broadcast + for (0x1e..0x22) |i| { + b[i] = 0xff; + } + + // Set TTL + b[0x16] = 0x40; + + // Set IPv4 protocol to UDP + b[0x17] = 0x11; + + // Set interest filter value to 8888. + b[0x24] = 0x22; + b[0x25] = 0xb8; + break :blk b; + }; + var msg: *SaprusMessage = try .bytesAsValue(msg_bytes); + try msg.networkFromNativeEndian(); + defer msg.nativeFromNetworkEndian() catch unreachable; + + // The byte position within the packet that the saprus message starts at. + const saprus_start_byte = 42; + @memcpy(packet_bytes[saprus_start_byte .. saprus_start_byte + msg_bytes.len], msg_bytes); + + try socket.?.linkLayer().send(packet_bytes[0 .. saprus_start_byte + msg_bytes.len]); +} + +// fn broadcastSaprusMessage(msg_bytes: []align(@alignOf(SaprusMessage)) u8) !void {} + fn broadcastSaprusMessage(msg_bytes: []align(@alignOf(SaprusMessage)) u8, udp_port: u16) !void { if (false) { var foo: gcat.nic.RawSocket = try .init("enp7s0"); // /proc/net/dev @@ -63,7 +112,7 @@ pub fn sendRelay(payload: []const u8, dest: [4]u8) !void { relay.dest = dest; _ = base64Enc.encode(relay.getPayload(), payload); - try broadcastSaprusMessage(msg_bytes, 8888); + try broadcastInitialInterestMessage(msg_bytes); } fn randomPort() u16 { |