Implement TCP representation printing.
This commit is contained in:
parent
513923725e
commit
3d5f47b89f
|
@ -482,6 +482,8 @@ impl<T: AsRef<[u8]>> PrettyPrint for Packet<T> {
|
||||||
super::Icmpv4Packet::<&[u8]>::pretty_print(&packet.payload(), f, indent),
|
super::Icmpv4Packet::<&[u8]>::pretty_print(&packet.payload(), f, indent),
|
||||||
ProtocolType::Udp =>
|
ProtocolType::Udp =>
|
||||||
super::UdpPacket::<&[u8]>::pretty_print(&packet.payload(), f, indent),
|
super::UdpPacket::<&[u8]>::pretty_print(&packet.payload(), f, indent),
|
||||||
|
ProtocolType::Tcp =>
|
||||||
|
super::TcpPacket::<&[u8]>::pretty_print(&packet.payload(), f, indent),
|
||||||
_ => Ok(())
|
_ => Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use core::fmt;
|
||||||
use byteorder::{ByteOrder, NetworkEndian};
|
use byteorder::{ByteOrder, NetworkEndian};
|
||||||
|
|
||||||
use Error;
|
use Error;
|
||||||
|
@ -389,10 +390,10 @@ impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> Packet<&'a mut T> {
|
||||||
pub struct Repr<'a> {
|
pub struct Repr<'a> {
|
||||||
src_port: u16,
|
src_port: u16,
|
||||||
dst_port: u16,
|
dst_port: u16,
|
||||||
|
control: Control,
|
||||||
seq_number: u32,
|
seq_number: u32,
|
||||||
ack_number: Option<u32>,
|
ack_number: Option<u32>,
|
||||||
window_len: u16,
|
window_len: u16,
|
||||||
control: Control,
|
|
||||||
payload: &'a [u8]
|
payload: &'a [u8]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,10 +439,10 @@ impl<'a> Repr<'a> {
|
||||||
Ok(Repr {
|
Ok(Repr {
|
||||||
src_port: packet.src_port(),
|
src_port: packet.src_port(),
|
||||||
dst_port: packet.dst_port(),
|
dst_port: packet.dst_port(),
|
||||||
|
control: control,
|
||||||
seq_number: packet.seq_number(),
|
seq_number: packet.seq_number(),
|
||||||
ack_number: ack_number,
|
ack_number: ack_number,
|
||||||
window_len: packet.window_len(),
|
window_len: packet.window_len(),
|
||||||
control: control,
|
|
||||||
payload: packet.payload()
|
payload: packet.payload()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -474,6 +475,63 @@ impl<'a> Repr<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, T: AsRef<[u8]> + ?Sized> fmt::Display for Packet<&'a T> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
// Cannot use Repr::parse because we don't have the IP addresses.
|
||||||
|
try!(write!(f, "TCP src={} dst={}",
|
||||||
|
self.src_port(), self.dst_port()));
|
||||||
|
if self.syn() { try!(write!(f, " syn")) }
|
||||||
|
if self.fin() { try!(write!(f, " fin")) }
|
||||||
|
if self.rst() { try!(write!(f, " rst")) }
|
||||||
|
if self.psh() { try!(write!(f, " psh")) }
|
||||||
|
if self.ece() { try!(write!(f, " ece")) }
|
||||||
|
if self.cwr() { try!(write!(f, " cwr")) }
|
||||||
|
if self.ns() { try!(write!(f, " ns" )) }
|
||||||
|
try!(write!(f, " seq={}", self.seq_number()));
|
||||||
|
if self.ack() {
|
||||||
|
try!(write!(f, " ack={}", self.ack_number()));
|
||||||
|
}
|
||||||
|
try!(write!(f, " win={}", self.window_len()));
|
||||||
|
if self.urg() {
|
||||||
|
try!(write!(f, " urg={}", self.urgent_at()))
|
||||||
|
}
|
||||||
|
try!(write!(f, " len={}", self.payload().len()));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> fmt::Display for Repr<'a> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
try!(write!(f, "TCP src={} dst={} ",
|
||||||
|
self.src_port, self.dst_port));
|
||||||
|
match self.control {
|
||||||
|
Control::Syn => try!(write!(f, " syn")),
|
||||||
|
Control::Fin => try!(write!(f, " fin")),
|
||||||
|
Control::Rst => try!(write!(f, " rst")),
|
||||||
|
Control::None => ()
|
||||||
|
}
|
||||||
|
try!(write!(f, " seq={}", self.seq_number));
|
||||||
|
if let Some(ack_number) = self.ack_number {
|
||||||
|
try!(write!(f, " ack={}", ack_number));
|
||||||
|
}
|
||||||
|
try!(write!(f, " win={}", self.window_len));
|
||||||
|
try!(write!(f, " len={}", self.payload.len()));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
use super::pretty_print::{PrettyPrint, PrettyIndent};
|
||||||
|
|
||||||
|
impl<T: AsRef<[u8]>> PrettyPrint for Packet<T> {
|
||||||
|
fn pretty_print(buffer: &AsRef<[u8]>, f: &mut fmt::Formatter,
|
||||||
|
indent: &mut PrettyIndent) -> fmt::Result {
|
||||||
|
match Packet::new(buffer) {
|
||||||
|
Err(err) => write!(f, "{}({})\n", indent, err),
|
||||||
|
Ok(packet) => write!(f, "{}{}\n", indent, packet)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use wire::Ipv4Address;
|
use wire::Ipv4Address;
|
||||||
|
|
Loading…
Reference in New Issue