mirror of
https://git.robbyzambito.me/zaprus
synced 2025-12-20 16:24:50 +00:00
Remove allocation for messages
This commit is contained in:
@@ -3,6 +3,8 @@ const base64Dec = std.base64.Base64Decoder.init(std.base64.standard_alphabet_cha
|
|||||||
|
|
||||||
var rand: ?Random = null;
|
var rand: ?Random = null;
|
||||||
|
|
||||||
|
const max_message_size = 2048;
|
||||||
|
|
||||||
pub fn init() !void {
|
pub fn init() !void {
|
||||||
var prng = Random.DefaultPrng.init(blk: {
|
var prng = Random.DefaultPrng.init(blk: {
|
||||||
var seed: u64 = undefined;
|
var seed: u64 = undefined;
|
||||||
@@ -47,16 +49,12 @@ fn broadcastSaprusMessage(msg: *SaprusMessage, udp_port: u16) !void {
|
|||||||
_ = try sock.sendTo(dest_addr, msg_bytes);
|
_ = try sock.sendTo(dest_addr, msg_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sendRelay(payload: []const u8, dest: [4]u8, allocator: Allocator) !void {
|
pub fn sendRelay(payload: []const u8, dest: [4]u8) !void {
|
||||||
const msg_bytes = try allocator.alignedAlloc(
|
var buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
|
||||||
u8,
|
const msg_bytes = buf[0..try SaprusMessage.calcSize(
|
||||||
@alignOf(SaprusMessage),
|
|
||||||
try SaprusMessage.lengthForPayloadLength(
|
|
||||||
.relay,
|
.relay,
|
||||||
base64Enc.calcSize(payload.len),
|
base64Enc.calcSize(payload.len),
|
||||||
),
|
)];
|
||||||
);
|
|
||||||
defer allocator.free(msg_bytes);
|
|
||||||
const msg: *SaprusMessage = .init(.relay, msg_bytes);
|
const msg: *SaprusMessage = .init(.relay, msg_bytes);
|
||||||
|
|
||||||
const relay = (try msg.getSaprusTypePayload()).relay;
|
const relay = (try msg.getSaprusTypePayload()).relay;
|
||||||
@@ -75,18 +73,14 @@ fn randomPort() u16 {
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator: Allocator) !*SaprusMessage {
|
pub fn sendInitialConnection(payload: []const u8, initial_port: u16) !*SaprusMessage {
|
||||||
const dest_port = randomPort();
|
const dest_port = randomPort();
|
||||||
const msg_bytes = try allocator.alignedAlloc(
|
var buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
|
||||||
u8,
|
const msg_bytes = buf[0..try SaprusMessage.calcSize(
|
||||||
@alignOf(SaprusMessage),
|
|
||||||
try SaprusMessage.lengthForPayloadLength(
|
|
||||||
.connection,
|
.connection,
|
||||||
base64Enc.calcSize(payload.len),
|
base64Enc.calcSize(payload.len),
|
||||||
),
|
)];
|
||||||
);
|
const msg: *SaprusMessage = .init(.relay, msg_bytes);
|
||||||
|
|
||||||
const msg: *SaprusMessage = .init(.connection, msg_bytes);
|
|
||||||
|
|
||||||
const connection = (try msg.getSaprusTypePayload()).connection;
|
const connection = (try msg.getSaprusTypePayload()).connection;
|
||||||
connection.src_port = initial_port;
|
connection.src_port = initial_port;
|
||||||
@@ -98,11 +92,8 @@ pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator:
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection {
|
pub fn connect(payload: []const u8) !?SaprusConnection {
|
||||||
var initial_port: u16 = 0;
|
const initial_port = randomPort();
|
||||||
if (rand) |r| {
|
|
||||||
initial_port = r.intRangeAtMost(u16, 1024, 65000);
|
|
||||||
} else unreachable;
|
|
||||||
|
|
||||||
var initial_conn_res: ?*SaprusMessage = null;
|
var initial_conn_res: ?*SaprusMessage = null;
|
||||||
|
|
||||||
@@ -119,10 +110,9 @@ pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection {
|
|||||||
try sock.setReadTimeout(1 * std.time.us_per_s);
|
try sock.setReadTimeout(1 * std.time.us_per_s);
|
||||||
try sock.bind(bind_addr);
|
try sock.bind(bind_addr);
|
||||||
|
|
||||||
const msg = try sendInitialConnection(payload, initial_port, allocator);
|
const msg = try sendInitialConnection(payload, initial_port);
|
||||||
defer allocator.free(msg.asBytes());
|
|
||||||
|
|
||||||
var response_buf: [4096]u8 align(@alignOf(SaprusMessage)) = undefined;
|
var response_buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
|
||||||
_ = try sock.receive(&response_buf); // Ignore message that I sent.
|
_ = try sock.receive(&response_buf); // Ignore message that I sent.
|
||||||
const len = try sock.receive(&response_buf);
|
const len = try sock.receive(&response_buf);
|
||||||
|
|
||||||
@@ -148,5 +138,3 @@ const mem = std.mem;
|
|||||||
|
|
||||||
const network = @import("network");
|
const network = @import("network");
|
||||||
const gcat = @import("gatorcat");
|
const gcat = @import("gatorcat");
|
||||||
|
|
||||||
const Allocator = mem.Allocator;
|
|
||||||
|
|||||||
@@ -54,12 +54,11 @@ pub fn main() !void {
|
|||||||
try SaprusClient.sendRelay(
|
try SaprusClient.sendRelay(
|
||||||
if (r.len > 0) r else "Hello darkness my old friend",
|
if (r.len > 0) r else "Hello darkness my old friend",
|
||||||
dest,
|
dest,
|
||||||
gpa,
|
|
||||||
);
|
);
|
||||||
// std.debug.print("Sent: {s}\n", .{r});
|
// std.debug.print("Sent: {s}\n", .{r});
|
||||||
return;
|
return;
|
||||||
} else if (res.args.connect) |c| {
|
} else if (res.args.connect) |c| {
|
||||||
_ = SaprusClient.connect(if (c.len > 0) c else "Hello darkness my old friend", gpa) catch |err| switch (err) {
|
_ = SaprusClient.connect(if (c.len > 0) c else "Hello darkness my old friend") catch |err| switch (err) {
|
||||||
error.WouldBlock => null,
|
error.WouldBlock => null,
|
||||||
else => return err,
|
else => return err,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user