|
| 1 | +use core::fmt; |
1 | 2 | use byteorder::{ByteOrder, NetworkEndian};
|
2 | 3 |
|
3 | 4 | use Error;
|
@@ -389,10 +390,10 @@ impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> Packet<&'a mut T> {
|
389 | 390 | pub struct Repr<'a> {
|
390 | 391 | src_port: u16,
|
391 | 392 | dst_port: u16,
|
| 393 | + control: Control, |
392 | 394 | seq_number: u32,
|
393 | 395 | ack_number: Option<u32>,
|
394 | 396 | window_len: u16,
|
395 |
| - control: Control, |
396 | 397 | payload: &'a [u8]
|
397 | 398 | }
|
398 | 399 |
|
@@ -438,10 +439,10 @@ impl<'a> Repr<'a> {
|
438 | 439 | Ok(Repr {
|
439 | 440 | src_port: packet.src_port(),
|
440 | 441 | dst_port: packet.dst_port(),
|
| 442 | + control: control, |
441 | 443 | seq_number: packet.seq_number(),
|
442 | 444 | ack_number: ack_number,
|
443 | 445 | window_len: packet.window_len(),
|
444 |
| - control: control, |
445 | 446 | payload: packet.payload()
|
446 | 447 | })
|
447 | 448 | }
|
@@ -474,6 +475,63 @@ impl<'a> Repr<'a> {
|
474 | 475 | }
|
475 | 476 | }
|
476 | 477 |
|
| 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 | + |
477 | 535 | #[cfg(test)]
|
478 | 536 | mod test {
|
479 | 537 | use wire::Ipv4Address;
|
|
0 commit comments