Skip to content

Commit 20348a6

Browse files
committedDec 20, 2016
Implement TCP representation printing.
1 parent 5a85a5c commit 20348a6

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed
 

‎src/wire/ipv4.rs

+2
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,8 @@ impl<T: AsRef<[u8]>> PrettyPrint for Packet<T> {
482482
super::Icmpv4Packet::<&[u8]>::pretty_print(&packet.payload(), f, indent),
483483
ProtocolType::Udp =>
484484
super::UdpPacket::<&[u8]>::pretty_print(&packet.payload(), f, indent),
485+
ProtocolType::Tcp =>
486+
super::TcpPacket::<&[u8]>::pretty_print(&packet.payload(), f, indent),
485487
_ => Ok(())
486488
}
487489
}

‎src/wire/tcp.rs

+60-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use core::fmt;
12
use byteorder::{ByteOrder, NetworkEndian};
23

34
use Error;
@@ -389,10 +390,10 @@ impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> Packet<&'a mut T> {
389390
pub struct Repr<'a> {
390391
src_port: u16,
391392
dst_port: u16,
393+
control: Control,
392394
seq_number: u32,
393395
ack_number: Option<u32>,
394396
window_len: u16,
395-
control: Control,
396397
payload: &'a [u8]
397398
}
398399

@@ -438,10 +439,10 @@ impl<'a> Repr<'a> {
438439
Ok(Repr {
439440
src_port: packet.src_port(),
440441
dst_port: packet.dst_port(),
442+
control: control,
441443
seq_number: packet.seq_number(),
442444
ack_number: ack_number,
443445
window_len: packet.window_len(),
444-
control: control,
445446
payload: packet.payload()
446447
})
447448
}
@@ -474,6 +475,63 @@ impl<'a> Repr<'a> {
474475
}
475476
}
476477

478+
impl<'a, T: AsRef<[u8]> + ?Sized> fmt::Display for Packet<&'a T> {
479+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
480+
// Cannot use Repr::parse because we don't have the IP addresses.
481+
try!(write!(f, "TCP src={} dst={}",
482+
self.src_port(), self.dst_port()));
483+
if self.syn() { try!(write!(f, " syn")) }
484+
if self.fin() { try!(write!(f, " fin")) }
485+
if self.rst() { try!(write!(f, " rst")) }
486+
if self.psh() { try!(write!(f, " psh")) }
487+
if self.ece() { try!(write!(f, " ece")) }
488+
if self.cwr() { try!(write!(f, " cwr")) }
489+
if self.ns() { try!(write!(f, " ns" )) }
490+
try!(write!(f, " seq={}", self.seq_number()));
491+
if self.ack() {
492+
try!(write!(f, " ack={}", self.ack_number()));
493+
}
494+
try!(write!(f, " win={}", self.window_len()));
495+
if self.urg() {
496+
try!(write!(f, " urg={}", self.urgent_at()))
497+
}
498+
try!(write!(f, " len={}", self.payload().len()));
499+
Ok(())
500+
}
501+
}
502+
503+
impl<'a> fmt::Display for Repr<'a> {
504+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
505+
try!(write!(f, "TCP src={} dst={} ",
506+
self.src_port, self.dst_port));
507+
match self.control {
508+
Control::Syn => try!(write!(f, " syn")),
509+
Control::Fin => try!(write!(f, " fin")),
510+
Control::Rst => try!(write!(f, " rst")),
511+
Control::None => ()
512+
}
513+
try!(write!(f, " seq={}", self.seq_number));
514+
if let Some(ack_number) = self.ack_number {
515+
try!(write!(f, " ack={}", ack_number));
516+
}
517+
try!(write!(f, " win={}", self.window_len));
518+
try!(write!(f, " len={}", self.payload.len()));
519+
Ok(())
520+
}
521+
}
522+
523+
use super::pretty_print::{PrettyPrint, PrettyIndent};
524+
525+
impl<T: AsRef<[u8]>> PrettyPrint for Packet<T> {
526+
fn pretty_print(buffer: &AsRef<[u8]>, f: &mut fmt::Formatter,
527+
indent: &mut PrettyIndent) -> fmt::Result {
528+
match Packet::new(buffer) {
529+
Err(err) => write!(f, "{}({})\n", indent, err),
530+
Ok(packet) => write!(f, "{}{}\n", indent, packet)
531+
}
532+
}
533+
}
534+
477535
#[cfg(test)]
478536
mod test {
479537
use wire::Ipv4Address;

0 commit comments

Comments
 (0)
Please sign in to comment.