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, '=');
|
const base64Dec = std.base64.Base64Decoder.init(std.base64.standard_alphabet_chars, '=');
|
||||||
|
|
||||||
var rand: ?Random = null;
|
var rand: ?Random = null;
|
||||||
|
var socket: ?gcat.nic.RawSocket = null;
|
||||||
|
|
||||||
const max_message_size = 2048;
|
const max_message_size = 2048;
|
||||||
|
|
||||||
@@ -12,13 +13,61 @@ pub fn init() !void {
|
|||||||
break :blk seed;
|
break :blk seed;
|
||||||
});
|
});
|
||||||
rand = prng.random();
|
rand = prng.random();
|
||||||
try network.init();
|
|
||||||
|
socket = try .init("enp7s0");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deinit() void {
|
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 {
|
fn broadcastSaprusMessage(msg_bytes: []align(@alignOf(SaprusMessage)) u8, udp_port: u16) !void {
|
||||||
if (false) {
|
if (false) {
|
||||||
var foo: gcat.nic.RawSocket = try .init("enp7s0"); // /proc/net/dev
|
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;
|
relay.dest = dest;
|
||||||
_ = base64Enc.encode(relay.getPayload(), payload);
|
_ = base64Enc.encode(relay.getPayload(), payload);
|
||||||
|
|
||||||
try broadcastSaprusMessage(msg_bytes, 8888);
|
try broadcastInitialInterestMessage(msg_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn randomPort() u16 {
|
fn randomPort() u16 {
|
||||||
|
|||||||
Reference in New Issue
Block a user