mirror of
https://git.robbyzambito.me/zaprus
synced 2025-12-20 16:24:50 +00:00
Add broadcast initial interest using raw sockets
Use this from the relay message
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user