summaryrefslogtreecommitdiff
path: root/src/Client.zig
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2025-05-11 11:39:54 -0400
committerRobby Zambito <contact@robbyzambito.me>2025-05-11 11:40:15 -0400
commit373dbebc8c9e950f38bd3a46ab802701f90eb09f (patch)
tree3e8fc301f66ad3e083f4805d9d2b4aeb6efd339d /src/Client.zig
parentcde289d6480f03cde3ea64a9e798b4ef912ea116 (diff)
Add broadcast initial interest using raw sockets
Use this from the relay message
Diffstat (limited to 'src/Client.zig')
-rw-r--r--src/Client.zig55
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 {