pub struct InboundResult {
pub to_local: HashMap<OverlayTransportId, Vec<PacketMut>>,
pub to_peers: HashMap<(UnderlayTransportId, PeerId), Vec<PacketMut>>,
pub learned_disco_keys: Vec<(PeerId, DiscoKeyAdvertisement)>,
pub rejected_flows: Vec<(PeerId, TailscaleRejectedHeader)>,
}Expand description
The result of processing inbound packets.
Fields§
§to_local: HashMap<OverlayTransportId, Vec<PacketMut>>Decrypted packets to be delivered to overlay transports.
to_peers: HashMap<(UnderlayTransportId, PeerId), Vec<PacketMut>>Encrypted packets to be sent to wireguard peers by the underlay.
learned_disco_keys: Vec<(PeerId, DiscoKeyAdvertisement)>Disco keys peers advertised over TSMP in this batch, each paired with the WireGuard peer
whose session carried it (Go tstun.Wrapper publishing events.PeerDiscoKeyUpdate, which
wgengine turns into a magicsock.Conn.HandleDiscoKeyAdvertisement call).
The advertisement packets themselves are dropped: they are inter-node control messages, not traffic for the local stack. Zero keys are already filtered out. Empty for a batch that carried none, which is the overwhelmingly common case.
rejected_flows: Vec<(PeerId, TailscaleRejectedHeader)>Connections peers refused, as they told us over TSMP (Go packet.TailscaleRejectedHeader,
which wgengine.userspaceEngine.trackOpenPreFilterIn matches against its pending-open
flows), each paired with the WireGuard peer whose session carried it.
This engine is always the dialing client, so this is the answer to a connection this node
opened: without it a dial into a peer’s ACL drop waits out a TCP timeout with no reason
available anywhere. src is this node’s own address and ephemeral port and dst is the
peer’s, so an embedder can match the message against the flow it opened;
maybe_broken says whether the
refusal is terminal.
The messages themselves are dropped rather than delivered — they are inter-node control messages, and the local stack has no handler for IP protocol 99. Empty for a batch that carried none, which is the overwhelmingly common case.
Auto Trait Implementations§
impl Freeze for InboundResult
impl RefUnwindSafe for InboundResult
impl Send for InboundResult
impl Sync for InboundResult
impl Unpin for InboundResult
impl UnsafeUnpin for InboundResult
impl UnwindSafe for InboundResult
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more