Skip to content

Commit de1ed05

Browse files
committed
store requests in HashMap
Signed-off-by: Jan Hendrik Farr <[email protected]>
1 parent aa5674b commit de1ed05

File tree

1 file changed

+77
-29
lines changed

1 file changed

+77
-29
lines changed

src/main.zig

+77-29
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ const c = @cImport({
1111
@cInclude("quiche.h");
1212
});
1313

14+
const alloc = std.heap.c_allocator;
15+
const mpool = std.heap.MemoryPool();
16+
1417
const MAX_DATAGRAM_SIZE = 1350;
1518
const LOCAL_CONN_ID_LEN = 16;
1619

@@ -20,14 +23,27 @@ const event_type = enum {
2023
TIMER,
2124
};
2225

23-
const request_data = struct {
24-
buf: [2048]u8,
25-
buf_slice: []u8,
26+
const request_t = struct {
2627
from: net.Address,
27-
stream_id: u64,
28+
data: []u8,
29+
data_n: u32,
2830
};
2931

30-
var requests: [32]request_data = undefined;
32+
// var requests: [32]request_data = undefined;
33+
var rmap: request_map_t = undefined;
34+
const request_map_t = std.HashMap(
35+
u64,
36+
request_t,
37+
struct {
38+
pub fn hash(_: @This(), a: u64) u64 {
39+
return a >> 2;
40+
}
41+
pub fn eql(_: @This(), a: u64, b: u64) bool {
42+
return a == b;
43+
}
44+
},
45+
90,
46+
);
3147

3248
const quic_upstream = struct {
3349
sock: posix.socket_t,
@@ -36,8 +52,7 @@ const quic_upstream = struct {
3652
conf: ?*c.quiche_config,
3753
conn: ?*c.quiche_conn,
3854
urandom: fs.File,
39-
sess: [*c]u8,
40-
sess_len: usize,
55+
sess: ?[]u8,
4156
};
4257

4358
fn quic_upstream_init(u: *quic_upstream) !void {
@@ -95,7 +110,10 @@ fn quic_upstream_connect(u: *quic_upstream) !void {
95110
u.conf,
96111
) orelse return error.quiche_connect_error;
97112
if (u.sess) |sess| {
98-
_ = c.quiche_conn_set_session(u.conn, sess, u.sess_len);
113+
std.debug.print("trying to resume session ticket", .{});
114+
const e = c.quiche_conn_set_session(u.conn, sess.ptr, sess.len);
115+
alloc.free(sess);
116+
std.debug.print("return value: {}\n", .{e});
99117
}
100118
_ = c.quiche_conn_set_keylog_path(u.conn, "/tmp/keys");
101119
flush_egress(u);
@@ -173,6 +191,8 @@ pub fn flush_egress(u: *quic_upstream) void {
173191
}
174192

175193
pub fn main() !void {
194+
rmap = request_map_t.init(alloc);
195+
176196
const server_fd = try posix.socket(posix.AF.INET, posix.SOCK.DGRAM, 0);
177197
_ = try posix.fcntl(server_fd, posix.F.SETFL, posix.SOCK.NONBLOCK);
178198
const server_addr = try net.Address.parseIp("127.0.0.1", 5503);
@@ -272,8 +292,21 @@ pub fn main() !void {
272292
if (c.quiche_conn_is_closed(q_upstream.conn) or restart) {
273293
restart = false;
274294

275-
c.quiche_conn_session(q_upstream.conn, &q_upstream.sess, &q_upstream.sess_len);
276-
std.debug.print("{}\n", .{q_upstream.sess_len});
295+
var it = rmap.valueIterator();
296+
while (it.next()) |req| {
297+
alloc.free(req.data);
298+
}
299+
rmap.deinit();
300+
rmap = request_map_t.init(alloc);
301+
302+
var sess: [*c]u8 = undefined;
303+
var sess_len: usize = undefined;
304+
c.quiche_conn_session(q_upstream.conn, &sess, &sess_len);
305+
q_upstream.sess = try alloc.alloc(u8, sess_len);
306+
if (q_upstream.sess) |s| {
307+
@memcpy(s, sess[0..sess_len]);
308+
}
309+
std.debug.print("{}\n", .{sess_len});
277310

278311
std.debug.print("connection is closed!\n", .{});
279312
c.quiche_conn_free(q_upstream.conn);
@@ -288,14 +321,18 @@ pub fn main() !void {
288321
}
289322
}
290323

291-
var request: *request_data = &requests[request_id_received % requests.len];
292-
request.stream_id = request_id_received * 4;
293-
request_id_received = request_id_received + 1;
324+
var req: request_t = undefined;
325+
req.data = try alloc.alloc(u8, 1024);
326+
294327
var from: net.Address = undefined;
295328
var from_len: posix.socklen_t = @sizeOf(net.Address);
296-
const n_read = try posix.recvfrom(server_fd, &request.buf, 0, @ptrCast(&from), &from_len);
297-
request.buf_slice = request.buf[0..n_read];
298-
request.from = from;
329+
req.data_n = @intCast(try posix.recvfrom(server_fd, req.data, 0, @ptrCast(&from), &from_len));
330+
req.from = from;
331+
332+
const stream_id: u64 = request_id_received * 4;
333+
request_id_received = request_id_received + 1;
334+
335+
try rmap.put(stream_id, req);
299336

300337
if (q_upstream.conn == null) {
301338
try quic_upstream_connect(&q_upstream);
@@ -328,32 +365,39 @@ pub fn main() !void {
328365
}
329366
defer c.quiche_h3_event_free(h3_event);
330367

331-
var request = &requests[(@as(usize, @intCast(s)) >> 2) % requests.len];
332-
333368
switch (c.quiche_h3_event_type(h3_event)) {
334369
c.QUICHE_H3_EVENT_HEADERS => {},
335370
c.QUICHE_H3_EVENT_DATA => {
336371
if (@rem(s, 4) == 0) {
372+
const stream_id: u64 = @bitCast(s);
373+
const req = rmap.getPtr(stream_id) orelse break;
374+
375+
req.data = try alloc.realloc(req.data, 2048);
337376
// TODO: call recv_body in loop and handle multiple data events on same stream
338-
const n_read_h3 = c.quiche_h3_recv_body(
377+
req.data_n = @intCast(c.quiche_h3_recv_body(
339378
h3_conn,
340379
q_upstream.conn,
341380
@bitCast(s),
342-
&request.buf,
343-
request.buf.len,
344-
);
345-
request.buf_slice = request.buf[0..@bitCast(n_read_h3)];
381+
req.data.ptr,
382+
req.data.len,
383+
));
346384
}
347385
},
348386
c.QUICHE_H3_EVENT_FINISHED => {
349387
if (@rem(s, 4) == 0) {
388+
const stream_id: u64 = @bitCast(s);
389+
const req = rmap.getPtr(stream_id) orelse break;
390+
350391
_ = try posix.sendto(
351392
server_fd,
352-
request.buf_slice,
393+
req.data[0..req.data_n],
353394
0,
354-
@ptrCast(&request.from),
355-
request.from.getOsSockLen(),
395+
@ptrCast(&req.from),
396+
req.from.getOsSockLen(),
356397
);
398+
399+
alloc.free(req.data);
400+
_ = rmap.remove(stream_id);
357401
}
358402
},
359403
c.QUICHE_H3_EVENT_GOAWAY => {
@@ -378,9 +422,13 @@ pub fn main() !void {
378422
if (h3_conn != null) {
379423
for (request_id_sent..request_id_received) |i| {
380424
std.debug.print("request id: {}\n", .{i});
381-
const request: *request_data = &requests[i % requests.len];
382-
const stream_id = c.quiche_h3_send_request(h3_conn, q_upstream.conn, &doh3_headers, doh3_headers.len, false);
383-
_ = c.quiche_h3_send_body(h3_conn, q_upstream.conn, @bitCast(stream_id), request.buf_slice.ptr, request.buf_slice.len, true);
425+
426+
const stream_id: u64 = i << 2;
427+
const req = rmap.getPtr(stream_id) orelse break;
428+
429+
_ = c.quiche_h3_send_request(h3_conn, q_upstream.conn, &doh3_headers, doh3_headers.len, false);
430+
_ = c.quiche_h3_send_body(h3_conn, q_upstream.conn, @bitCast(stream_id), req.data.ptr, req.data_n, true);
431+
req.data_n = 0;
384432
}
385433
request_id_sent = request_id_received;
386434
}

0 commit comments

Comments
 (0)