Skip to documentation
SLOP

tiny.reticulum.packet.filter

Reference tiny.reticulum packet filter

Defined in packet.

API (2)

Actions

Public operations.

Types and contracts

Public types and contracts.

No direct callersNo direct callspacketfilter
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Called byCallsnode.inboundrunprivate sourcelib.reticulum.src.packet.filterexpectContexttest sourcelib.reticulum.src.packet.filter.test_Reticulu...py:1576-1580 admits its transporttest sourcelib.reticulum.src.packet.filter.test_Reticulu...py:1576-1580 rejects another transporttest sourcelib.reticulum.src.packet.filter.test_Reticulu...py:1577 lets announces cross transpor...+10 moreprivate sourcelib.reticulum.src.packet.filtercontextPassthroughpacket.filteradmit
Static calls · unresolved targets: 0 · external targets: 0.

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.

Audit

Definitions3
Public names3
Members2
Version26.7.0
Revisiondaab053ee433