pub struct PcapSink<W> { /* private fields */ }Expand description
A pcap stream framer that writes captured packets to a writer in Go-Tailscale-faithful classic
pcap (USER0 link type + a 4-byte path preamble per record). Construct with PcapSink::new
(which emits the global header), then call PcapSink::log_packet per packet.
Records are not flushed per packet (that would be a syscall on every packet on the single
dataplane thread). For buffering, wrap writer in a std::io::BufWriter; buffered records are
flushed when the writer is dropped (on capture stop), or call PcapSink::flush periodically if
a reader needs to tail the stream promptly.
Implementations§
Source§impl<W: Write> PcapSink<W>
impl<W: Write> PcapSink<W>
Sourcepub fn new(writer: W) -> Result<Self>
pub fn new(writer: W) -> Result<Self>
Create a sink and immediately write the 24-byte pcap global header.
Sourcepub fn log_packet(&mut self, path_code: u16, pkt: &[u8]) -> Result<()>
pub fn log_packet(&mut self, path_code: u16, pkt: &[u8]) -> Result<()>
Frame and write one captured packet: the 16-byte record header, the 4-byte Tailscale path preamble, then the raw IP bytes. The timestamp is taken from the system clock now.
Sourcepub fn flush(&mut self) -> Result<()>
pub fn flush(&mut self) -> Result<()>
Flush the underlying writer. Optional: callers that need a reader tailing the stream (e.g.
tcpdump -r on a growing file, or a live pipe) to see packets promptly can call this
periodically — it is not called per record, so the hot path stays syscall-free. Buffered
records are otherwise flushed when the writer is dropped on capture stop.
Auto Trait Implementations§
impl<W> Freeze for PcapSink<W>where
W: Freeze,
impl<W> RefUnwindSafe for PcapSink<W>where
W: RefUnwindSafe,
impl<W> Send for PcapSink<W>where
W: Send,
impl<W> Sync for PcapSink<W>where
W: Sync,
impl<W> Unpin for PcapSink<W>where
W: Unpin,
impl<W> UnsafeUnpin for PcapSink<W>where
W: UnsafeUnpin,
impl<W> UnwindSafe for PcapSink<W>where
W: UnwindSafe,
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
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<A, T> DynMessage<A> for T
impl<A, T> DynMessage<A> for T
Source§fn handle_dyn<'a>(
self: Box<T>,
state: &'a mut A,
actor_ref: ActorRef<A>,
tx: Option<Sender<Result<Box<dyn Any + Send>, SendError<Box<dyn Any + Send>, Box<dyn Any + Send>>>>>,
stop: &'a mut bool,
) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn ReplyError>>> + Send + 'a>>
fn handle_dyn<'a>( self: Box<T>, state: &'a mut A, actor_ref: ActorRef<A>, tx: Option<Sender<Result<Box<dyn Any + Send>, SendError<Box<dyn Any + Send>, Box<dyn Any + Send>>>>>, stop: &'a mut bool, ) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn ReplyError>>> + Send + 'a>>
impl<T> ErasedDestructor for Twhere
T: 'static,
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