tiny.reticulum.packet.filter
Defined in packet.
API (2)
Actions
Public operations.
admit: Decides whether a node acts on an arriving packet, for a caller that runs every arriving packet past this check before doing anything with it.
Types and contracts
Public types and contracts.
Source
Source: lib/reticulum/src/packet/filter.zig
zig
const std = @import("std");const wire = @import("../wire/root.zig");pub const Verdict = enum(u1) { reject, admit,};fn contextPassthrough(context: wire.Context) bool { return switch (context) { .keepalive, .resource_req, .resource_prf, .resource, .cache_request, .channel, => true, else => false, };}/// Decides whether a node acts on an arriving packet, for a caller that runs/// every arriving packet past this check before doing anything with it. The/// call rejects a packet of any type but an announce that carries a transport/// id, unless that id is this node's own. The call admits a packet whatever/// else holds for six context bytes: keepalive, resource, resource request,/// resource proof, cache request, and channel, because a link or a resource/// transfer repeats them. The check rejects a packet addressed to a plain or/// group destination when it is an announce or its hop count exceeds one, and/// admits it otherwise. The call rejects a packet whose packet hash the node/// has already seen, and admits an announce to a single destination again so a/// fresher path can be taken. Reticulum 1.5.0 filters against its shared/// instance before reaching these rules, and this call leaves that to the/// caller, following Reticulum@1.5.0 RNS/Transport.py:1571-1628.pub fn admit( value: *const wire.Packet, seen: bool, own_transport_hash: ?[16]u8,) Verdict { if (value.transport_id) |transport_id| { if (value.packet_type != .announce) { const own = own_transport_hash orelse return .reject; if (!std.mem.eql(u8, &transport_id, &own)) return .reject; } } if (contextPassthrough(value.context)) return .admit; switch (value.destination_type) { .plain, .group => { if (value.packet_type == .announce) return .reject; if (value.hops > 1) return .reject; return .admit; }, else => {}, } if (!seen) return .admit; if (value.packet_type == .announce and value.destination_type == .single) { return .admit; } return .reject;}fn packet() wire.Packet { return .{ .ifac = 0, .header = .one, .context_flag = 0, .transport = .broadcast, .destination_type = .single, .packet_type = .data, .hops = 0, .transport_id = null, .destination = @splat(0), .context = .none, .payload = &.{}, };}test "Reticulum@1.5.0 RNS/Transport.py:1576-1580 rejects another transport" { var value = packet(); value.header = .two; value.transport_id = @splat(1); try @import("std").testing.expectEqual(Verdict.reject, admit(&value, false, @splat(2)));}test "Reticulum@1.5.0 RNS/Transport.py:1576-1580 admits its transport" { var value = packet(); value.header = .two; value.transport_id = @splat(1); try @import("std").testing.expectEqual(Verdict.admit, admit(&value, false, @splat(1)));}test "Reticulum@1.5.0 RNS/Transport.py:1577 lets announces cross transports" { var value = packet(); value.header = .two; value.transport_id = @splat(1); value.packet_type = .announce; try @import("std").testing.expectEqual(Verdict.admit, admit(&value, false, @splat(2)));}fn expectContext(context: wire.Context) !void { var value = packet(); value.context = context; try std.testing.expectEqual(Verdict.admit, admit(&value, true, null));}test "Reticulum@1.5.0 RNS/Transport.py:1582 passes keepalive context" { try expectContext(.keepalive);}test "Reticulum@1.5.0 RNS/Transport.py:1583 passes resource request context" { try expectContext(.resource_req);}test "Reticulum@1.5.0 RNS/Transport.py:1584 passes resource proof context" { try expectContext(.resource_prf);}test "Reticulum@1.5.0 RNS/Transport.py:1585 passes resource context" { try expectContext(.resource);}test "Reticulum@1.5.0 RNS/Transport.py:1586 passes cache request context" { try expectContext(.cache_request);}test "Reticulum@1.5.0 RNS/Transport.py:1587 passes channel context" { try expectContext(.channel);}test "Reticulum@1.5.0 RNS/Transport.py:1589-1596 admits local plain data" { var value = packet(); value.destination_type = .plain; value.hops = 1; try std.testing.expectEqual(Verdict.admit, admit(&value, true, null));}test "Reticulum@1.5.0 RNS/Transport.py:1591-1594 rejects transported plain data" { var value = packet(); value.destination_type = .plain; value.hops = 2; try std.testing.expectEqual(Verdict.reject, admit(&value, false, null));}test "Reticulum@1.5.0 RNS/Transport.py:1597-1600 rejects plain announces" { var value = packet(); value.destination_type = .plain; value.packet_type = .announce; try std.testing.expectEqual(Verdict.reject, admit(&value, false, null));}test "Reticulum@1.5.0 RNS/Transport.py:1602-1609 admits local group data" { var value = packet(); value.destination_type = .group; value.hops = 1; try std.testing.expectEqual(Verdict.admit, admit(&value, true, null));}test "Reticulum@1.5.0 RNS/Transport.py:1604-1607 rejects transported group data" { var value = packet(); value.destination_type = .group; value.hops = 2; try std.testing.expectEqual(Verdict.reject, admit(&value, false, null));}test "Reticulum@1.5.0 RNS/Transport.py:1610-1613 rejects group announces" { var value = packet(); value.destination_type = .group; value.packet_type = .announce; try std.testing.expectEqual(Verdict.reject, admit(&value, false, null));}test "Reticulum@1.5.0 RNS/Transport.py:1615 admits unseen packets" { try @import("std").testing.expectEqual(Verdict.admit, admit(&packet(), false, null));}test "Reticulum@1.5.0 RNS/Transport.py:1617-1619 readmits single announces" { var value = packet(); value.packet_type = .announce; try std.testing.expectEqual(Verdict.admit, admit(&value, true, null));}test "Reticulum@1.5.0 RNS/Transport.py:1617-1623 rejects other duplicate announces" { var value = packet(); value.packet_type = .announce; value.destination_type = .link; try std.testing.expectEqual(Verdict.reject, admit(&value, true, null));}test "Reticulum@1.5.0 RNS/Transport.py:1625-1626 rejects other duplicates" { try @import("std").testing.expectEqual(Verdict.reject, admit(&packet(), true, null));}Source: lib/reticulum/src/packet/root.zig:47
zig
pub const filter = @import("filter.zig");Complete caller list for packet.filter.admit
15 direct callers.
tiny.reticulum.node.inbound.run[function] atlib/reticulum/src/node/inbound.zig:362lib.reticulum.src.packet.filter.expectContext[function] — private source atlib/reticulum/src/packet/filter.zig:100in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1576-1580_admits_its_transport[function] — test source atlib/reticulum/src/packet/filter.zig:85in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1576-1580_rejects_another_transport[function] — test source atlib/reticulum/src/packet/filter.zig:78in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1577_lets_announces_cross_transports[function] — test source atlib/reticulum/src/packet/filter.zig:92in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1589-1596_admits_local_plain_data[function] — test source atlib/reticulum/src/packet/filter.zig:130in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1591-1594_rejects_transported_plain_data[function] — test source atlib/reticulum/src/packet/filter.zig:137in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1597-1600_rejects_plain_announces[function] — test source atlib/reticulum/src/packet/filter.zig:144in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1602-1609_admits_local_group_data[function] — test source atlib/reticulum/src/packet/filter.zig:151in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1604-1607_rejects_transported_group_data[function] — test source atlib/reticulum/src/packet/filter.zig:158in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1610-1613_rejects_group_announces[function] — test source atlib/reticulum/src/packet/filter.zig:165in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1615_admits_unseen_packets[function] — test source atlib/reticulum/src/packet/filter.zig:172in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1617-1619_readmits_single_announces[function] — test source atlib/reticulum/src/packet/filter.zig:176in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1617-1623_rejects_other_duplicate_announces[function] — test source atlib/reticulum/src/packet/filter.zig:182in nearest public ownertiny.reticulum.packet.filterlib.reticulum.src.packet.filter.test_Reticulum@1.5.0_RNS/Transport.py:1625-1626_rejects_other_duplicates[function] — test source atlib/reticulum/src/packet/filter.zig:189in nearest public ownertiny.reticulum.packet.filter
Audit
| Definitions | 3 |
|---|---|
| Public names | 3 |
| Members | 2 |
| Version | 26.7.0 |
| Revision | daab053ee433 |